diff --git a/python/gui/auto_generated/qgsoptionswidgetfactory.sip.in b/python/gui/auto_generated/qgsoptionswidgetfactory.sip.in index ec124fec53c..fc164ab2114 100644 --- a/python/gui/auto_generated/qgsoptionswidgetfactory.sip.in +++ b/python/gui/auto_generated/qgsoptionswidgetfactory.sip.in @@ -39,7 +39,16 @@ help will be retrieved. %End + virtual bool isValid(); +%Docstring +Validates the current state of the widget. +Subclasses should return ``True`` if the widget state is currently valid and acceptable to :py:func:`~QgsOptionsPageWidget.apply`. + +The default implementation returns ``True``. + +.. versionadded:: 3.24 +%End public slots: diff --git a/src/app/options/qgsoptions.cpp b/src/app/options/qgsoptions.cpp index cbe7efb9383..6afab13ede1 100644 --- a/src/app/options/qgsoptions.cpp +++ b/src/app/options/qgsoptions.cpp @@ -166,6 +166,18 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QListisValid() ) + return; + } + accept(); + } ); // stylesheet setup mStyleSheetBuilder = QgisApp::instance()->styleSheetBuilder(); @@ -1531,6 +1543,12 @@ void QgsOptions::selectProjectOnLaunch() void QgsOptions::saveOptions() { + for ( QgsOptionsPageWidget *widget : std::as_const( mAdditionalOptionWidgets ) ) + { + if ( !widget->isValid() ) + return; + } + QgsSettings settings; mSettings->setValue( QStringLiteral( "UI/UITheme" ), cmbUITheme->currentText() ); @@ -1999,8 +2017,7 @@ void QgsOptions::saveOptions() mLocatorOptionsWidget->commitChanges(); - const auto constMAdditionalOptionWidgets = mAdditionalOptionWidgets; - for ( QgsOptionsPageWidget *widget : constMAdditionalOptionWidgets ) + for ( QgsOptionsPageWidget *widget : std::as_const( mAdditionalOptionWidgets ) ) { widget->apply(); } diff --git a/src/gui/qgsoptionswidgetfactory.h b/src/gui/qgsoptionswidgetfactory.h index dc2b20c93d2..cfbd94aac78 100644 --- a/src/gui/qgsoptionswidgetfactory.h +++ b/src/gui/qgsoptionswidgetfactory.h @@ -52,13 +52,22 @@ class GUI_EXPORT QgsOptionsPageWidget : public QWidget */ virtual QString helpKey() const { return QString(); } - /** * Returns the registered highlight widgets used to search and highlight text in * options dialogs. */ QHash registeredHighlightWidgets() {return mHighlightWidgets;} SIP_SKIP + /** + * Validates the current state of the widget. + * + * Subclasses should return TRUE if the widget state is currently valid and acceptable to apply(). + * + * The default implementation returns TRUE. + * + * \since QGIS 3.24 + */ + virtual bool isValid() { return true; } public slots: