Skip to content

Commit 0035b7c

Browse files
committedOct 29, 2018
Avoid creating temporary project properties and options dialogs
for locator filter This is expensive and results in a lengthy delay when first using the locator in a QGIS session. Replace with an alternative approach which doesn't rely on creation of temporary dialogs, yet should still ensure that these dialogs don't go out of sync with the locator.
1 parent 1dd36f1 commit 0035b7c

File tree

7 files changed

+109
-55
lines changed

7 files changed

+109
-55
lines changed
 

‎src/app/locator/qgsinbuiltlocatorfilters.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ void QgsActiveLayerFeaturesLocatorFilter::prepare( const QString &string, const
235235
}
236236
else if ( allowNumeric && field.isNumeric() )
237237
{
238-
expressionParts << QStringLiteral( "%1 = %2" ).arg( QgsExpression::quotedColumnRef( field.name() ) ).arg( QString::number( numericalValue, 'g', 17 ) );
238+
expressionParts << QStringLiteral( "%1 = %2" ).arg( QgsExpression::quotedColumnRef( field.name() ), QString::number( numericalValue, 'g', 17 ) );
239239
}
240240
}
241241

@@ -352,8 +352,8 @@ void QgsAllLayersFeaturesLocatorFilter::prepare( const QString &string, const Qg
352352
if ( !expression.needsGeometry() )
353353
req.setFlags( QgsFeatureRequest::NoGeometry );
354354
req.setFilterExpression( QStringLiteral( "%1 ILIKE '%%2%'" )
355-
.arg( layer->displayExpression() )
356-
.arg( string ) );
355+
.arg( layer->displayExpression(),
356+
string ) );
357357
req.setLimit( 30 );
358358

359359
PreparedLayer preparedLayer;
@@ -474,13 +474,13 @@ void QgsSettingsLocatorFilter::fetchResults( const QString &string, const QgsLoc
474474
{
475475
QMap<QString, QMap<QString, QString>> matchingSettingsPagesMap;
476476

477-
QMap<QString, QString> optionsPagesMap = QgisApp::instance()->optionsPagesMap();
477+
QMap<QString, int > optionsPagesMap = QgisApp::instance()->optionsPagesMap();
478478
for ( auto optionsPagesIterator = optionsPagesMap.constBegin(); optionsPagesIterator != optionsPagesMap.constEnd(); ++optionsPagesIterator )
479479
{
480480
QString title = optionsPagesIterator.key();
481481
if ( stringMatches( title, string ) || ( context.usingPrefix && string.isEmpty() ) )
482482
{
483-
matchingSettingsPagesMap.insert( title + " (" + tr( "Options" ) + ")", settingsPage( QStringLiteral( "optionpage" ), optionsPagesIterator.value() ) );
483+
matchingSettingsPagesMap.insert( title + " (" + tr( "Options" ) + ")", settingsPage( QStringLiteral( "optionpage" ), QString::number( optionsPagesIterator.value() ) ) );
484484
}
485485
}
486486

@@ -534,7 +534,8 @@ void QgsSettingsLocatorFilter::triggerResult( const QgsLocatorResult &result )
534534

535535
if ( type == QLatin1String( "optionpage" ) )
536536
{
537-
QgisApp::instance()->showOptionsDialog( QgisApp::instance(), page );
537+
const int pageNumber = page.toInt();
538+
QgisApp::instance()->showOptionsDialog( QgisApp::instance(), QString(), pageNumber );
538539
}
539540
else if ( type == QLatin1String( "projectpropertypage" ) )
540541
{

‎src/app/qgisapp.cpp

Lines changed: 66 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10296,12 +10296,22 @@ void QgisApp::options()
1029610296

1029710297
QMap< QString, QString > QgisApp::projectPropertiesPagesMap()
1029810298
{
10299-
if ( mProjectPropertiesPagesMap.isEmpty() )
10300-
{
10301-
std::unique_ptr< QgsProjectProperties > pp( new QgsProjectProperties( mMapCanvas, this ) );
10302-
mProjectPropertiesPagesMap = pp->pageWidgetNameMap();
10303-
}
10304-
return mProjectPropertiesPagesMap;
10299+
static QMap< QString, QString > sProjectPropertiesPagesMap;
10300+
static std::once_flag initialized;
10301+
std::call_once( initialized, []
10302+
{
10303+
sProjectPropertiesPagesMap.insert( tr( "General" ), QStringLiteral( "mProjOptsGeneral" ) );
10304+
sProjectPropertiesPagesMap.insert( tr( "Metadata" ), QStringLiteral( "mMetadataPage" ) );
10305+
sProjectPropertiesPagesMap.insert( tr( "CRS" ), QStringLiteral( "mProjOptsCRS" ) );
10306+
sProjectPropertiesPagesMap.insert( tr( "Default Styles" ), QStringLiteral( "mProjOptsSymbols" ) );
10307+
sProjectPropertiesPagesMap.insert( tr( "Data Sources" ), QStringLiteral( "mTab_DataSources" ) );
10308+
sProjectPropertiesPagesMap.insert( tr( "Relations" ), QStringLiteral( "mTabRelations" ) );
10309+
sProjectPropertiesPagesMap.insert( tr( "Variables" ), QStringLiteral( "mTab_Variables" ) );
10310+
sProjectPropertiesPagesMap.insert( tr( "Macros" ), QStringLiteral( "mProjOptsMacros" ) );
10311+
sProjectPropertiesPagesMap.insert( tr( "QGIS Server" ), QStringLiteral( "mProjOptsOWS" ) );
10312+
} );
10313+
10314+
return sProjectPropertiesPagesMap;
1030510315
}
1030610316

1030710317
void QgisApp::showProjectProperties( const QString &page )
@@ -10311,14 +10321,17 @@ void QgisApp::showProjectProperties( const QString &page )
1031110321

1031210322
QMap< QString, QString > QgisApp::settingPagesMap()
1031310323
{
10314-
if ( mSettingPagesMap.isEmpty() )
10324+
static QMap< QString, QString > sSettingPagesMap;
10325+
static std::once_flag initialized;
10326+
std::call_once( initialized, []
1031510327
{
10316-
mSettingPagesMap.insert( tr( "Style Manager" ), QStringLiteral( "stylemanager" ) );
10317-
mSettingPagesMap.insert( tr( "Keyboard Shortcuts" ), QStringLiteral( "shortcuts" ) );
10318-
mSettingPagesMap.insert( tr( "Custom Projections" ), QStringLiteral( "customprojection" ) );
10319-
mSettingPagesMap.insert( tr( "Interface Customization" ), QStringLiteral( "customize" ) );
10320-
}
10321-
return mSettingPagesMap;
10328+
sSettingPagesMap.insert( tr( "Style Manager" ), QStringLiteral( "stylemanager" ) );
10329+
sSettingPagesMap.insert( tr( "Keyboard Shortcuts" ), QStringLiteral( "shortcuts" ) );
10330+
sSettingPagesMap.insert( tr( "Custom Projections" ), QStringLiteral( "customprojection" ) );
10331+
sSettingPagesMap.insert( tr( "Interface Customization" ), QStringLiteral( "customize" ) );
10332+
} );
10333+
10334+
return sSettingPagesMap;
1032210335
}
1032310336

1032410337
void QgisApp::showSettings( const QString &page )
@@ -10341,21 +10354,44 @@ void QgisApp::showSettings( const QString &page )
1034110354
}
1034210355
}
1034310356

10344-
QMap< QString, QString > QgisApp::optionsPagesMap()
10345-
{
10346-
if ( mOptionsPagesMap.isEmpty() )
10357+
QMap< QString, int > QgisApp::optionsPagesMap()
10358+
{
10359+
static QMap< QString, int > sOptionsPagesMap;
10360+
static std::once_flag initialized;
10361+
std::call_once( initialized, []
10362+
{
10363+
sOptionsPagesMap.insert( tr( "General" ), 0 );
10364+
sOptionsPagesMap.insert( tr( "System" ), 1 );
10365+
sOptionsPagesMap.insert( tr( "CRS" ), 2 );
10366+
sOptionsPagesMap.insert( tr( "Data Sources" ), 3 );
10367+
sOptionsPagesMap.insert( tr( "Rendering" ), 4 );
10368+
sOptionsPagesMap.insert( tr( "Canvas & Legend" ), 5 );
10369+
sOptionsPagesMap.insert( tr( "Map Tools" ), 6 );
10370+
sOptionsPagesMap.insert( tr( "Colors" ), 7 );
10371+
sOptionsPagesMap.insert( tr( "Digitizing" ), 8 );
10372+
sOptionsPagesMap.insert( tr( "Layouts" ), 9 );
10373+
sOptionsPagesMap.insert( tr( "GDAL" ), 10 );
10374+
sOptionsPagesMap.insert( tr( "Variables" ), 11 );
10375+
sOptionsPagesMap.insert( tr( "Authentication" ), 12 );
10376+
sOptionsPagesMap.insert( tr( "Network" ), 13 );
10377+
sOptionsPagesMap.insert( tr( "Locator" ), 14 );
10378+
sOptionsPagesMap.insert( tr( "Advanced" ), 15 );
10379+
sOptionsPagesMap.insert( tr( "Acceleration" ), 16 );
10380+
} );
10381+
10382+
QMap< QString, int > map = sOptionsPagesMap;
10383+
int idx = map.count();
10384+
for ( const QPointer< QgsOptionsWidgetFactory > &f : qgis::as_const( mOptionsWidgetFactories ) )
1034710385
{
10348-
QList< QgsOptionsWidgetFactory * > factories;
10349-
Q_FOREACH ( const QPointer< QgsOptionsWidgetFactory > &f, mOptionsWidgetFactories )
10386+
// remove any deleted factories
10387+
if ( f )
1035010388
{
10351-
// remove any deleted factories
10352-
if ( f )
10353-
factories << f;
10389+
map.insert( f->title(), idx );
1035410390
}
10355-
std::unique_ptr< QgsOptions > f( new QgsOptions( this, QgsGuiUtils::ModalDialogFlags, factories ) );
10356-
mOptionsPagesMap = f->pageWidgetNameMap();
10391+
idx++;
1035710392
}
10358-
return mOptionsPagesMap;
10393+
10394+
return map;
1035910395
}
1036010396

1036110397
QgsOptions *QgisApp::createOptionsDialog( QWidget *parent )
@@ -10370,7 +10406,7 @@ QgsOptions *QgisApp::createOptionsDialog( QWidget *parent )
1037010406
return new QgsOptions( parent, QgsGuiUtils::ModalDialogFlags, factories );
1037110407
}
1037210408

10373-
void QgisApp::showOptionsDialog( QWidget *parent, const QString &currentPage )
10409+
void QgisApp::showOptionsDialog( QWidget *parent, const QString &currentPage, int pageNumber )
1037410410
{
1037510411
std::unique_ptr< QgsOptions > optionsDialog( createOptionsDialog( parent ) );
1037610412

@@ -10382,6 +10418,11 @@ void QgisApp::showOptionsDialog( QWidget *parent, const QString &currentPage )
1038210418
optionsDialog->setCurrentPage( currentPage );
1038310419
}
1038410420

10421+
if ( pageNumber >= 0 )
10422+
{
10423+
optionsDialog->setCurrentPage( pageNumber );
10424+
}
10425+
1038510426
if ( optionsDialog->exec() )
1038610427
{
1038710428
QgsProject::instance()->layerTreeRegistryBridge()->setNewLayersVisible( mySettings.value( QStringLiteral( "qgis/new_layers_visible" ), true ).toBool() );

‎src/app/qgisapp.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -959,7 +959,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
959959
* Settings pages section
960960
*/
961961
//! Gets map of option pages
962-
QMap< QString, QString > optionsPagesMap();
962+
QMap<QString, int> optionsPagesMap();
963963
//! Gets map of project property pages
964964
QMap< QString, QString > projectPropertiesPagesMap();
965965
//! Gets map of setting pages
@@ -970,7 +970,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
970970
// End Settings pages section
971971

972972
//! Opens the options dialog
973-
void showOptionsDialog( QWidget *parent = nullptr, const QString &currentPage = QString() );
973+
void showOptionsDialog( QWidget *parent = nullptr, const QString &currentPage = QString(), int pageNumber = -1 );
974974

975975
/**
976976
* Refreshes the state of the layer actions toolbar action
@@ -2282,11 +2282,6 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
22822282
QgsFeature duplicateFeatures( QgsMapLayer *mlayer, const QgsFeature &feature );
22832283
QgsFeature duplicateFeatureDigitized( QgsMapLayer *mlayer, const QgsFeature &feature );
22842284

2285-
//! Internal vars supporting Settings Pages function
2286-
QMap< QString, QString > mOptionsPagesMap;
2287-
QMap< QString, QString > mProjectPropertiesPagesMap;
2288-
QMap< QString, QString > mSettingPagesMap;
2289-
22902285
QgsProxyProgressTask *mProjectLoadingProxyTask = nullptr;
22912286

22922287
//! True if we are blocking the activeLayerChanged signal from being emitted

‎src/app/qgsoptions.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,10 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
11281128
connect( mRestoreDefaultWindowStateBtn, &QAbstractButton::clicked, this, &QgsOptions::restoreDefaultWindowState );
11291129

11301130
restoreOptionsBaseUi();
1131+
1132+
#ifdef QGISDEBUG
1133+
checkPageWidgetNameMap();
1134+
#endif
11311135
}
11321136

11331137

@@ -1136,21 +1140,22 @@ QgsOptions::~QgsOptions()
11361140
delete mSettings;
11371141
}
11381142

1139-
QMap< QString, QString > QgsOptions::pageWidgetNameMap()
1143+
void QgsOptions::checkPageWidgetNameMap()
11401144
{
1141-
QMap< QString, QString > pageNames;
1145+
const QMap< QString, int > pageNames = QgisApp::instance()->optionsPagesMap();
1146+
1147+
Q_ASSERT_X( pageNames.count() == mOptionsListWidget->count(), "QgsOptions::checkPageWidgetNameMap()", "QgisApp::optionsPagesMap() is outdated, contains too many entries" );
11421148
for ( int idx = 0; idx < mOptionsListWidget->count(); ++idx )
11431149
{
11441150
QWidget *currentPage = mOptionsStackedWidget->widget( idx );
11451151
QListWidgetItem *item = mOptionsListWidget->item( idx );
11461152
if ( currentPage && item )
11471153
{
1148-
QString title = item->text();
1149-
QString name = currentPage->objectName();
1150-
pageNames.insert( title, name );
1154+
const QString title = item->text();
1155+
Q_ASSERT_X( pageNames.contains( title ), "QgsOptions::checkPageWidgetNameMap()", QStringLiteral( "QgisApp::optionsPagesMap() is outdated, please update. Missing %1" ).arg( title ).toLocal8Bit().constData() );
1156+
Q_ASSERT_X( pageNames.value( title ) == idx, "QgsOptions::checkPageWidgetNameMap()", QStringLiteral( "QgisApp::optionsPagesMap() is outdated, please update. %1 should be %2 not %3" ).arg( title ).arg( idx ).arg( pageNames.value( title ) ).toLocal8Bit().constData() );
11511157
}
11521158
}
1153-
return pageNames;
11541159
}
11551160

11561161
void QgsOptions::setCurrentPage( const QString &pageWidgetName )
@@ -1168,6 +1173,12 @@ void QgsOptions::setCurrentPage( const QString &pageWidgetName )
11681173
}
11691174
}
11701175

1176+
void QgsOptions::setCurrentPage( const int pageNumber )
1177+
{
1178+
if ( pageNumber >= 0 && pageNumber < mOptionsStackedWidget->count() )
1179+
mOptionsStackedWidget->setCurrentIndex( pageNumber );
1180+
}
1181+
11711182
void QgsOptions::mProxyTypeComboBox_currentIndexChanged( int idx )
11721183
{
11731184
frameManualProxy->setEnabled( idx != 0 );

‎src/app/qgsoptions.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ class APP_EXPORT QgsOptions : public QgsOptionsDialogBase, private Ui::QgsOption
6161
*/
6262
void setCurrentPage( const QString &pageWidgetName );
6363

64-
QMap<QString, QString> pageWidgetNameMap();
65-
64+
void setCurrentPage( int pageNumber );
6665

6766
public slots:
6867
void cbxProjectDefaultNew_toggled( bool checked );
@@ -272,6 +271,8 @@ class APP_EXPORT QgsOptions : public QgsOptionsDialogBase, private Ui::QgsOption
272271

273272
void updateActionsForCurrentColorScheme( QgsColorScheme *scheme );
274273

274+
void checkPageWidgetNameMap();
275+
275276
friend class QgsAppScreenShots;
276277
};
277278

‎src/app/qgsprojectproperties.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
850850

851851
// sync metadata title and project title fields
852852
connect( mMetadataWidget, &QgsMetadataWidget::titleChanged, titleEdit, &QLineEdit::setText, Qt::QueuedConnection );
853-
connect( titleEdit, &QLineEdit::textChanged, [ = ] { whileBlocking( mMetadataWidget )->setTitle( title() ) ;} );
853+
connect( titleEdit, &QLineEdit::textChanged, this, [ = ] { whileBlocking( mMetadataWidget )->setTitle( title() ) ;} );
854854

855855
//fill ts language checkbox
856856
QString i18nPath = QgsApplication::i18nPath();
@@ -877,6 +877,10 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
877877
projectionSelectorInitialized();
878878
restoreOptionsBaseUi();
879879
restoreState();
880+
881+
#ifdef QGISDEBUG
882+
checkPageWidgetNameMap();
883+
#endif
880884
}
881885

882886
QgsProjectProperties::~QgsProjectProperties()
@@ -2305,18 +2309,19 @@ void QgsProjectProperties::showHelp()
23052309
QgsHelp::openHelp( link );
23062310
}
23072311

2308-
QMap< QString, QString > QgsProjectProperties::pageWidgetNameMap()
2312+
void QgsProjectProperties::checkPageWidgetNameMap()
23092313
{
2310-
QMap< QString, QString > pageNames;
2314+
const QMap< QString, QString > pageNames = QgisApp::instance()->projectPropertiesPagesMap();
2315+
Q_ASSERT_X( pageNames.count() == mOptionsListWidget->count(), "QgsProjectProperties::checkPageWidgetNameMap()", "QgisApp::projectPropertiesPagesMap() is outdated, contains too many entries" );
23112316
for ( int idx = 0; idx < mOptionsListWidget->count(); ++idx )
23122317
{
23132318
QWidget *currentPage = mOptionsStackedWidget->widget( idx );
23142319
QListWidgetItem *item = mOptionsListWidget->item( idx );
2315-
QString title = item->text();
2316-
QString name = currentPage->objectName();
2317-
pageNames.insert( title, name );
2320+
const QString title = item->text();
2321+
const QString name = currentPage->objectName();
2322+
Q_ASSERT_X( pageNames.contains( title ), "QgsProjectProperties::checkPageWidgetNameMap()", QStringLiteral( "QgisApp::projectPropertiesPagesMap() is outdated, please update. Missing %1" ).arg( title ).toLocal8Bit().constData() );
2323+
Q_ASSERT_X( pageNames.value( title ) == name, "QgsProjectProperties::checkPageWidgetNameMap()", QStringLiteral( "QgisApp::projectPropertiesPagesMap() is outdated, please update. %1 should be %2 not %3" ).arg( title, name, pageNames.value( title ) ).toLocal8Bit().constData() );
23182324
}
2319-
return pageNames;
23202325
}
23212326

23222327
void QgsProjectProperties::setCurrentPage( const QString &pageWidgetName )

‎src/app/qgsprojectproperties.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
4848
//! Constructor
4949
QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags );
5050

51-
QMap< QString, QString > pageWidgetNameMap();
52-
5351
void setCurrentPage( const QString & );
5452

5553
~QgsProjectProperties() override;
@@ -192,6 +190,8 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
192190

193191
QgsCoordinateReferenceSystem mCrs;
194192

193+
void checkPageWidgetNameMap();
194+
195195
void populateStyles();
196196
void editSymbol( QComboBox *cbo );
197197

0 commit comments

Comments
 (0)