From bb9c242e0db040561a9e16e6c9e897ed16d681fe Mon Sep 17 00:00:00 2001 From: Jacky Volpes Date: Tue, 18 Jan 2022 11:52:10 +0100 Subject: [PATCH] Option to synchronize statistics panel with layers panel - fixes #46567 --- src/app/qgsstatisticalsummarydockwidget.cpp | 29 +++++++++++++++++++-- src/app/qgsstatisticalsummarydockwidget.h | 3 +++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/app/qgsstatisticalsummarydockwidget.cpp b/src/app/qgsstatisticalsummarydockwidget.cpp index 3f8dfa722e5..9ea32c73fb1 100644 --- a/src/app/qgsstatisticalsummarydockwidget.cpp +++ b/src/app/qgsstatisticalsummarydockwidget.cpp @@ -79,6 +79,9 @@ QgsStatisticalSummaryDockWidget::QgsStatisticalSummaryDockWidget( QWidget *paren mStatisticsMenu = new QMenu( mOptionsToolButton ); mOptionsToolButton->setMenu( mStatisticsMenu ); + mSyncAction = new QAction( tr( "Keep synchronized with TOC" ) ); + mSyncAction->setCheckable( true ); + connect( mSyncAction, &QAction::toggled, this, &QgsStatisticalSummaryDockWidget::manageSyncLayer ); mFieldType = DataType::Numeric; mPreviousFieldType = DataType::Numeric; @@ -104,6 +107,7 @@ void QgsStatisticalSummaryDockWidget::fieldChanged() if ( mFieldExpressionWidget->expression() != mExpression ) { mExpression = mFieldExpressionWidget->expression(); + mLastExpression.insert( mLayerComboBox->currentLayer()->id(), mFieldExpressionWidget->currentText() ); refreshStatistics(); } } @@ -136,6 +140,20 @@ void QgsStatisticalSummaryDockWidget::copyStatistics() } } +void QgsStatisticalSummaryDockWidget::manageSyncLayer( bool checked ) +{ + mLayerComboBox->setEnabled( !checked ); + if ( checked ) + { + connect( QgisApp::instance(), &QgisApp::activeLayerChanged, mLayerComboBox, &QgsMapLayerComboBox::setLayer ); + mLayerComboBox->setLayer( QgisApp::instance()->activeLayer() ); + } + else + { + disconnect( QgisApp::instance(), &QgisApp::activeLayerChanged, mLayerComboBox, &QgsMapLayerComboBox::setLayer ); + } +} + void QgsStatisticalSummaryDockWidget::refreshStatistics() { if ( !mLayer || mFieldExpressionWidget->currentField().isEmpty() || ( mFieldExpressionWidget->isExpression() && !mFieldExpressionWidget->isValidExpression() ) ) @@ -376,12 +394,12 @@ void QgsStatisticalSummaryDockWidget::layerChanged( QgsMapLayer *layer ) mLayer = newLayer; - // clear expression, so that we don't force an unwanted recalculation - mFieldExpressionWidget->setExpression( QString() ); mFieldExpressionWidget->setLayer( mLayer ); if ( mLayer ) { + // Get last expression + mFieldExpressionWidget->setExpression( mLastExpression.value( mLayer->id(), QString() ) ); connect( mLayer, &QgsVectorLayer::selectionChanged, this, &QgsStatisticalSummaryDockWidget::layerSelectionChanged ); } @@ -439,6 +457,10 @@ void QgsStatisticalSummaryDockWidget::layersRemoved( const QStringList &layers ) disconnect( mLayer, &QgsVectorLayer::selectionChanged, this, &QgsStatisticalSummaryDockWidget::layerSelectionChanged ); mLayer = nullptr; } + for ( QString layerId : layers ) + { + mLastExpression.remove( layerId ); + } } void QgsStatisticalSummaryDockWidget::layerSelectionChanged() @@ -582,6 +604,9 @@ void QgsStatisticalSummaryDockWidget::refreshStatisticsMenu() break; } } + + mStatisticsMenu->addSeparator(); + mStatisticsMenu->addAction( mSyncAction ); } QgsStatisticalSummaryDockWidget::DataType QgsStatisticalSummaryDockWidget::fieldType( const QString &fieldName ) diff --git a/src/app/qgsstatisticalsummarydockwidget.h b/src/app/qgsstatisticalsummarydockwidget.h index fff2ea667a5..ee19e1e0066 100644 --- a/src/app/qgsstatisticalsummarydockwidget.h +++ b/src/app/qgsstatisticalsummarydockwidget.h @@ -114,6 +114,8 @@ class APP_EXPORT QgsStatisticalSummaryDockWidget : public QgsDockWidget, private QgsVectorLayer *mLayer = nullptr; QMap< int, QAction * > mStatsActions; + QMap< QString, QString > mLastExpression; + QAction *mSyncAction; void updateNumericStatistics(); void updateStringStatistics(); @@ -123,6 +125,7 @@ class APP_EXPORT QgsStatisticalSummaryDockWidget : public QgsDockWidget, private QgsExpressionContext createExpressionContext() const override; void refreshStatisticsMenu(); + void manageSyncLayer( bool checked ); DataType fieldType( const QString &fieldName ); QMenu *mStatisticsMenu = nullptr;