Skip to content

Commit

Permalink
Move 3d options tab up to a more natural position
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jan 29, 2021
1 parent 2155c81 commit 249d681
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 30 deletions.
14 changes: 14 additions & 0 deletions python/gui/auto_generated/qgsoptionswidgetfactory.sip.in
Expand Up @@ -106,6 +106,20 @@ The title of the panel.
Set the ``title`` for the interface.

.. seealso:: :py:func:`title`
%End

virtual QString pagePositionHint() const;
%Docstring
Returns a tab name hinting at where this page should be inserted into the
options properties tab list.

If the returned string is non-empty, the options widget page will be inserted
before the existing page with matching object name.

The default implementation returns an empty string, which causes the widget
to be placed at the end of the dialog page list.

.. versionadded:: 3.18
%End

virtual QgsOptionsPageWidget *createWidget( QWidget *parent = 0 ) const = 0 /Factory/;
Expand Down
5 changes: 5 additions & 0 deletions src/app/3d/qgs3doptions.cpp
Expand Up @@ -88,3 +88,8 @@ QgsOptionsPageWidget *Qgs3DOptionsFactory::createWidget( QWidget *parent ) const
{
return new Qgs3DOptionsWidget( parent );
}

QString Qgs3DOptionsFactory::pagePositionHint() const
{
return QStringLiteral( "mOptionsPageColors" );
}
1 change: 1 addition & 0 deletions src/app/3d/qgs3doptions.h
Expand Up @@ -52,6 +52,7 @@ class Qgs3DOptionsFactory : public QgsOptionsWidgetFactory

QIcon icon() const override;
QgsOptionsPageWidget *createWidget( QWidget *parent = nullptr ) const override;
QString pagePositionHint() const override;

};

Expand Down
13 changes: 5 additions & 8 deletions src/app/options/qgsoptions.cpp
Expand Up @@ -1186,19 +1186,16 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
factories << &advancedFactory;
for ( QgsOptionsWidgetFactory *factory : qgis::as_const( factories ) )
{
QListWidgetItem *item = new QListWidgetItem();
item->setIcon( factory->icon() );
item->setText( factory->title() );
item->setToolTip( factory->title() );

mOptionsListWidget->addItem( item );

QgsOptionsPageWidget *page = factory->createWidget( this );
if ( !page )
continue;

mAdditionalOptionWidgets << page;
mOptionsStackedWidget->addWidget( page );
const QString beforePage = factory->pagePositionHint();
if ( beforePage.isEmpty() )
addPage( factory->title(), factory->title(), factory->icon(), page );
else
insertPage( factory->title(), factory->title(), factory->icon(), page, beforePage );

if ( QgsAdvancedSettingsWidget *advancedPage = qobject_cast< QgsAdvancedSettingsWidget * >( page ) )
{
Expand Down
68 changes: 46 additions & 22 deletions src/app/qgisapp.cpp
Expand Up @@ -12476,43 +12476,67 @@ void QgisApp::showSettings( const QString &page )

QMap< QString, int > QgisApp::optionsPagesMap()
{
static QMap< QString, int > sOptionsPagesMap;
static QList< std::pair< QString, QString > > sOptionsPagesList;
static std::once_flag initialized;
std::call_once( initialized, []
{
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "General" ), 0 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "System" ), 1 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "CRS" ), 2 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Transformations" ), 3 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Data Sources" ), 4 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Rendering" ), 5 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Canvas & Legend" ), 6 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Map Tools" ), 7 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Colors" ), 8 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Digitizing" ), 9 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Layouts" ), 10 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "GDAL" ), 11 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Variables" ), 12 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Authentication" ), 13 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Network" ), 14 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Locator" ), 15 );
sOptionsPagesMap.insert( QCoreApplication::translate( "QgsOptionsBase", "Acceleration" ), 16 );
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", "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", "GDAL" ), QStringLiteral( "mOptionsPageGDAL" ) } );
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" ) } );
} );

QMap< QString, int > map = sOptionsPagesMap;
int idx = map.count();
QList< std::pair< QString, QString > > pages = sOptionsPagesList;
for ( const QPointer< QgsOptionsWidgetFactory > &f : qgis::as_const( mOptionsWidgetFactories ) )
{
// remove any deleted factories
if ( f )
{
map.insert( f->title(), idx );
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() } );
}
}
}

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;
}

Expand Down
14 changes: 14 additions & 0 deletions src/gui/qgsoptionswidgetfactory.h
Expand Up @@ -134,6 +134,20 @@ class GUI_EXPORT QgsOptionsWidgetFactory : public QObject
*/
void setTitle( const QString &title ) { mTitle = title; }

/**
* Returns a tab name hinting at where this page should be inserted into the
* options properties tab list.
*
* If the returned string is non-empty, the options widget page will be inserted
* before the existing page with matching object name.
*
* The default implementation returns an empty string, which causes the widget
* to be placed at the end of the dialog page list.
*
* \since QGIS 3.18
*/
virtual QString pagePositionHint() const { return QString(); }

/**
* \brief Factory function to create the widget on demand as needed by the options dialog.
* \param parent The parent of the widget.
Expand Down

0 comments on commit 249d681

Please sign in to comment.