@@ -183,15 +183,12 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
183
183
QStringList myScales = QgsProject::instance ()->readListEntry ( " Scales" , " /ScalesList" );
184
184
if ( !myScales.isEmpty () )
185
185
{
186
- QStringList::const_iterator scaleIt = myScales.constBegin ();
187
- for ( ; scaleIt != myScales.constEnd (); ++scaleIt )
186
+ Q_FOREACH ( const QString& scale, myScales )
188
187
{
189
- QListWidgetItem* newItem = new QListWidgetItem ( lstScales );
190
- newItem->setText ( *scaleIt );
191
- newItem->setFlags ( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable );
192
- lstScales->addItem ( newItem );
188
+ addScaleToScaleList ( scale );
193
189
}
194
190
}
191
+ connect ( lstScales, SIGNAL ( itemChanged ( QListWidgetItem* ) ), this , SLOT ( scaleItemChanged ( QListWidgetItem* ) ) );
195
192
196
193
grpProjectScales->setChecked ( QgsProject::instance ()->readBoolEntry ( " Scales" , " /useProjectScales" ) );
197
194
@@ -1362,10 +1359,7 @@ void QgsProjectProperties::on_pbnAddScale_clicked()
1362
1359
1363
1360
if ( myScale != -1 )
1364
1361
{
1365
- QListWidgetItem* newItem = new QListWidgetItem ( lstScales );
1366
- newItem->setText ( QString ( " 1:%1" ).arg ( myScale ) );
1367
- newItem->setFlags ( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable );
1368
- lstScales->addItem ( newItem );
1362
+ QListWidgetItem* newItem = addScaleToScaleList ( QString ( " 1:%1" ).arg ( myScale ) );
1369
1363
lstScales->setCurrentItem ( newItem );
1370
1364
}
1371
1365
}
@@ -1393,13 +1387,9 @@ void QgsProjectProperties::on_pbnImportScales_clicked()
1393
1387
QgsDebugMsg ( msg );
1394
1388
}
1395
1389
1396
- QStringList::const_iterator scaleIt = myScales.constBegin ();
1397
- for ( ; scaleIt != myScales.constEnd (); ++scaleIt )
1390
+ Q_FOREACH ( const QString& scale, myScales )
1398
1391
{
1399
- QListWidgetItem* newItem = new QListWidgetItem ( lstScales );
1400
- newItem->setText ( *scaleIt );
1401
- newItem->setFlags ( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable );
1402
- lstScales->addItem ( newItem );
1392
+ addScaleToScaleList ( scale );
1403
1393
}
1404
1394
}
1405
1395
@@ -1826,3 +1816,54 @@ void QgsProjectProperties::on_mButtonExportColors_clicked()
1826
1816
return ;
1827
1817
}
1828
1818
}
1819
+
1820
+ QListWidgetItem* QgsProjectProperties::addScaleToScaleList ( const QString &newScale )
1821
+ {
1822
+ // TODO QGIS3: Rework the scale list widget to be a reusable piece of code, see PR #2558
1823
+ QListWidgetItem* newItem = new QListWidgetItem ( newScale );
1824
+ addScaleToScaleList ( newItem );
1825
+ return newItem;
1826
+ }
1827
+
1828
+ void QgsProjectProperties::addScaleToScaleList ( QListWidgetItem* newItem )
1829
+ {
1830
+ // If the new scale already exists, delete it.
1831
+ QListWidgetItem* duplicateItem = lstScales->findItems ( newItem->text (), Qt::MatchExactly ).value ( 0 );
1832
+ delete duplicateItem;
1833
+
1834
+ int newDenominator = newItem->text ().split ( " :" ).value ( 1 ).toInt ();
1835
+ int i;
1836
+ for ( i = 0 ; i < lstScales->count (); i++ )
1837
+ {
1838
+ int denominator = lstScales->item ( i )->text ().split ( " :" ).value ( 1 ).toInt ();
1839
+ if ( newDenominator > denominator )
1840
+ break ;
1841
+ }
1842
+
1843
+ newItem->setData ( Qt::UserRole, newItem->text () );
1844
+ newItem->setFlags ( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable );
1845
+ lstScales->insertItem ( i, newItem );
1846
+ }
1847
+
1848
+ void QgsProjectProperties::scaleItemChanged ( QListWidgetItem* changedScaleItem )
1849
+ {
1850
+ // Check if the new value is valid, restore the old value if not.
1851
+ QRegExp regExp ( " 1:0*[1-9]\\ d*" );
1852
+ if ( regExp.exactMatch ( changedScaleItem->text () ) )
1853
+ {
1854
+ // Remove leading zeroes from the denominator
1855
+ regExp.setPattern ( " 1:0*" );
1856
+ changedScaleItem->setText ( changedScaleItem->text ().replace ( regExp, " 1:" ) );
1857
+ }
1858
+ else
1859
+ {
1860
+ QMessageBox::warning ( this , tr ( " Invalid scale" ), tr ( " The text you entered is not a valid scale." ) );
1861
+ changedScaleItem->setText ( changedScaleItem->data ( Qt::UserRole ).toString () );
1862
+ }
1863
+
1864
+ // Take the changed item out of the list and re-add it. This keeps things ordered and creates correct meta-data for the changed item.
1865
+ int row = lstScales->row ( changedScaleItem );
1866
+ lstScales->takeItem ( row );
1867
+ addScaleToScaleList ( changedScaleItem );
1868
+ lstScales->setCurrentItem ( changedScaleItem );
1869
+ }
0 commit comments