15
15
16
16
#include " qgsmeshrendereractivedatasetwidget.h"
17
17
18
+ #include < QDateTime>
19
+
18
20
#include " qgis.h"
19
21
#include " qgsmeshlayer.h"
20
22
#include " qgsmessagelog.h"
@@ -24,11 +26,19 @@ QgsMeshRendererActiveDatasetWidget::QgsMeshRendererActiveDatasetWidget( QWidget
24
26
: QWidget( parent )
25
27
{
26
28
setupUi ( this );
29
+
30
+ connect ( mTimeComboBox , qgis::overload<int >::of ( &QComboBox::currentIndexChanged ), this , &QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged );
31
+ connect ( mDatasetSlider , &QSlider::valueChanged, mTimeComboBox , &QComboBox::setCurrentIndex );
32
+
33
+ connect ( mFirstDatasetButton , &QToolButton::clicked, this , &QgsMeshRendererActiveDatasetWidget::onFirstTimeClicked );
34
+ connect ( mPreviousDatasetButton , &QToolButton::clicked, this , &QgsMeshRendererActiveDatasetWidget::onPreviousTimeClicked );
35
+ connect ( mNextDatasetButton , &QToolButton::clicked, this , &QgsMeshRendererActiveDatasetWidget::onNextTimeClicked );
36
+ connect ( mLastDatasetButton , &QToolButton::clicked, this , &QgsMeshRendererActiveDatasetWidget::onLastTimeClicked );
37
+
27
38
connect ( mDatasetGroupTreeView , &QgsMeshDatasetGroupTreeView::activeScalarGroupChanged,
28
39
this , &QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged );
29
40
connect ( mDatasetGroupTreeView , &QgsMeshDatasetGroupTreeView::activeVectorGroupChanged,
30
41
this , &QgsMeshRendererActiveDatasetWidget::onActiveVectorGroupChanged );
31
- connect ( mDatasetSlider , &QSlider::valueChanged, this , &QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged );
32
42
}
33
43
34
44
void QgsMeshRendererActiveDatasetWidget::setLayer ( QgsMeshLayer *layer )
@@ -57,18 +67,49 @@ QgsMeshDatasetIndex QgsMeshRendererActiveDatasetWidget::activeVectorDataset() co
57
67
return mActiveVectorDataset ;
58
68
}
59
69
60
- void QgsMeshRendererActiveDatasetWidget::setSliderRange ()
70
+ void QgsMeshRendererActiveDatasetWidget::setTimeRange ()
61
71
{
62
72
int datasetCount = 1 ;
73
+ int groupWithMaximumDatasets = -1 ;
74
+
63
75
if ( mMeshLayer && mMeshLayer ->dataProvider () )
64
76
{
65
77
for ( int i = 0 ; i < mMeshLayer ->dataProvider ()->datasetGroupCount (); ++i )
66
78
{
67
- datasetCount = std::max ( mMeshLayer ->dataProvider ()->datasetCount ( i ), datasetCount );
79
+ int currentCount = mMeshLayer ->dataProvider ()->datasetCount ( i );
80
+ if ( currentCount > datasetCount )
81
+ {
82
+ datasetCount = currentCount;
83
+ groupWithMaximumDatasets = i;
84
+ }
68
85
}
69
86
}
87
+
88
+ // update slider
70
89
mDatasetSlider ->setMinimum ( 0 );
71
90
mDatasetSlider ->setMaximum ( datasetCount - 1 );
91
+
92
+ // update combobox
93
+ mTimeComboBox ->clear ();
94
+ if ( groupWithMaximumDatasets > -1 )
95
+ {
96
+ for ( int i = 0 ; i < datasetCount; ++i )
97
+ {
98
+ QgsMeshDatasetIndex index ( groupWithMaximumDatasets, i );
99
+ QgsMeshDatasetMetadata meta = mMeshLayer ->dataProvider ()->datasetMetadata ( index );
100
+ double time = meta.time ();
101
+ mTimeComboBox ->addItem ( timeToString ( time ), time );
102
+ }
103
+ }
104
+
105
+ // enable/disable time controls depending on whether the data set is time varying
106
+ bool isTimeVarying = datasetCount > 1 ;
107
+ mTimeComboBox ->setEnabled ( isTimeVarying );
108
+ mDatasetSlider ->setEnabled ( isTimeVarying );
109
+ mFirstDatasetButton ->setEnabled ( isTimeVarying );
110
+ mPreviousDatasetButton ->setEnabled ( isTimeVarying );
111
+ mNextDatasetButton ->setEnabled ( isTimeVarying );
112
+ mLastDatasetButton ->setEnabled ( isTimeVarying );
72
113
}
73
114
74
115
void QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged ( int groupIndex )
@@ -79,8 +120,8 @@ void QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged( int groupIn
79
120
mActiveScalarDatasetGroup = groupIndex;
80
121
81
122
// keep the same timestep if possible
82
- int val = mDatasetSlider -> value ();
83
- onActiveDatasetChanged ( val );
123
+ int val = mTimeComboBox -> currentIndex ();
124
+ mTimeComboBox -> setCurrentIndex ( val );
84
125
emit activeScalarGroupChanged ( mActiveScalarDatasetGroup );
85
126
}
86
127
@@ -92,9 +133,8 @@ void QgsMeshRendererActiveDatasetWidget::onActiveVectorGroupChanged( int groupIn
92
133
mActiveVectorDatasetGroup = groupIndex;
93
134
94
135
// keep the same timestep if possible
95
- int val = mDatasetSlider ->value ();
96
- mDatasetSlider ->setValue ( val );
97
- onActiveDatasetChanged ( val );
136
+ int val = mTimeComboBox ->currentIndex ();
137
+ mTimeComboBox ->setCurrentIndex ( val );
98
138
emit activeVectorGroupChanged ( mActiveVectorDatasetGroup );
99
139
}
100
140
@@ -129,11 +169,36 @@ void QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged( int value )
129
169
130
170
if ( changed )
131
171
{
172
+ whileBlocking ( mDatasetSlider )->setValue ( value );
132
173
updateMetadata ();
133
174
emit widgetChanged ();
134
175
}
135
176
}
136
177
178
+ void QgsMeshRendererActiveDatasetWidget::onFirstTimeClicked ()
179
+ {
180
+ mTimeComboBox ->setCurrentIndex ( 0 );
181
+ }
182
+
183
+ void QgsMeshRendererActiveDatasetWidget::onPreviousTimeClicked ()
184
+ {
185
+ int idx = mTimeComboBox ->currentIndex () - 1 ;
186
+ if ( idx >= 0 )
187
+ mTimeComboBox ->setCurrentIndex ( idx );
188
+ }
189
+
190
+ void QgsMeshRendererActiveDatasetWidget::onNextTimeClicked ()
191
+ {
192
+ int idx = mTimeComboBox ->currentIndex () + 1 ;
193
+ if ( idx < mTimeComboBox ->count () )
194
+ mTimeComboBox ->setCurrentIndex ( idx );
195
+ }
196
+
197
+ void QgsMeshRendererActiveDatasetWidget::onLastTimeClicked ()
198
+ {
199
+ mTimeComboBox ->setCurrentIndex ( mTimeComboBox ->count () - 1 );
200
+ }
201
+
137
202
void QgsMeshRendererActiveDatasetWidget::updateMetadata ()
138
203
{
139
204
QString msg;
@@ -183,6 +248,12 @@ void QgsMeshRendererActiveDatasetWidget::updateMetadata()
183
248
mActiveDatasetMetadata ->setText ( msg );
184
249
}
185
250
251
+ QString QgsMeshRendererActiveDatasetWidget::timeToString ( double val )
252
+ {
253
+ // time val should be in hours
254
+ qint64 seconds = static_cast <qint64>( val * 3600.0 );
255
+ return QDateTime::fromSecsSinceEpoch ( seconds ).toString ( " hh:mm:ss" );
256
+ }
186
257
187
258
QString QgsMeshRendererActiveDatasetWidget::metadata ( QgsMeshDatasetIndex datasetIndex )
188
259
{
@@ -240,13 +311,15 @@ void QgsMeshRendererActiveDatasetWidget::syncToLayer()
240
311
mActiveVectorDataset = QgsMeshDatasetIndex ();
241
312
}
242
313
243
- setSliderRange ();
314
+ setTimeRange ();
244
315
245
316
int val = 0 ;
246
317
if ( mActiveScalarDataset .isValid () )
247
318
val = mActiveScalarDataset .dataset ();
248
319
else if ( mActiveVectorDataset .isValid () )
249
320
val = mActiveVectorDataset .dataset ();
250
- mDatasetSlider ->setValue ( val );
251
- onActiveDatasetChanged ( val );
321
+
322
+ whileBlocking ( mTimeComboBox )->setCurrentIndex ( val );
323
+ whileBlocking ( mDatasetSlider )->setValue ( val );
324
+ updateMetadata ();
252
325
}
0 commit comments