Skip to content

Commit

Permalink
[mesh] add fundamental support for time handling
Browse files Browse the repository at this point in the history
  • Loading branch information
PeterPetrik committed Sep 30, 2018
1 parent a0292c3 commit 3032af2
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 31 deletions.
95 changes: 84 additions & 11 deletions src/app/mesh/qgsmeshrendereractivedatasetwidget.cpp
Expand Up @@ -15,6 +15,8 @@

#include "qgsmeshrendereractivedatasetwidget.h"

#include <QDateTime>

#include "qgis.h"
#include "qgsmeshlayer.h"
#include "qgsmessagelog.h"
Expand All @@ -24,11 +26,19 @@ QgsMeshRendererActiveDatasetWidget::QgsMeshRendererActiveDatasetWidget( QWidget
: QWidget( parent )
{
setupUi( this );

connect( mTimeComboBox, qgis::overload<int>::of( &QComboBox::currentIndexChanged ), this, &QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged );
connect( mDatasetSlider, &QSlider::valueChanged, mTimeComboBox, &QComboBox::setCurrentIndex );

connect( mFirstDatasetButton, &QToolButton::clicked, this, &QgsMeshRendererActiveDatasetWidget::onFirstTimeClicked );
connect( mPreviousDatasetButton, &QToolButton::clicked, this, &QgsMeshRendererActiveDatasetWidget::onPreviousTimeClicked );
connect( mNextDatasetButton, &QToolButton::clicked, this, &QgsMeshRendererActiveDatasetWidget::onNextTimeClicked );
connect( mLastDatasetButton, &QToolButton::clicked, this, &QgsMeshRendererActiveDatasetWidget::onLastTimeClicked );

connect( mDatasetGroupTreeView, &QgsMeshDatasetGroupTreeView::activeScalarGroupChanged,
this, &QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged );
connect( mDatasetGroupTreeView, &QgsMeshDatasetGroupTreeView::activeVectorGroupChanged,
this, &QgsMeshRendererActiveDatasetWidget::onActiveVectorGroupChanged );
connect( mDatasetSlider, &QSlider::valueChanged, this, &QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged );
}

void QgsMeshRendererActiveDatasetWidget::setLayer( QgsMeshLayer *layer )
Expand Down Expand Up @@ -57,18 +67,49 @@ QgsMeshDatasetIndex QgsMeshRendererActiveDatasetWidget::activeVectorDataset() co
return mActiveVectorDataset;
}

void QgsMeshRendererActiveDatasetWidget::setSliderRange()
void QgsMeshRendererActiveDatasetWidget::setTimeRange()
{
int datasetCount = 1;
int groupWithMaximumDatasets = -1;

if ( mMeshLayer && mMeshLayer->dataProvider() )
{
for ( int i = 0; i < mMeshLayer->dataProvider()->datasetGroupCount(); ++i )
{
datasetCount = std::max( mMeshLayer->dataProvider()->datasetCount( i ), datasetCount );
int currentCount = mMeshLayer->dataProvider()->datasetCount( i );
if ( currentCount > datasetCount )
{
datasetCount = currentCount;
groupWithMaximumDatasets = i;
}
}
}

// update slider
mDatasetSlider->setMinimum( 0 );
mDatasetSlider->setMaximum( datasetCount - 1 );

// update combobox
mTimeComboBox->clear();
if ( groupWithMaximumDatasets > -1 )
{
for ( int i = 0; i < datasetCount; ++i )
{
QgsMeshDatasetIndex index( groupWithMaximumDatasets, i );
QgsMeshDatasetMetadata meta = mMeshLayer->dataProvider()->datasetMetadata( index );
double time = meta.time();
mTimeComboBox->addItem( timeToString( time ), time );
}
}

// enable/disable time controls depending on whether the data set is time varying
bool isTimeVarying = datasetCount > 1;
mTimeComboBox->setEnabled( isTimeVarying );
mDatasetSlider->setEnabled( isTimeVarying );
mFirstDatasetButton->setEnabled( isTimeVarying );
mPreviousDatasetButton->setEnabled( isTimeVarying );
mNextDatasetButton->setEnabled( isTimeVarying );
mLastDatasetButton->setEnabled( isTimeVarying );
}

void QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged( int groupIndex )
Expand All @@ -79,8 +120,8 @@ void QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged( int groupIn
mActiveScalarDatasetGroup = groupIndex;

// keep the same timestep if possible
int val = mDatasetSlider->value();
onActiveDatasetChanged( val );
int val = mTimeComboBox->currentIndex();
mTimeComboBox->setCurrentIndex( val );
emit activeScalarGroupChanged( mActiveScalarDatasetGroup );
}

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

// keep the same timestep if possible
int val = mDatasetSlider->value();
mDatasetSlider->setValue( val );
onActiveDatasetChanged( val );
int val = mTimeComboBox->currentIndex();
mTimeComboBox->setCurrentIndex( val );
emit activeVectorGroupChanged( mActiveVectorDatasetGroup );
}

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

if ( changed )
{
whileBlocking( mDatasetSlider )->setValue( value );
updateMetadata();
emit widgetChanged();
}
}

void QgsMeshRendererActiveDatasetWidget::onFirstTimeClicked()
{
mTimeComboBox->setCurrentIndex( 0 );
}

void QgsMeshRendererActiveDatasetWidget::onPreviousTimeClicked()
{
int idx = mTimeComboBox->currentIndex() - 1;
if ( idx >= 0 )
mTimeComboBox->setCurrentIndex( idx );
}

void QgsMeshRendererActiveDatasetWidget::onNextTimeClicked()
{
int idx = mTimeComboBox->currentIndex() + 1;
if ( idx < mTimeComboBox->count() )
mTimeComboBox->setCurrentIndex( idx );
}

void QgsMeshRendererActiveDatasetWidget::onLastTimeClicked()
{
mTimeComboBox->setCurrentIndex( mTimeComboBox->count() - 1 );
}

void QgsMeshRendererActiveDatasetWidget::updateMetadata()
{
QString msg;
Expand Down Expand Up @@ -183,6 +248,12 @@ void QgsMeshRendererActiveDatasetWidget::updateMetadata()
mActiveDatasetMetadata->setText( msg );
}

QString QgsMeshRendererActiveDatasetWidget::timeToString( double val )
{
// time val should be in hours
qint64 seconds = static_cast<qint64>( val * 3600.0 );
return QDateTime::fromSecsSinceEpoch( seconds ).toString( "hh:mm:ss" );
}

QString QgsMeshRendererActiveDatasetWidget::metadata( QgsMeshDatasetIndex datasetIndex )
{
Expand Down Expand Up @@ -240,13 +311,15 @@ void QgsMeshRendererActiveDatasetWidget::syncToLayer()
mActiveVectorDataset = QgsMeshDatasetIndex();
}

setSliderRange();
setTimeRange();

int val = 0;
if ( mActiveScalarDataset.isValid() )
val = mActiveScalarDataset.dataset();
else if ( mActiveVectorDataset.isValid() )
val = mActiveVectorDataset.dataset();
mDatasetSlider->setValue( val );
onActiveDatasetChanged( val );

whileBlocking( mTimeComboBox )->setCurrentIndex( val );
whileBlocking( mDatasetSlider )->setValue( val );
updateMetadata();
}
10 changes: 8 additions & 2 deletions src/app/mesh/qgsmeshrendereractivedatasetwidget.h
Expand Up @@ -82,12 +82,18 @@ class APP_EXPORT QgsMeshRendererActiveDatasetWidget : public QWidget, private Ui
void onActiveScalarGroupChanged( int groupIndex );
void onActiveVectorGroupChanged( int groupIndex );
void onActiveDatasetChanged( int value );
void updateMetadata( );
void onFirstTimeClicked();
void onPreviousTimeClicked();
void onNextTimeClicked();
void onLastTimeClicked();

QString metadata( QgsMeshDatasetIndex datasetIndex );

private:
//! Loop through all dataset groups and find the maximum number of datasets
void setSliderRange();
void setTimeRange();
void updateMetadata();
QString timeToString( double val );

QgsMeshLayer *mMeshLayer = nullptr; // not owned
int mActiveScalarDatasetGroup = -1;
Expand Down
90 changes: 72 additions & 18 deletions src/ui/mesh/qgsmeshrendereractivedatasetwidgetbase.ui
Expand Up @@ -9,8 +9,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>319</width>
<height>317</height>
<width>286</width>
<height>337</height>
</rect>
</property>
<property name="windowTitle">
Expand All @@ -35,17 +35,71 @@
</widget>
</item>
<item>
<widget class="QSlider" name="mDatasetSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>1</number>
</property>
</widget>
<layout class="QGridLayout" name="mTimeLayout">
<item row="0" column="0" colspan="6">
<widget class="QSlider" name="mDatasetSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>1</number>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QToolButton" name="mLastDatasetButton">
<property name="text">
<string>&gt;|</string>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QToolButton" name="mNextDatasetButton">
<property name="text">
<string>&gt;</string>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QToolButton" name="mPreviousDatasetButton">
<property name="text">
<string>&lt;</string>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QToolButton" name="mFirstDatasetButton">
<property name="text">
<string>|&lt;</string>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QComboBox" name="mTimeComboBox">
<property name="editable">
<bool>true</bool>
</property>
<property name="insertPolicy">
<enum>QComboBox::NoInsert</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="mActiveDatasetMetadataGroup">
Expand All @@ -69,17 +123,17 @@
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsMeshDatasetGroupTreeView</class>
<extends>QTreeView</extends>
<header>mesh/qgsmeshdatasetgrouptreeview.h</header>
</customwidget>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsMeshDatasetGroupTreeView</class>
<extends>QTreeView</extends>
<header>mesh/qgsmeshdatasetgrouptreeview.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
Expand Down

0 comments on commit 3032af2

Please sign in to comment.