Skip to content

Commit 3032af2

Browse files
committed
[mesh] add fundamental support for time handling
1 parent a0292c3 commit 3032af2

3 files changed

+164
-31
lines changed

src/app/mesh/qgsmeshrendereractivedatasetwidget.cpp

+84-11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
#include "qgsmeshrendereractivedatasetwidget.h"
1717

18+
#include <QDateTime>
19+
1820
#include "qgis.h"
1921
#include "qgsmeshlayer.h"
2022
#include "qgsmessagelog.h"
@@ -24,11 +26,19 @@ QgsMeshRendererActiveDatasetWidget::QgsMeshRendererActiveDatasetWidget( QWidget
2426
: QWidget( parent )
2527
{
2628
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+
2738
connect( mDatasetGroupTreeView, &QgsMeshDatasetGroupTreeView::activeScalarGroupChanged,
2839
this, &QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged );
2940
connect( mDatasetGroupTreeView, &QgsMeshDatasetGroupTreeView::activeVectorGroupChanged,
3041
this, &QgsMeshRendererActiveDatasetWidget::onActiveVectorGroupChanged );
31-
connect( mDatasetSlider, &QSlider::valueChanged, this, &QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged );
3242
}
3343

3444
void QgsMeshRendererActiveDatasetWidget::setLayer( QgsMeshLayer *layer )
@@ -57,18 +67,49 @@ QgsMeshDatasetIndex QgsMeshRendererActiveDatasetWidget::activeVectorDataset() co
5767
return mActiveVectorDataset;
5868
}
5969

60-
void QgsMeshRendererActiveDatasetWidget::setSliderRange()
70+
void QgsMeshRendererActiveDatasetWidget::setTimeRange()
6171
{
6272
int datasetCount = 1;
73+
int groupWithMaximumDatasets = -1;
74+
6375
if ( mMeshLayer && mMeshLayer->dataProvider() )
6476
{
6577
for ( int i = 0; i < mMeshLayer->dataProvider()->datasetGroupCount(); ++i )
6678
{
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+
}
6885
}
6986
}
87+
88+
// update slider
7089
mDatasetSlider->setMinimum( 0 );
7190
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 );
72113
}
73114

74115
void QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged( int groupIndex )
@@ -79,8 +120,8 @@ void QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged( int groupIn
79120
mActiveScalarDatasetGroup = groupIndex;
80121

81122
// keep the same timestep if possible
82-
int val = mDatasetSlider->value();
83-
onActiveDatasetChanged( val );
123+
int val = mTimeComboBox->currentIndex();
124+
mTimeComboBox->setCurrentIndex( val );
84125
emit activeScalarGroupChanged( mActiveScalarDatasetGroup );
85126
}
86127

@@ -92,9 +133,8 @@ void QgsMeshRendererActiveDatasetWidget::onActiveVectorGroupChanged( int groupIn
92133
mActiveVectorDatasetGroup = groupIndex;
93134

94135
// 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 );
98138
emit activeVectorGroupChanged( mActiveVectorDatasetGroup );
99139
}
100140

@@ -129,11 +169,36 @@ void QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged( int value )
129169

130170
if ( changed )
131171
{
172+
whileBlocking( mDatasetSlider )->setValue( value );
132173
updateMetadata();
133174
emit widgetChanged();
134175
}
135176
}
136177

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+
137202
void QgsMeshRendererActiveDatasetWidget::updateMetadata()
138203
{
139204
QString msg;
@@ -183,6 +248,12 @@ void QgsMeshRendererActiveDatasetWidget::updateMetadata()
183248
mActiveDatasetMetadata->setText( msg );
184249
}
185250

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+
}
186257

187258
QString QgsMeshRendererActiveDatasetWidget::metadata( QgsMeshDatasetIndex datasetIndex )
188259
{
@@ -240,13 +311,15 @@ void QgsMeshRendererActiveDatasetWidget::syncToLayer()
240311
mActiveVectorDataset = QgsMeshDatasetIndex();
241312
}
242313

243-
setSliderRange();
314+
setTimeRange();
244315

245316
int val = 0;
246317
if ( mActiveScalarDataset.isValid() )
247318
val = mActiveScalarDataset.dataset();
248319
else if ( mActiveVectorDataset.isValid() )
249320
val = mActiveVectorDataset.dataset();
250-
mDatasetSlider->setValue( val );
251-
onActiveDatasetChanged( val );
321+
322+
whileBlocking( mTimeComboBox )->setCurrentIndex( val );
323+
whileBlocking( mDatasetSlider )->setValue( val );
324+
updateMetadata();
252325
}

src/app/mesh/qgsmeshrendereractivedatasetwidget.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,18 @@ class APP_EXPORT QgsMeshRendererActiveDatasetWidget : public QWidget, private Ui
8282
void onActiveScalarGroupChanged( int groupIndex );
8383
void onActiveVectorGroupChanged( int groupIndex );
8484
void onActiveDatasetChanged( int value );
85-
void updateMetadata( );
85+
void onFirstTimeClicked();
86+
void onPreviousTimeClicked();
87+
void onNextTimeClicked();
88+
void onLastTimeClicked();
89+
8690
QString metadata( QgsMeshDatasetIndex datasetIndex );
8791

8892
private:
8993
//! Loop through all dataset groups and find the maximum number of datasets
90-
void setSliderRange();
94+
void setTimeRange();
95+
void updateMetadata();
96+
QString timeToString( double val );
9197

9298
QgsMeshLayer *mMeshLayer = nullptr; // not owned
9399
int mActiveScalarDatasetGroup = -1;

src/ui/mesh/qgsmeshrendereractivedatasetwidgetbase.ui

+72-18
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<rect>
1010
<x>0</x>
1111
<y>0</y>
12-
<width>319</width>
13-
<height>317</height>
12+
<width>286</width>
13+
<height>337</height>
1414
</rect>
1515
</property>
1616
<property name="windowTitle">
@@ -35,17 +35,71 @@
3535
</widget>
3636
</item>
3737
<item>
38-
<widget class="QSlider" name="mDatasetSlider">
39-
<property name="orientation">
40-
<enum>Qt::Horizontal</enum>
41-
</property>
42-
<property name="tickPosition">
43-
<enum>QSlider::TicksBelow</enum>
44-
</property>
45-
<property name="tickInterval">
46-
<number>1</number>
47-
</property>
48-
</widget>
38+
<layout class="QGridLayout" name="mTimeLayout">
39+
<item row="0" column="0" colspan="6">
40+
<widget class="QSlider" name="mDatasetSlider">
41+
<property name="orientation">
42+
<enum>Qt::Horizontal</enum>
43+
</property>
44+
<property name="tickPosition">
45+
<enum>QSlider::TicksBelow</enum>
46+
</property>
47+
<property name="tickInterval">
48+
<number>1</number>
49+
</property>
50+
</widget>
51+
</item>
52+
<item row="1" column="5">
53+
<widget class="QToolButton" name="mLastDatasetButton">
54+
<property name="text">
55+
<string>&gt;|</string>
56+
</property>
57+
<property name="autoRaise">
58+
<bool>true</bool>
59+
</property>
60+
</widget>
61+
</item>
62+
<item row="1" column="4">
63+
<widget class="QToolButton" name="mNextDatasetButton">
64+
<property name="text">
65+
<string>&gt;</string>
66+
</property>
67+
<property name="autoRaise">
68+
<bool>true</bool>
69+
</property>
70+
</widget>
71+
</item>
72+
<item row="1" column="3">
73+
<widget class="QToolButton" name="mPreviousDatasetButton">
74+
<property name="text">
75+
<string>&lt;</string>
76+
</property>
77+
<property name="autoRaise">
78+
<bool>true</bool>
79+
</property>
80+
</widget>
81+
</item>
82+
<item row="1" column="2">
83+
<widget class="QToolButton" name="mFirstDatasetButton">
84+
<property name="text">
85+
<string>|&lt;</string>
86+
</property>
87+
<property name="autoRaise">
88+
<bool>true</bool>
89+
</property>
90+
</widget>
91+
</item>
92+
<item row="1" column="0" colspan="2">
93+
<widget class="QComboBox" name="mTimeComboBox">
94+
<property name="editable">
95+
<bool>true</bool>
96+
</property>
97+
<property name="insertPolicy">
98+
<enum>QComboBox::NoInsert</enum>
99+
</property>
100+
</widget>
101+
</item>
102+
</layout>
49103
</item>
50104
<item>
51105
<widget class="QgsCollapsibleGroupBox" name="mActiveDatasetMetadataGroup">
@@ -69,17 +123,17 @@
69123
</layout>
70124
</widget>
71125
<customwidgets>
72-
<customwidget>
73-
<class>QgsMeshDatasetGroupTreeView</class>
74-
<extends>QTreeView</extends>
75-
<header>mesh/qgsmeshdatasetgrouptreeview.h</header>
76-
</customwidget>
77126
<customwidget>
78127
<class>QgsCollapsibleGroupBox</class>
79128
<extends>QGroupBox</extends>
80129
<header>qgscollapsiblegroupbox.h</header>
81130
<container>1</container>
82131
</customwidget>
132+
<customwidget>
133+
<class>QgsMeshDatasetGroupTreeView</class>
134+
<extends>QTreeView</extends>
135+
<header>mesh/qgsmeshdatasetgrouptreeview.h</header>
136+
</customwidget>
83137
</customwidgets>
84138
<resources/>
85139
<connections/>

0 commit comments

Comments
 (0)