Skip to content

Commit

Permalink
Fix and simplify options locator widget assertions
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jul 29, 2021
1 parent 557b92d commit 011a8d2
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 77 deletions.
7 changes: 3 additions & 4 deletions src/app/locator/qgssettingslocatorfilter.cpp
Expand Up @@ -32,11 +32,11 @@ void QgsSettingsLocatorFilter::fetchResults( const QString &string, const QgsLoc
{
QMap<QString, QMap<QString, QString>> matchingSettingsPagesMap;

QMap<QString, int > optionsPagesMap = QgisApp::instance()->optionsPagesMap();
QMap<QString, QString > optionsPagesMap = QgisApp::instance()->optionsPagesMap();
for ( auto optionsPagesIterator = optionsPagesMap.constBegin(); optionsPagesIterator != optionsPagesMap.constEnd(); ++optionsPagesIterator )
{
QString title = optionsPagesIterator.key();
matchingSettingsPagesMap.insert( title + " (" + tr( "Options" ) + ")", settingsPage( QStringLiteral( "optionpage" ), QString::number( optionsPagesIterator.value() ) ) );
matchingSettingsPagesMap.insert( title + " (" + tr( "Options" ) + ")", settingsPage( QStringLiteral( "optionpage" ), optionsPagesIterator.value() ) );
}

QMap<QString, QString> projectPropertyPagesMap = QgisApp::instance()->projectPropertiesPagesMap();
Expand Down Expand Up @@ -92,8 +92,7 @@ void QgsSettingsLocatorFilter::triggerResult( const QgsLocatorResult &result )

if ( type == QLatin1String( "optionpage" ) )
{
const int pageNumber = page.toInt();
QgisApp::instance()->showOptionsDialog( QgisApp::instance(), QString(), pageNumber );
QgisApp::instance()->showOptionsDialog( QgisApp::instance(), page );
}
else if ( type == QLatin1String( "projectpropertypage" ) )
{
Expand Down
41 changes: 22 additions & 19 deletions src/app/options/qgsoptions.cpp
Expand Up @@ -1368,56 +1368,59 @@ QgsOptions::~QgsOptions()

void QgsOptions::checkPageWidgetNameMap()
{
return;
const QMap< QString, QString > pageNames = QgisApp::instance()->optionsPagesMap();

const QMap< QString, int > pageNames = QgisApp::instance()->optionsPagesMap();

int pageCount = 0;
std::function<void( const QModelIndex & )> traverseModel;

// traverse through the model, counting all which correspond to pages till we hit the desired index
// traverse through the model, collecting all entries which correspond to pages
QStringList pageTitles;
traverseModel = [&]( const QModelIndex & parent )
{
for ( int row = 0; row < mTreeModel->rowCount( parent ); ++row )
{
const QModelIndex currentIndex = mTreeModel->index( row, 0, parent );

if ( mTreeModel->itemFromIndex( currentIndex )->isSelectable() )
pageCount++;
pageTitles << currentIndex.data().toString();

traverseModel( currentIndex );
}
};
traverseModel( QModelIndex() );
Q_ASSERT_X( pageNames.count() == pageCount, "QgsOptions::checkPageWidgetNameMap()", "QgisApp::optionsPagesMap() is outdated, contains too many entries" );
Q_ASSERT_X( pageNames.count() == pageTitles.count(), "QgsOptions::checkPageWidgetNameMap()", "QgisApp::optionsPagesMap() is outdated, contains too many entries" );

for ( int page = 0; page < pageCount; ++page )
int page = 0;
for ( const QString &pageTitle : std::as_const( pageTitles ) )
{
QWidget *currentPage = mOptionsStackedWidget->widget( page );
const QModelIndex sourceIndex = mTreeProxyModel->pageNumberToSourceIndex( page );
Q_ASSERT_X( pageNames.contains( pageTitle ), "QgsOptions::checkPageWidgetNameMap()", QStringLiteral( "QgisApp::optionsPagesMap() is outdated, please update. Missing %1" ).arg( pageTitle ).toLocal8Bit().constData() );
Q_ASSERT_X( pageNames.value( pageTitle ) == currentPage->objectName() || pageNames.value( pageTitle ) == pageTitle, "QgsOptions::checkPageWidgetNameMap()", QStringLiteral( "QgisApp::optionsPagesMap() is outdated, please update. %1 should be %2 or %1 not %3" ).arg( pageTitle ).arg( currentPage->objectName() ).arg( pageNames.value( pageTitle ) ).toLocal8Bit().constData() );

QStandardItem *item = mTreeModel->itemFromIndex( sourceIndex );
if ( currentPage && item )
{
const QString title = item->text();
Q_ASSERT_X( pageNames.contains( title ), "QgsOptions::checkPageWidgetNameMap()", QStringLiteral( "QgisApp::optionsPagesMap() is outdated, please update. Missing %1" ).arg( title ).toLocal8Bit().constData() );
Q_ASSERT_X( pageNames.value( title ) == page, "QgsOptions::checkPageWidgetNameMap()", QStringLiteral( "QgisApp::optionsPagesMap() is outdated, please update. %1 should be %2 not %3" ).arg( title ).arg( page ).arg( pageNames.value( title ) ).toLocal8Bit().constData() );
}
page++;
}
}

void QgsOptions::setCurrentPage( const QString &pageWidgetName )
{
//find the page with a matching widget name
for ( int idx = 0; idx < mOptionsStackedWidget->count(); ++idx )
for ( int page = 0; page < mOptionsStackedWidget->count(); ++page )
{
QWidget *currentPage = mOptionsStackedWidget->widget( idx );
QWidget *currentPage = mOptionsStackedWidget->widget( page );
if ( currentPage->objectName() == pageWidgetName )
{
//found the page, set it as current
mOptionsStackedWidget->setCurrentIndex( idx );
mOptionsStackedWidget->setCurrentIndex( page );
return;
}
else if ( mTreeProxyModel )
{
const QModelIndex sourceIndex = mTreeProxyModel->pageNumberToSourceIndex( page );
if ( sourceIndex.data().toString() == pageWidgetName || sourceIndex.data( Qt::UserRole + 1 ).toString() == pageWidgetName )
{
mOptionsStackedWidget->setCurrentIndex( page );
return;
}
}
}
}

Expand Down
76 changes: 23 additions & 53 deletions src/app/qgisapp.cpp
Expand Up @@ -12492,15 +12492,13 @@ QMap< QString, QString > QgisApp::projectPropertiesPagesMap()
sProjectPropertiesPagesMap.insert( QCoreApplication::translate( "QgsProjectPropertiesBase", "Temporal" ), QStringLiteral( "mTemporalOptions" ) );
} );

int idx = sProjectPropertiesPagesMap.count();
for ( const QPointer< QgsOptionsWidgetFactory > &f : std::as_const( mProjectPropertiesWidgetFactories ) )
{
// remove any deleted factories
if ( f )
{
sProjectPropertiesPagesMap.insert( f->title(), f->title() );
}
idx++;
}

return sProjectPropertiesPagesMap;
Expand Down Expand Up @@ -12546,70 +12544,42 @@ void QgisApp::showSettings( const QString &page )
}
}

QMap< QString, int > QgisApp::optionsPagesMap()
QMap<QString, QString> QgisApp::optionsPagesMap()
{
static QList< std::pair< QString, QString > > sOptionsPagesList;
static QMap< QString, QString > sOptionsPagesMap;
static std::once_flag initialized;
std::call_once( initialized, []
{
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "General" ), QStringLiteral( "mOptionsPageGeneral" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "System" ), QStringLiteral( "mOptionsPageSystem" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "CRS" ), QStringLiteral( "mOptionsPageCRS" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Transformations" ), QStringLiteral( "mOptionsPageTransformations" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Data Sources" ), QStringLiteral( "mOptionsPageDataSources" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "GDAL" ), QStringLiteral( "mOptionsPageGDAL" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Rendering" ), QStringLiteral( "mOptionsPageRendering" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Canvas & Legend" ), QStringLiteral( "mOptionsPageMapCanvas" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Map Tools" ), QStringLiteral( "mOptionsPageMapTools" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Colors" ), QStringLiteral( "mOptionsPageColors" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Digitizing" ), QStringLiteral( "mOptionsPageDigitizing" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Layouts" ), QStringLiteral( "mOptionsPageComposer" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Variables" ), QStringLiteral( "mOptionsPageVariables" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Authentication" ), QStringLiteral( "mOptionsPageAuth" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Network" ), QStringLiteral( "mOptionsPageNetwork" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Locator" ), QStringLiteral( "mOptionsLocatorSettings" ) } );
sOptionsPagesList.push_back( { QCoreApplication::translate( "QgsOptionsBase", "Acceleration" ), QStringLiteral( "mOptionsPageAcceleration" ) } );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "General" ), QStringLiteral( "mOptionsPageGeneral" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "System" ), QStringLiteral( "mOptionsPageSystem" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "CRS" ), QStringLiteral( "mOptionsPageCRS" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Transformations" ), QStringLiteral( "mOptionsPageTransformations" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Data Sources" ), QStringLiteral( "mOptionsPageDataSources" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "GDAL" ), QStringLiteral( "mOptionsPageGDAL" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Rendering" ), QStringLiteral( "mOptionsPageRendering" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Canvas & Legend" ), QStringLiteral( "mOptionsPageMapCanvas" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Map Tools" ), QStringLiteral( "mOptionsPageMapTools" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Colors" ), QStringLiteral( "mOptionsPageColors" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Digitizing" ), QStringLiteral( "mOptionsPageDigitizing" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Layouts" ), QStringLiteral( "mOptionsPageComposer" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Variables" ), QStringLiteral( "mOptionsPageVariables" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Authentication" ), QStringLiteral( "mOptionsPageAuth" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Network" ), QStringLiteral( "mOptionsPageNetwork" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Locator" ), QStringLiteral( "mOptionsLocatorSettings" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Acceleration" ), QStringLiteral( "mOptionsPageAcceleration" ) );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Advanced" ), QCoreApplication::translate( "QgsOptionsBase", "Advanced" ) );
} );

QList< std::pair< QString, QString > > pages = sOptionsPagesList;
QMap< QString, QString > pages = sOptionsPagesMap;
for ( const QPointer< QgsOptionsWidgetFactory > &f : std::as_const( mOptionsWidgetFactories ) )
{
// remove any deleted factories
if ( f )
{
const QString positionHint = f->pagePositionHint();
if ( positionHint.isEmpty() )
{
pages.push_back( { f->title(), QString() } );
}
else
{
bool found = false;
for ( int idx = 0; idx < pages.size(); ++idx )
{
if ( pages.at( idx ).second == positionHint )
{
pages.insert( idx, { f->title(), QString() } );
found = true;
break;
}
}
if ( !found )
pages.push_back( { f->title(), QString() } );
}
pages.insert( f->title(), f->title() );
}
}

QMap< QString, int > map;
int idx = 0;
for ( auto it = pages.constBegin(); it != pages.constEnd(); ++it )
{
map.insert( it->first, idx );
idx++;
}

map.insert( QCoreApplication::translate( "QgsOptionsBase", "Advanced" ), idx );
return map;
return pages;
}

QgsOptions *QgisApp::createOptionsDialog( QWidget *parent )
Expand Down
2 changes: 1 addition & 1 deletion src/app/qgisapp.h
Expand Up @@ -1202,7 +1202,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
* Settings pages section
*/
//! Gets map of option pages
QMap<QString, int> optionsPagesMap();
QMap<QString, QString> optionsPagesMap();
//! Gets map of project property pages
QMap< QString, QString > projectPropertiesPagesMap();
//! Gets map of setting pages
Expand Down

0 comments on commit 011a8d2

Please sign in to comment.