Merge pull request #46650 from Djedouas/sync-stats-panel

Option to synchronize statistics panel with layers panel
This commit is contained in:
Loïc Bartoletti 2022-03-23 15:33:55 +01:00 committed by GitHub
commit e338d8d0e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 2 deletions

View File

@ -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 )

View File

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