Skip to content

Commit

Permalink
Add a plugin interface to add pages to the project properties dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Sep 17, 2020
1 parent 965595d commit 445d78f
Show file tree
Hide file tree
Showing 8 changed files with 162 additions and 5 deletions.
35 changes: 35 additions & 0 deletions python/gui/auto_generated/qgisinterface.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -986,6 +986,14 @@ Opens the options dialog. The ``currentPage`` argument can be used to force
the dialog to open at a specific page.

.. versionadded:: 3.0
%End

virtual void showProjectPropertiesDialog( const QString &currentPage = QString() ) = 0;
%Docstring
Opens the project properties dialog. The ``currentPage`` argument can be used to force
the dialog to open at a specific page.

.. versionadded:: 3.16
%End

virtual void buildStyleSheet( const QMap<QString, QVariant> &opts ) = 0;
Expand Down Expand Up @@ -1176,6 +1184,33 @@ Unregister a previously registered tab in the options dialog.
.. seealso:: :py:func:`registerOptionsWidgetFactory`

.. versionadded:: 3.0
%End

virtual void registerProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory ) = 0;
%Docstring
Register a new tab in the project properties dialog.

.. note::

Ownership of the factory is not transferred, and the factory must
be unregistered when plugin is unloaded.

.. seealso:: :py:class:`QgsOptionsWidgetFactory`

.. seealso:: :py:func:`unregisterProjectPropertiesWidgetFactory`

.. versionadded:: 3.16
%End

virtual void unregisterProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory ) = 0;
%Docstring
Unregister a previously registered tab in the options dialog.

.. seealso:: :py:class:`QgsOptionsWidgetFactory`

.. seealso:: :py:func:`registerProjectPropertiesWidgetFactory`

.. versionadded:: 3.16
%End

virtual void registerDevToolWidgetFactory( QgsDevToolWidgetFactory *factory ) = 0;
Expand Down
32 changes: 31 additions & 1 deletion src/app/qgisapp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12179,6 +12179,17 @@ QMap< QString, QString > QgisApp::projectPropertiesPagesMap()
sProjectPropertiesPagesMap.insert( QCoreApplication::translate( "QgsProjectPropertiesBase", "Temporal" ), QStringLiteral( "mTemporalOptions" ) );
} );

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

return sProjectPropertiesPagesMap;
}

Expand Down Expand Up @@ -12620,6 +12631,16 @@ void QgisApp::unregisterOptionsWidgetFactory( QgsOptionsWidgetFactory *factory )
mOptionsWidgetFactories.removeAll( factory );
}

void QgisApp::registerProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory )
{
mProjectPropertiesWidgetFactories << factory;
}

void QgisApp::unregisterProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory )
{
mProjectPropertiesWidgetFactories.removeAll( factory );
}

void QgisApp::registerDevToolFactory( QgsDevToolWidgetFactory *factory )
{
mDevToolFactories << factory;
Expand Down Expand Up @@ -14115,7 +14136,16 @@ void QgisApp::projectProperties( const QString &currentPage )
// dialog results in the construction of the spatial reference
// system QMap
QApplication::setOverrideCursor( Qt::WaitCursor );
QgsProjectProperties *pp = new QgsProjectProperties( mMapCanvas, this );

QList< QgsOptionsWidgetFactory * > factories;
const auto constProjectPropertiesWidgetFactories = mProjectPropertiesWidgetFactories;
for ( const QPointer< QgsOptionsWidgetFactory > &f : constProjectPropertiesWidgetFactories )
{
if ( f )
factories << f;
}
QgsProjectProperties *pp = new QgsProjectProperties( mMapCanvas, this, QgsGuiUtils::ModalDialogFlags, factories );

// if called from the status bar, show the projection tab
if ( mShowProjectionTab )
{
Expand Down
7 changes: 7 additions & 0 deletions src/app/qgisapp.h
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,12 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
//! Unregister a previously registered tab in the options dialog
void unregisterOptionsWidgetFactory( QgsOptionsWidgetFactory *factory );

//! Register a new tab in the project properties dialog
void registerProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory );

//! Unregister a previously registered tab in the project properties dialog
void unregisterProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory );

//! Register a dev tool factory
void registerDevToolFactory( QgsDevToolWidgetFactory *factory );

Expand Down Expand Up @@ -2555,6 +2561,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow

QList<QgsMapLayerConfigWidgetFactory *> mMapLayerPanelFactories;
QList<QPointer<QgsOptionsWidgetFactory>> mOptionsWidgetFactories;
QList<QPointer<QgsOptionsWidgetFactory>> mProjectPropertiesWidgetFactories;

QList<QgsDevToolWidgetFactory * > mDevToolFactories;

Expand Down
15 changes: 15 additions & 0 deletions src/app/qgisappinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,11 @@ void QgisAppInterface::showOptionsDialog( QWidget *parent, const QString &curren
return qgis->showOptionsDialog( parent, currentPage );
}

void QgisAppInterface::showProjectPropertiesDialog( const QString &currentPage )
{
return qgis->showProjectProperties( currentPage );
}

QMap<QString, QVariant> QgisAppInterface::defaultStyleSheetOptions()
{
return qgis->styleSheetBuilder()->defaultOptions();
Expand Down Expand Up @@ -546,6 +551,16 @@ void QgisAppInterface::unregisterOptionsWidgetFactory( QgsOptionsWidgetFactory *
qgis->unregisterOptionsWidgetFactory( factory );
}

void QgisAppInterface::registerProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory )
{
qgis->registerProjectPropertiesWidgetFactory( factory );
}

void QgisAppInterface::unregisterProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory )
{
qgis->unregisterProjectPropertiesWidgetFactory( factory );
}

void QgisAppInterface::registerDevToolWidgetFactory( QgsDevToolWidgetFactory *factory )
{
qgis->registerDevToolFactory( factory );
Expand Down
3 changes: 3 additions & 0 deletions src/app/qgisappinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ class APP_EXPORT QgisAppInterface : public QgisInterface
QList<QgsLayoutDesignerInterface *> openLayoutDesigners() override;
QgsLayoutDesignerInterface *openLayoutDesigner( QgsMasterLayoutInterface *layout ) override;
void showOptionsDialog( QWidget *parent = nullptr, const QString &currentPage = QString() ) override;
void showProjectPropertiesDialog( const QString &currentPage = QString() ) override;
QMap<QString, QVariant> defaultStyleSheetOptions() override;
void buildStyleSheet( const QMap<QString, QVariant> &opts ) override;
void saveStyleSheetOptions( const QMap<QString, QVariant> &opts ) override;
Expand Down Expand Up @@ -145,6 +146,8 @@ class APP_EXPORT QgisAppInterface : public QgisInterface
void unregisterMapLayerConfigWidgetFactory( QgsMapLayerConfigWidgetFactory *factory ) override;
void registerOptionsWidgetFactory( QgsOptionsWidgetFactory *factory ) override;
void unregisterOptionsWidgetFactory( QgsOptionsWidgetFactory *factory ) override;
void registerProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory ) override;
void unregisterProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory ) override;
void registerDevToolWidgetFactory( QgsDevToolWidgetFactory *factory ) override;
void unregisterDevToolWidgetFactory( QgsDevToolWidgetFactory *factory ) override;
void registerCustomDropHandler( QgsCustomDropHandler *handler ) override;
Expand Down
38 changes: 36 additions & 2 deletions src/app/qgsprojectproperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
//qt includes
#include <QInputDialog>
#include <QFileDialog>
#include <QHeaderView> // Qt 4.4
#include <QHeaderView>
#include <QMessageBox>
#include <QDesktopServices>
#include <QAbstractListModel>
Expand All @@ -87,7 +87,7 @@ const char *QgsProjectProperties::GEO_NONE_DESC = QT_TRANSLATE_NOOP( "QgsOptions

//stdc++ includes

QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *parent, Qt::WindowFlags fl )
QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *parent, Qt::WindowFlags fl, const QList<QgsOptionsWidgetFactory *> &optionsFactories )
: QgsOptionsDialogBase( QStringLiteral( "ProjectProperties" ), parent, fl )
, mMapCanvas( mapCanvas )
, mEllipsoidIndex( 0 )
Expand Down Expand Up @@ -971,6 +971,24 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa

mBearingFormat.reset( QgsProject::instance()->displaySettings()->bearingFormat()->clone() );

const auto constOptionsFactories = optionsFactories;
for ( QgsOptionsWidgetFactory *factory : constOptionsFactories )
{
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;

mAdditionalProjectPropertiesWidgets << page;
mOptionsStackedWidget->addWidget( page );
}

restoreOptionsBaseUi();

#ifdef QGISDEBUG
Expand Down Expand Up @@ -1525,6 +1543,11 @@ void QgsProjectProperties::apply()

QgsProject::instance()->displaySettings()->setBearingFormat( mBearingFormat->clone() );

for ( QgsOptionsPageWidget *widget : qgis::as_const( mAdditionalProjectPropertiesWidgets ) )
{
widget->apply();
}

//refresh canvases to reflect new properties, eg background color and scale bar after changing display units.
for ( QgsMapCanvas *canvas : constMapCanvases )
{
Expand Down Expand Up @@ -2524,6 +2547,17 @@ void QgsProjectProperties::showHelp()
{
link = QStringLiteral( "working_with_ogc/server/getting_started.html#prepare-a-project-to-serve" );
}

// give first priority to created pages which have specified a help key
for ( const QgsOptionsPageWidget *widget : qgis::as_const( mAdditionalProjectPropertiesWidgets ) )
{
if ( widget == activeTab )
{
link = widget->helpKey();
break;
}
}

QgsHelp::openHelp( link );
}

Expand Down
12 changes: 10 additions & 2 deletions src/app/qgsprojectproperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,19 @@
***************************************************************************/


#include "qgsoptionsdialogbase.h"
#include "ui_qgsprojectpropertiesbase.h"

#include "qgsoptionsdialogbase.h"
#include "qgsoptionswidgetfactory.h"
#include "qgis.h"
#include "qgsunittypes.h"
#include "qgsguiutils.h"
#include "qgsscalewidget.h"
#include "qgshelp.h"
#include "qgis_app.h"

#include <QList>

class QgsMapCanvas;
class QgsRelationManagerDialog;
class QgsStyle;
Expand All @@ -35,6 +39,7 @@ class QgsMetadataWidget;
class QgsTreeWidgetItem;
class QgsLayerCapabilitiesModel;
class QgsBearingNumericFormat;
class QgsOptionsPageWidget;

/**
* Dialog to set project level properties
Expand All @@ -48,7 +53,8 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:

public:
//! Constructor
QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags );
QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *parent = nullptr, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags,
const QList<QgsOptionsWidgetFactory *> &optionsFactories = QList<QgsOptionsWidgetFactory *>() );

~QgsProjectProperties() override;

Expand Down Expand Up @@ -250,6 +256,8 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
int mEllipsoidIndex;
bool mBlockCrsUpdates = false;

QList< QgsOptionsPageWidget * > mAdditionalProjectPropertiesWidgets;

std::unique_ptr< QgsBearingNumericFormat > mBearingFormat;

//! populate WMTS tree
Expand Down
25 changes: 25 additions & 0 deletions src/gui/qgisinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -848,6 +848,13 @@ class GUI_EXPORT QgisInterface : public QObject
*/
virtual void showOptionsDialog( QWidget *parent = nullptr, const QString &currentPage = QString() ) = 0;

/**
* Opens the project properties dialog. The \a currentPage argument can be used to force
* the dialog to open at a specific page.
* \since QGIS 3.16
*/
virtual void showProjectPropertiesDialog( const QString &currentPage = QString() ) = 0;

/**
* Generate stylesheet
* \param opts generated default option values, or a changed copy of them
Expand Down Expand Up @@ -984,6 +991,24 @@ class GUI_EXPORT QgisInterface : public QObject
*/
virtual void unregisterOptionsWidgetFactory( QgsOptionsWidgetFactory *factory ) = 0;

/**
* Register a new tab in the project properties dialog.
* \note Ownership of the factory is not transferred, and the factory must
* be unregistered when plugin is unloaded.
* \see QgsOptionsWidgetFactory
* \see unregisterProjectPropertiesWidgetFactory()
* \since QGIS 3.16
*/
virtual void registerProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory ) = 0;

/**
* Unregister a previously registered tab in the options dialog.
* \see QgsOptionsWidgetFactory
* \see registerProjectPropertiesWidgetFactory()
* \since QGIS 3.16
*/
virtual void unregisterProjectPropertiesWidgetFactory( QgsOptionsWidgetFactory *factory ) = 0;

/**
* Register a new tool in the development/debugging tools dock.
* \note Ownership of the factory is not transferred, and the factory must
Expand Down

0 comments on commit 445d78f

Please sign in to comment.