Skip to content

Commit c151ad0

Browse files
committed
correctly handle toggling statistics visibility (fix #16117)
1 parent 7ff644e commit c151ad0

File tree

2 files changed

+89
-46
lines changed

2 files changed

+89
-46
lines changed

src/app/qgsstatisticalsummarydockwidget.cpp

+87-45
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
#include <QTableWidget>
2424
#include <QAction>
2525
#include <QMenu>
26-
#include <QDebug>
2726

2827
QList< QgsStatisticalSummary::Statistic > QgsStatisticalSummaryDockWidget::sDisplayStats =
2928
QList< QgsStatisticalSummary::Statistic > () << QgsStatisticalSummary::Count
@@ -96,7 +95,9 @@ QgsStatisticalSummaryDockWidget::QgsStatisticalSummaryDockWidget( QWidget *paren
9695

9796
mStatisticsMenu = new QMenu( mOptionsToolButton );
9897
mOptionsToolButton->setMenu( mStatisticsMenu );
99-
refreshStatisticsMenu( QVariant::Int );
98+
99+
mFieldType = QVariant::Int;
100+
refreshStatisticsMenu();
100101
}
101102

102103
QgsStatisticalSummaryDockWidget::~QgsStatisticalSummaryDockWidget()
@@ -106,48 +107,42 @@ QgsStatisticalSummaryDockWidget::~QgsStatisticalSummaryDockWidget()
106107

107108
void QgsStatisticalSummaryDockWidget::refreshStatistics()
108109
{
109-
qDebug() << "refreshStatistics called...";
110110
if ( !mLayer || ( mFieldExpressionWidget->isExpression() && !mFieldExpressionWidget->isValidExpression() ) )
111111
{
112112
mStatisticsTable->setRowCount( 0 );
113113
return;
114114
}
115115

116-
// non numeric field?
117-
bool isNumeric = true;
118-
QVariant::Type fieldType = QVariant::Double;
116+
// determine field type
117+
mFieldType = QVariant::Double;
119118
if ( !mFieldExpressionWidget->isExpression() )
120119
{
121120
QString field = mFieldExpressionWidget->currentField();
122-
fieldType = mLayer->fields().field( mLayer->fields().lookupField( field ) ).type();
123-
if ( fieldType == QVariant::String || fieldType == QVariant::Date || fieldType == QVariant::DateTime )
124-
{
125-
isNumeric = false;
126-
}
121+
mFieldType = mLayer->fields().field( mLayer->fields().lookupField( field ) ).type();
127122
}
128123

124+
refreshStatisticsMenu();
125+
129126
bool selectedOnly = mSelectedOnlyCheckBox->isChecked();
130127

131-
if ( isNumeric )
132-
{
133-
refreshStatisticsMenu( QVariant::Int );
134-
updateNumericStatistics( selectedOnly );
135-
}
136-
else
128+
switch ( mFieldType )
137129
{
138-
refreshStatisticsMenu( fieldType );
139-
switch ( fieldType )
140-
{
141-
case QVariant::String:
142-
updateStringStatistics( selectedOnly );
143-
break;
144-
case QVariant::Date:
145-
case QVariant::DateTime:
146-
updateDateTimeStatistics( selectedOnly );
147-
break;
148-
default:
149-
break;
150-
}
130+
case QVariant::Int:
131+
case QVariant::UInt:
132+
case QVariant::Double:
133+
case QVariant::LongLong:
134+
case QVariant::ULongLong:
135+
updateNumericStatistics( selectedOnly );
136+
break;
137+
case QVariant::String:
138+
updateStringStatistics( selectedOnly );
139+
break;
140+
case QVariant::Date:
141+
case QVariant::DateTime:
142+
updateDateTimeStatistics( selectedOnly );
143+
break;
144+
default:
145+
break;
151146
}
152147
}
153148

@@ -217,15 +212,26 @@ void QgsStatisticalSummaryDockWidget::updateStringStatistics( bool selectedOnly
217212
return;
218213
}
219214

215+
QList< QgsStringStatisticalSummary::Statistic > statsToDisplay;
216+
QgsStringStatisticalSummary::Statistics statsToCalc = 0;
217+
Q_FOREACH ( QgsStringStatisticalSummary::Statistic stat, sDisplayStringStats )
218+
{
219+
if ( mStatsActions.value( stat )->isChecked() )
220+
{
221+
statsToDisplay << stat;
222+
statsToCalc |= stat;
223+
}
224+
}
225+
220226
QgsStringStatisticalSummary stats;
221-
stats.setStatistics( QgsStringStatisticalSummary::All );
227+
stats.setStatistics( statsToCalc );
222228
stats.calculateFromVariants( values );
223229

224-
mStatisticsTable->setRowCount( sDisplayStringStats.count() );
230+
mStatisticsTable->setRowCount( statsToDisplay.count() );
225231
mStatisticsTable->setColumnCount( 2 );
226232

227233
int row = 0;
228-
Q_FOREACH ( QgsStringStatisticalSummary::Statistic stat, sDisplayStringStats )
234+
Q_FOREACH ( QgsStringStatisticalSummary::Statistic stat, statsToDisplay )
229235
{
230236
addRow( row, QgsStringStatisticalSummary::displayName( stat ),
231237
stats.statistic( stat ).toString(),
@@ -263,18 +269,38 @@ void QgsStatisticalSummaryDockWidget::layerChanged( QgsMapLayer *layer )
263269

264270
void QgsStatisticalSummaryDockWidget::statActionTriggered( bool checked )
265271
{
266-
qDebug() << "statActionTriggered called...";
267272
QAction *action = dynamic_cast<QAction *>( sender() );
268273
int stat = action->data().toInt();
269274

275+
QString settingsKey;
276+
switch ( mFieldType )
277+
{
278+
case QVariant::Int:
279+
case QVariant::UInt:
280+
case QVariant::Double:
281+
case QVariant::LongLong:
282+
case QVariant::ULongLong:
283+
settingsKey = QStringLiteral( "numeric" );
284+
break;
285+
case QVariant::String:
286+
settingsKey = QStringLiteral( "string" );
287+
break;
288+
case QVariant::Date:
289+
case QVariant::DateTime:
290+
settingsKey = QStringLiteral( "datetime" );
291+
break;
292+
default:
293+
break;
294+
}
295+
270296
QgsSettings settings;
271297
if ( stat >= 0 )
272298
{
273-
settings.setValue( QStringLiteral( "StatisticalSummaryDock/checked_%1" ).arg( stat ), checked );
299+
settings.setValue( QStringLiteral( "StatisticalSummaryDock/%1_%2" ).arg( settingsKey ).arg( stat ), checked );
274300
}
275301
else if ( stat == MISSING_VALUES )
276302
{
277-
settings.setValue( QStringLiteral( "StatisticalSummaryDock/checked_missing_values" ).arg( stat ), checked );
303+
settings.setValue( QStringLiteral( "StatisticalSummaryDock/numeric_missing_values" ), checked );
278304
}
279305

280306
refreshStatistics();
@@ -307,15 +333,27 @@ void QgsStatisticalSummaryDockWidget::updateDateTimeStatistics( bool selectedOnl
307333
return;
308334
}
309335

336+
QList< QgsDateTimeStatisticalSummary::Statistic > statsToDisplay;
337+
QgsDateTimeStatisticalSummary::Statistics statsToCalc = 0;
338+
Q_FOREACH ( QgsDateTimeStatisticalSummary::Statistic stat, sDisplayDateTimeStats )
339+
{
340+
if ( mStatsActions.value( stat )->isChecked() )
341+
{
342+
statsToDisplay << stat;
343+
statsToCalc |= stat;
344+
}
345+
}
346+
347+
310348
QgsDateTimeStatisticalSummary stats;
311-
stats.setStatistics( QgsDateTimeStatisticalSummary::All );
349+
stats.setStatistics( statsToCalc );
312350
stats.calculate( values );
313351

314-
mStatisticsTable->setRowCount( sDisplayDateTimeStats.count() );
352+
mStatisticsTable->setRowCount( statsToDisplay.count() );
315353
mStatisticsTable->setColumnCount( 2 );
316354

317355
int row = 0;
318-
Q_FOREACH ( QgsDateTimeStatisticalSummary::Statistic stat, sDisplayDateTimeStats )
356+
Q_FOREACH ( QgsDateTimeStatisticalSummary::Statistic stat, statsToDisplay )
319357
{
320358
QString value = ( stat == QgsDateTimeStatisticalSummary::Range
321359
? tr( "%1 seconds" ).arg( stats.range().seconds() )
@@ -346,21 +384,25 @@ void QgsStatisticalSummaryDockWidget::addRow( int row, const QString &name, cons
346384
mStatisticsTable->setItem( row, 1, valueItem );
347385
}
348386

349-
void QgsStatisticalSummaryDockWidget::refreshStatisticsMenu( QVariant::Type fieldType )
387+
void QgsStatisticalSummaryDockWidget::refreshStatisticsMenu()
350388
{
351389
mStatisticsMenu->clear();
352390
mStatsActions.clear();
353391

354392
QgsSettings settings;
355-
switch ( fieldType )
393+
switch ( mFieldType )
356394
{
357395
case QVariant::Int:
396+
case QVariant::UInt:
397+
case QVariant::Double:
398+
case QVariant::LongLong:
399+
case QVariant::ULongLong:
358400
{
359401
Q_FOREACH ( QgsStatisticalSummary::Statistic stat, sDisplayStats )
360402
{
361403
QAction *action = new QAction( QgsStatisticalSummary::displayName( stat ), mStatisticsMenu );
362404
action->setCheckable( true );
363-
bool checked = settings.value( QStringLiteral( "StatisticalSummaryDock/checked_%1" ).arg( stat ), true ).toBool();
405+
bool checked = settings.value( QStringLiteral( "StatisticalSummaryDock/numeric_%1" ).arg( stat ), true ).toBool();
364406
action->setChecked( checked );
365407
action->setData( stat );
366408
mStatsActions.insert( stat, action );
@@ -371,7 +413,7 @@ void QgsStatisticalSummaryDockWidget::refreshStatisticsMenu( QVariant::Type fiel
371413
//count of null values statistic
372414
QAction *nullCountAction = new QAction( tr( "Missing (null) values" ), mStatisticsMenu );
373415
nullCountAction->setCheckable( true );
374-
bool checked = settings.value( QStringLiteral( "StatisticalSummaryDock/checked_missing_values" ), true ).toBool();
416+
bool checked = settings.value( QStringLiteral( "StatisticalSummaryDock/numeric_missing_values" ), true ).toBool();
375417
nullCountAction->setChecked( checked );
376418
nullCountAction->setData( MISSING_VALUES );
377419
mStatsActions.insert( MISSING_VALUES, nullCountAction );
@@ -386,7 +428,7 @@ void QgsStatisticalSummaryDockWidget::refreshStatisticsMenu( QVariant::Type fiel
386428
{
387429
QAction *action = new QAction( QgsStringStatisticalSummary::displayName( stat ), mStatisticsMenu );
388430
action->setCheckable( true );
389-
bool checked = settings.value( QStringLiteral( "StatisticalSummaryDock/checked_%1" ).arg( stat ), true ).toBool();
431+
bool checked = settings.value( QStringLiteral( "StatisticalSummaryDock/string_%1" ).arg( stat ), true ).toBool();
390432
action->setChecked( checked );
391433
action->setData( stat );
392434
mStatsActions.insert( stat, action );
@@ -402,7 +444,7 @@ void QgsStatisticalSummaryDockWidget::refreshStatisticsMenu( QVariant::Type fiel
402444
{
403445
QAction *action = new QAction( QgsDateTimeStatisticalSummary::displayName( stat ), mStatisticsMenu );
404446
action->setCheckable( true );
405-
bool checked = settings.value( QStringLiteral( "StatisticalSummaryDock/checked_%1" ).arg( stat ), true ).toBool();
447+
bool checked = settings.value( QStringLiteral( "StatisticalSummaryDock/datetime_%1" ).arg( stat ), true ).toBool();
406448
action->setChecked( checked );
407449
action->setData( stat );
408450
mStatsActions.insert( stat, action );

src/app/qgsstatisticalsummarydockwidget.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ class APP_EXPORT QgsStatisticalSummaryDockWidget : public QgsDockWidget, private
7676

7777
QgsExpressionContext createExpressionContext() const override;
7878

79-
void refreshStatisticsMenu( QVariant::Type fieldType );
79+
void refreshStatisticsMenu();
8080

8181
QMenu *mStatisticsMenu = nullptr;
82+
QVariant::Type mFieldType;
8283
};
8384

8485
#endif // QGSSTATISTICALSUMMARYDOCKWIDGET_H

0 commit comments

Comments
 (0)