Skip to content

Commit edea51b

Browse files
committed
Improve handling of scales in project properties dialog
* avoid duplicate scales * reject invalid scales * keep list of scales always sorted Added QGIS 3.0 TODO marker for reworking the scales list widget.
1 parent 4921d9e commit edea51b

File tree

2 files changed

+66
-16
lines changed

2 files changed

+66
-16
lines changed

src/app/qgsprojectproperties.cpp

+57-16
Original file line numberDiff line numberDiff line change
@@ -183,15 +183,12 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
183183
QStringList myScales = QgsProject::instance()->readListEntry( "Scales", "/ScalesList" );
184184
if ( !myScales.isEmpty() )
185185
{
186-
QStringList::const_iterator scaleIt = myScales.constBegin();
187-
for ( ; scaleIt != myScales.constEnd(); ++scaleIt )
186+
Q_FOREACH ( const QString& scale, myScales )
188187
{
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 );
193189
}
194190
}
191+
connect( lstScales, SIGNAL( itemChanged( QListWidgetItem* ) ), this, SLOT( scaleItemChanged( QListWidgetItem* ) ) );
195192

196193
grpProjectScales->setChecked( QgsProject::instance()->readBoolEntry( "Scales", "/useProjectScales" ) );
197194

@@ -1362,10 +1359,7 @@ void QgsProjectProperties::on_pbnAddScale_clicked()
13621359

13631360
if ( myScale != -1 )
13641361
{
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 ) );
13691363
lstScales->setCurrentItem( newItem );
13701364
}
13711365
}
@@ -1393,13 +1387,9 @@ void QgsProjectProperties::on_pbnImportScales_clicked()
13931387
QgsDebugMsg( msg );
13941388
}
13951389

1396-
QStringList::const_iterator scaleIt = myScales.constBegin();
1397-
for ( ; scaleIt != myScales.constEnd(); ++scaleIt )
1390+
Q_FOREACH ( const QString& scale, myScales )
13981391
{
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 );
14031393
}
14041394
}
14051395

@@ -1826,3 +1816,54 @@ void QgsProjectProperties::on_mButtonExportColors_clicked()
18261816
return;
18271817
}
18281818
}
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+
}

src/app/qgsprojectproperties.h

+9
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
9090
/** Let the user load scales from file */
9191
void on_pbnExportScales_clicked();
9292

93+
/** A scale in the list of project scales changed */
94+
void scaleItemChanged( QListWidgetItem* changedScaleItem );
95+
9396
/*!
9497
* Slots for WMS project settings
9598
*/
@@ -208,6 +211,12 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
208211
//! Populates list with ellipsoids from Sqlite3 db
209212
void populateEllipsoidList();
210213

214+
//! Create a new scale item and add it to the list of scales
215+
QListWidgetItem* addScaleToScaleList( const QString &newScale );
216+
217+
//! Add a scale item to the list of scales
218+
void addScaleToScaleList( QListWidgetItem* newItem );
219+
211220
static const char * GEO_NONE_DESC;
212221

213222
};

0 commit comments

Comments
 (0)