From 40ceb7bdcefbaae68ebdc7b97d36f59914582c08 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sat, 10 Mar 2018 12:25:55 +1000 Subject: [PATCH] Don't mark project dirty when legend nodes are expanded/collapsed --- python/gui/layertree/qgslayertreeview.sip.in | 2 ++ src/app/qgisapp.cpp | 7 ++++++- src/gui/layertree/qgslayertreeview.cpp | 6 ++++++ src/gui/layertree/qgslayertreeview.h | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/python/gui/layertree/qgslayertreeview.sip.in b/python/gui/layertree/qgslayertreeview.sip.in index c439f3139d0..a0f87314dda 100644 --- a/python/gui/layertree/qgslayertreeview.sip.in +++ b/python/gui/layertree/qgslayertreeview.sip.in @@ -148,6 +148,8 @@ Returns list of indicators associated with a particular layer tree node. .. versionadded:: 3.2 %End + + public slots: void refreshLayerSymbology( const QString &layerId ); %Docstring diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 37af72451d3..39641b74309 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -3238,7 +3238,12 @@ void QgisApp::setupConnections() connect( mLayerTreeView->layerTreeModel()->rootGroup(), &QgsLayerTreeNode::visibilityChanged, this, &QgisApp::markDirty ); connect( mLayerTreeView->layerTreeModel()->rootGroup(), &QgsLayerTreeNode::customPropertyChanged, - this, &QgisApp::markDirty ); + this, [ = ]( QgsLayerTreeNode *, const QString & key ) + { + // only mark dirty for non-view only changes + if ( !QgsLayerTreeView::viewOnlyCustomProperties().contains( key ) ) + QgisApp::markDirty(); + } ); // connect map layer registry connect( QgsProject::instance(), &QgsProject::layersAdded, diff --git a/src/gui/layertree/qgslayertreeview.cpp b/src/gui/layertree/qgslayertreeview.cpp index 6a4b1738050..58126162ab4 100644 --- a/src/gui/layertree/qgslayertreeview.cpp +++ b/src/gui/layertree/qgslayertreeview.cpp @@ -355,6 +355,12 @@ QList QgsLayerTreeView::indicators( QgsLayerTreeNod return mIndicators.value( node ); } +///@cond PRIVATE +QStringList QgsLayerTreeView::viewOnlyCustomProperties() +{ + return QStringList() << QStringLiteral( "expandedLegendNodes" ); +} +///@endcond void QgsLayerTreeView::refreshLayerSymbology( const QString &layerId ) { diff --git a/src/gui/layertree/qgslayertreeview.h b/src/gui/layertree/qgslayertreeview.h index 3ccd818d5fa..a90ec4ac24b 100644 --- a/src/gui/layertree/qgslayertreeview.h +++ b/src/gui/layertree/qgslayertreeview.h @@ -135,6 +135,20 @@ class GUI_EXPORT QgsLayerTreeView : public QTreeView */ QList indicators( QgsLayerTreeNode *node ) const; +///@cond PRIVATE + + /** + * Returns a list of custom property keys which are considered as related to view operations + * only. E.g. node expanded state. + * + * Changes to these keys will not mark a project as "dirty" and trigger unsaved changes + * warnings. + * + * \since QGIS 3.2 + */ + static QStringList viewOnlyCustomProperties() SIP_SKIP; +///@endcond + public slots: //! Force refresh of layer symbology. Normally not needed as the changes of layer's renderer are monitored by the model void refreshLayerSymbology( const QString &layerId );