Skip to content

Commit f0ede77

Browse files
PeterPetriknyalldawson
authored andcommittedSep 3, 2018
[mesh] [feature] allow to choose different vector and scalar dataset
1 parent 3f85938 commit f0ede77

13 files changed

+973
-212
lines changed
 

‎images/images.qrc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,8 +526,10 @@
526526
<file>themes/default/propertyicons/locale.svg</file>
527527
<file>themes/default/propertyicons/map_tools.svg</file>
528528
<file>themes/default/propertyicons/meshcontours.svg</file>
529+
<file>themes/default/propertyicons/meshcontoursoff.svg</file>
529530
<file>themes/default/propertyicons/meshframe.svg</file>
530531
<file>themes/default/propertyicons/meshvectors.svg</file>
532+
<file>themes/default/propertyicons/meshvectorsoff.svg</file>
531533
<file>themes/default/propertyicons/metadata.svg</file>
532534
<file>themes/default/propertyicons/network_and_proxy.svg</file>
533535
<file>themes/default/propertyicons/overlay.svg</file>
Lines changed: 200 additions & 0 deletions

Error rendering embedded code

Invalid image source.

‎images/themes/default/propertyicons/meshvectors.svg

Lines changed: 28 additions & 19 deletions

Error rendering embedded code

Invalid image source.

Lines changed: 213 additions & 0 deletions

Error rendering embedded code

Invalid image source.

‎python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Returns a dataset index within group()
4545
Returns whether index is valid, ie at least groups is set
4646
%End
4747
bool operator == ( const QgsMeshDatasetIndex &other ) const;
48+
bool operator != ( const QgsMeshDatasetIndex &other ) const;
4849
};
4950

5051
typedef QgsPoint QgsMeshVertex;

‎src/app/mesh/qgsmeshdatasetgrouptreeview.cpp

Lines changed: 257 additions & 76 deletions
Large diffs are not rendered by default.

‎src/app/mesh/qgsmeshdatasetgrouptreeview.h

Lines changed: 87 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <QVector>
2525
#include <QItemSelection>
2626
#include <QStandardItemModel>
27+
#include <QStyledItemDelegate>
2728
#include <QList>
2829
#include <memory>
2930

@@ -39,32 +40,38 @@ class QgsMeshLayer;
3940
*
4041
* Groups:
4142
* Depth
42-
* - Maximum/Depth
43+
* - Maximum
4344
* Velocity
4445
* Wind speed
45-
* - Maximum/Wind Speed
46+
* - Maximum
4647
*/
4748
class APP_NO_EXPORT QgsMeshDatasetGroupTreeItem
4849
{
4950
public:
5051
QgsMeshDatasetGroupTreeItem( QgsMeshDatasetGroupTreeItem *parent = nullptr );
51-
QgsMeshDatasetGroupTreeItem( const QString &name, QgsMeshDatasetGroupTreeItem *parent = nullptr );
52+
QgsMeshDatasetGroupTreeItem( const QString &name,
53+
bool isVector,
54+
int index,
55+
QgsMeshDatasetGroupTreeItem *parent = nullptr );
5256
~QgsMeshDatasetGroupTreeItem();
5357

5458
void appendChild( QgsMeshDatasetGroupTreeItem *node );
5559
QgsMeshDatasetGroupTreeItem *child( int row ) const;
56-
int columnCount() const;
5760
int childCount() const;
5861
QgsMeshDatasetGroupTreeItem *parentItem() const;
5962
int row() const;
60-
QVariant data( int column ) const;
63+
QString name() const;
64+
bool isVector() const;
65+
int datasetGroupIndex() const;
6166

6267
private:
6368
QgsMeshDatasetGroupTreeItem *mParent = nullptr;
6469
QList< QgsMeshDatasetGroupTreeItem * > mChildren;
6570

6671
// Data
6772
QString mName;
73+
bool mIsVector = false;
74+
int mDatasetGroupIndex = -1;
6875
};
6976

7077
/**
@@ -73,8 +80,16 @@ class APP_NO_EXPORT QgsMeshDatasetGroupTreeItem
7380
class APP_NO_EXPORT QgsMeshDatasetGroupTreeModel : public QAbstractItemModel
7481
{
7582
Q_OBJECT
76-
7783
public:
84+
enum Roles
85+
{
86+
Name = Qt::UserRole,
87+
IsVector,
88+
IsActiveScalarDatasetGroup,
89+
IsActiveVectorDatasetGroup,
90+
DatasetGroupIndex
91+
};
92+
7893
explicit QgsMeshDatasetGroupTreeModel( QObject *parent = nullptr );
7994

8095
QVariant data( const QModelIndex &index, int role ) const override;
@@ -87,11 +102,54 @@ class APP_NO_EXPORT QgsMeshDatasetGroupTreeModel : public QAbstractItemModel
87102
int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
88103
int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
89104

90-
//! Add groups to the model
91-
void setupModelData( const QStringList &groups );
105+
//! Returns index of active group for contours
106+
int activeScalarGroup() const;
107+
108+
//! Sets active group for contours
109+
void setActiveScalarGroup( int group );
110+
111+
//! Returns index of active group for vectors
112+
int activeVectorGroup() const;
113+
114+
//! Sets active vector group
115+
void setActiveVectorGroup( int group );
116+
117+
//! Add groups to the model from mesh layer
118+
void syncToLayer( QgsMeshLayer *layer );
92119

93120
private:
121+
void addTreeItem( const QString &groupName, bool isVector, int groupIndex, QgsMeshDatasetGroupTreeItem *parent );
122+
QModelIndex groupIndexToModelIndex( int groupIndex );
123+
94124
std::unique_ptr<QgsMeshDatasetGroupTreeItem> mRootItem;
125+
QMap<QString, QgsMeshDatasetGroupTreeItem *> mNameToItem;
126+
QMap<int, QgsMeshDatasetGroupTreeItem *> mDatasetGroupIndexToItem;
127+
int mActiveScalarGroupIndex = -1;
128+
int mActiveVectorGroupIndex = -1;
129+
};
130+
131+
/**
132+
* Delegate to display tree item with a contours and vector selector
133+
*/
134+
class APP_EXPORT QgsMeshDatasetGroupTreeItemDelagate: public QStyledItemDelegate
135+
{
136+
public:
137+
QgsMeshDatasetGroupTreeItemDelagate( QObject *parent = Q_NULLPTR );
138+
139+
void paint( QPainter *painter,
140+
const QStyleOptionViewItem &option,
141+
const QModelIndex &index ) const override;
142+
143+
//! Icon rectangle for given item rectangle
144+
QRect iconRect( const QRect rect, bool isVector ) const;
145+
146+
QSize sizeHint( const QStyleOptionViewItem &option,
147+
const QModelIndex &index ) const override;
148+
private:
149+
const QPixmap mScalarSelectedPixmap;
150+
const QPixmap mScalarUnselectedPixmap;
151+
const QPixmap mVectorSelectedPixmap;
152+
const QPixmap mVectorUnselectedPixmap;
95153
};
96154

97155
/**
@@ -109,27 +167,39 @@ class APP_EXPORT QgsMeshDatasetGroupTreeView : public QTreeView
109167
//! Associates mesh layer with the widget
110168
void setLayer( QgsMeshLayer *layer );
111169

112-
//! Returns index of active group
113-
int activeGroup() const;
170+
//! Returns index of active group for contours
171+
int activeScalarGroup() const;
172+
173+
//! Sets active group for contours
174+
void setActiveScalarGroup( int group );
175+
176+
//! Returns index of active group for vectors
177+
int activeVectorGroup() const;
178+
179+
//! Sets active vector group
180+
void setActiveVectorGroup( int group );
114181

115182
//! Synchronize widgets state with associated mesh layer
116183
void syncToLayer();
117184

185+
void mousePressEvent( QMouseEvent *event ) override;
186+
118187
signals:
119-
//! Selected dataset group changed
120-
void activeGroupChanged();
188+
//! Selected dataset group for contours changed. -1 for invalid group
189+
void activeScalarGroupChanged( int groupIndex );
190+
191+
//! Selected dataset group for vectors changed. -1 for invalid group
192+
void activeVectorGroupChanged( int groupIndex );
121193

122194
private slots:
123-
void onSelectionChanged( const QItemSelection &selected, const QItemSelection &deselected );
195+
// void onSelectionChanged( const QItemSelection &selected, const QItemSelection &deselected );
124196

125197
private:
126-
void extractGroups();
127-
int setActiveGroupFromActiveDataset();
198+
void setActiveGroupFromActiveDataset();
128199

129200
QgsMeshDatasetGroupTreeModel mModel;
201+
QgsMeshDatasetGroupTreeItemDelagate mDelegate;
130202
QgsMeshLayer *mMeshLayer = nullptr; // not owned
131-
QStringList mGroups; // group names
132-
int mActiveGroup = -1; // index of active group
133203
};
134204

135205
#endif // QGSMESHDATASETGROUPTREE_H

‎src/app/mesh/qgsmeshrendereractivedatasetwidget.cpp

Lines changed: 140 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ QgsMeshRendererActiveDatasetWidget::QgsMeshRendererActiveDatasetWidget( QWidget
2424
: QWidget( parent )
2525
{
2626
setupUi( this );
27-
connect( mDatasetGroupTreeView, &QgsMeshDatasetGroupTreeView::activeGroupChanged, this, &QgsMeshRendererActiveDatasetWidget::onActiveGroupChanged );
27+
connect( mDatasetGroupTreeView, &QgsMeshDatasetGroupTreeView::activeScalarGroupChanged,
28+
this, &QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged );
29+
connect( mDatasetGroupTreeView, &QgsMeshDatasetGroupTreeView::activeVectorGroupChanged,
30+
this, &QgsMeshRendererActiveDatasetWidget::onActiveVectorGroupChanged );
2831
connect( mDatasetSlider, &QSlider::valueChanged, this, &QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged );
2932
}
3033

@@ -34,6 +37,16 @@ void QgsMeshRendererActiveDatasetWidget::setLayer( QgsMeshLayer *layer )
3437
mDatasetGroupTreeView->setLayer( layer );
3538
}
3639

40+
int QgsMeshRendererActiveDatasetWidget::activeScalarDatasetGroup() const
41+
{
42+
return mActiveScalarDatasetGroup;
43+
}
44+
45+
int QgsMeshRendererActiveDatasetWidget::activeVectorDatasetGroup() const
46+
{
47+
return mActiveVectorDatasetGroup;
48+
}
49+
3750
QgsMeshDatasetIndex QgsMeshRendererActiveDatasetWidget::activeScalarDataset() const
3851
{
3952
return mActiveScalarDataset;
@@ -47,112 +60,162 @@ QgsMeshDatasetIndex QgsMeshRendererActiveDatasetWidget::activeVectorDataset() co
4760
void QgsMeshRendererActiveDatasetWidget::setSliderRange()
4861
{
4962
int datasetCount = 1;
50-
if ( mMeshLayer &&
51-
mMeshLayer->dataProvider() &&
52-
mDatasetGroupTreeView->activeGroup() != -1 )
53-
datasetCount = mMeshLayer->dataProvider()->datasetCount( mDatasetGroupTreeView->activeGroup() );
54-
63+
if ( mMeshLayer && mMeshLayer->dataProvider() )
64+
{
65+
for ( int i = 0; i < mMeshLayer->dataProvider()->datasetGroupCount(); ++i )
66+
{
67+
datasetCount = std::max( mMeshLayer->dataProvider()->datasetCount( i ), datasetCount );
68+
}
69+
}
5570
mDatasetSlider->setMinimum( 0 );
5671
mDatasetSlider->setMaximum( datasetCount - 1 );
5772
}
5873

59-
void QgsMeshRendererActiveDatasetWidget::onActiveGroupChanged()
74+
void QgsMeshRendererActiveDatasetWidget::onActiveScalarGroupChanged( int groupIndex )
6075
{
61-
setSliderRange();
76+
if ( groupIndex == mActiveScalarDatasetGroup )
77+
return;
78+
79+
mActiveScalarDatasetGroup = groupIndex;
6280

6381
// keep the same timestep if possible
6482
int val = mDatasetSlider->value();
65-
if ( ( val < 0 ) || ( val > mDatasetSlider->maximum() ) )
66-
val = 0;
83+
onActiveDatasetChanged( val );
84+
emit activeScalarGroupChanged( mActiveScalarDatasetGroup );
85+
}
86+
87+
void QgsMeshRendererActiveDatasetWidget::onActiveVectorGroupChanged( int groupIndex )
88+
{
89+
if ( groupIndex == mActiveVectorDatasetGroup )
90+
return;
91+
92+
mActiveVectorDatasetGroup = groupIndex;
6793

94+
// keep the same timestep if possible
95+
int val = mDatasetSlider->value();
6896
mDatasetSlider->setValue( val );
6997
onActiveDatasetChanged( val );
70-
mActiveDatasetGroup = mDatasetGroupTreeView->activeGroup();
71-
emit activeDatasetGroupChanged( mActiveDatasetGroup );
98+
emit activeVectorGroupChanged( mActiveVectorDatasetGroup );
7299
}
73100

74101
void QgsMeshRendererActiveDatasetWidget::onActiveDatasetChanged( int value )
75102
{
76-
int groupIndex = mDatasetGroupTreeView->activeGroup();
103+
if ( !mMeshLayer || !mMeshLayer->dataProvider() )
104+
return;
77105

78-
mActiveScalarDataset = QgsMeshDatasetIndex();
79-
mActiveVectorDataset = QgsMeshDatasetIndex();
80-
QgsMeshDatasetIndex datasetIndex( groupIndex, value );
106+
bool changed = false;
81107

82-
if ( mMeshLayer &&
83-
mMeshLayer->dataProvider() &&
84-
datasetIndex.isValid() &&
85-
mMeshLayer->dataProvider()->datasetCount( groupIndex ) > value )
108+
QgsMeshDatasetIndex activeScalarDataset(
109+
mActiveScalarDatasetGroup,
110+
std::min( value, mMeshLayer->dataProvider()->datasetCount( mActiveScalarDatasetGroup ) - 1 )
111+
);
112+
if ( activeScalarDataset != mActiveScalarDataset )
86113
{
87-
const QgsMeshDatasetGroupMetadata meta = mMeshLayer->dataProvider()->datasetGroupMetadata( datasetIndex );
88-
mActiveScalarDataset = datasetIndex;
89-
if ( meta.isVector() )
90-
mActiveVectorDataset = datasetIndex;
114+
mActiveScalarDataset = activeScalarDataset;
115+
changed = true;
116+
emit activeScalarDatasetChanged( mActiveScalarDataset );
91117
}
92118

93-
updateMetadata( datasetIndex );
94-
95-
emit activeScalarDatasetChanged( activeScalarDataset() );
96-
emit activeVectorDatasetChanged( activeVectorDataset() );
119+
QgsMeshDatasetIndex activeVectorDataset(
120+
mActiveVectorDatasetGroup,
121+
std::min( value, mMeshLayer->dataProvider()->datasetCount( mActiveVectorDatasetGroup ) - 1 )
122+
);
123+
if ( activeVectorDataset != mActiveVectorDataset )
124+
{
125+
mActiveVectorDataset = activeVectorDataset;
126+
changed = true;
127+
emit activeVectorDatasetChanged( mActiveVectorDataset );
128+
}
97129

98-
emit widgetChanged();
130+
if ( changed )
131+
{
132+
updateMetadata();
133+
emit widgetChanged();
134+
}
99135
}
100136

101-
void QgsMeshRendererActiveDatasetWidget::updateMetadata( QgsMeshDatasetIndex datasetIndex )
137+
void QgsMeshRendererActiveDatasetWidget::updateMetadata()
102138
{
139+
QString msg;
140+
103141
if ( !mMeshLayer ||
104-
!mMeshLayer->dataProvider() ||
105-
!datasetIndex.isValid() )
142+
!mMeshLayer->dataProvider() )
106143
{
107-
mActiveDatasetMetadata->setText( tr( "No dataset selected" ) );
144+
msg += tr( "Invalid mesh layer selected" );
108145
}
109146
else
110147
{
111-
QString msg;
112-
msg += QStringLiteral( "<table>" );
148+
if ( mActiveScalarDataset.isValid() )
149+
{
150+
if ( mActiveVectorDataset.isValid() )
151+
{
152+
if ( mActiveScalarDataset == mActiveVectorDataset )
153+
{
154+
msg += metadata( mActiveScalarDataset );
155+
}
156+
else
157+
{
158+
msg += QStringLiteral( "<p> <h3> %1 </h3> " ).arg( tr( "Scalar dataset" ) );
159+
msg += metadata( mActiveScalarDataset );
160+
msg += QStringLiteral( "</p> <p> <h3> %1 </h3>" ).arg( tr( "Vector dataset" ) );
161+
msg += metadata( mActiveVectorDataset );
162+
msg += QStringLiteral( "</p>" );
163+
}
164+
}
165+
else
166+
{
167+
msg += metadata( mActiveScalarDataset );
168+
}
169+
}
170+
else
171+
{
172+
if ( mActiveVectorDataset.isValid() )
173+
{
174+
msg += metadata( mActiveVectorDataset );
175+
}
176+
else
177+
{
178+
msg += tr( "No mesh dataset selected" );
179+
}
180+
}
181+
}
113182

114-
const QgsMeshDatasetMetadata meta = mMeshLayer->dataProvider()->datasetMetadata( datasetIndex );
115-
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
116-
.arg( tr( "Is valid" ) )
117-
.arg( meta.isValid() ? tr( "Yes" ) : tr( "No" ) );
183+
mActiveDatasetMetadata->setText( msg );
184+
}
118185

119-
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
120-
.arg( tr( "Time" ) )
121-
.arg( meta.time() );
122186

123-
const QgsMeshDatasetGroupMetadata gmeta = mMeshLayer->dataProvider()->datasetGroupMetadata( datasetIndex );
124-
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
125-
.arg( tr( "Data Type" ) )
126-
.arg( gmeta.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices ? tr( "Defined on vertices" ) : tr( "Defined on faces" ) );
187+
QString QgsMeshRendererActiveDatasetWidget::metadata( QgsMeshDatasetIndex datasetIndex )
188+
{
127189

128-
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
129-
.arg( tr( "Is vector" ) )
130-
.arg( gmeta.isVector() ? tr( "Yes" ) : tr( "No" ) );
190+
QString msg;
191+
msg += QStringLiteral( "<table>" );
131192

132-
for ( auto it = gmeta.extraOptions().constBegin(); it != gmeta.extraOptions().constEnd(); ++it )
133-
{
134-
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" ).arg( it.key() ).arg( it.value() );
135-
}
193+
const QgsMeshDatasetMetadata meta = mMeshLayer->dataProvider()->datasetMetadata( datasetIndex );
194+
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
195+
.arg( tr( "Is valid" ) )
196+
.arg( meta.isValid() ? tr( "Yes" ) : tr( "No" ) );
136197

137-
msg += QStringLiteral( "</table>" );
138-
mActiveDatasetMetadata->setText( msg );
198+
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
199+
.arg( tr( "Time" ) )
200+
.arg( meta.time() );
201+
202+
const QgsMeshDatasetGroupMetadata gmeta = mMeshLayer->dataProvider()->datasetGroupMetadata( datasetIndex );
203+
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
204+
.arg( tr( "Data Type" ) )
205+
.arg( gmeta.dataType() == QgsMeshDatasetGroupMetadata::DataOnVertices ? tr( "Defined on vertices" ) : tr( "Defined on faces" ) );
206+
207+
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" )
208+
.arg( tr( "Is vector" ) )
209+
.arg( gmeta.isVector() ? tr( "Yes" ) : tr( "No" ) );
210+
211+
for ( auto it = gmeta.extraOptions().constBegin(); it != gmeta.extraOptions().constEnd(); ++it )
212+
{
213+
msg += QStringLiteral( "<tr><td>%1</td><td>%2</td></tr>" ).arg( it.key() ).arg( it.value() );
139214
}
140215

141-
}
216+
msg += QStringLiteral( "</table>" );
142217

143-
QgsMeshDatasetIndex QgsMeshRendererActiveDatasetWidget::datasetIndex() const
144-
{
145-
int value = mDatasetSlider->value();
146-
int groupIndex = mDatasetGroupTreeView->activeGroup();
147-
148-
if ( mMeshLayer &&
149-
mMeshLayer->dataProvider() &&
150-
groupIndex != -1 &&
151-
mMeshLayer->dataProvider()->datasetCount( groupIndex ) > value
152-
)
153-
return QgsMeshDatasetIndex( groupIndex, value );
154-
else
155-
return QgsMeshDatasetIndex();
218+
return msg;
156219
}
157220

158221
void QgsMeshRendererActiveDatasetWidget::syncToLayer()
@@ -164,22 +227,26 @@ void QgsMeshRendererActiveDatasetWidget::syncToLayer()
164227
if ( mMeshLayer )
165228
{
166229
const QgsMeshRendererSettings rendererSettings = mMeshLayer->rendererSettings();
167-
mActiveDatasetGroup = mDatasetGroupTreeView->activeGroup();
230+
mActiveScalarDatasetGroup = mDatasetGroupTreeView->activeScalarGroup();
231+
mActiveVectorDatasetGroup = mDatasetGroupTreeView->activeVectorGroup();
168232
mActiveScalarDataset = rendererSettings.activeScalarDataset();
169233
mActiveVectorDataset = rendererSettings.activeVectorDataset();
170234
}
171235
else
172236
{
173-
mActiveDatasetGroup = -1;
237+
mActiveScalarDatasetGroup = -1;
238+
mActiveVectorDatasetGroup = -1;
174239
mActiveScalarDataset = QgsMeshDatasetIndex();
175240
mActiveVectorDataset = QgsMeshDatasetIndex();
176241
}
177242

243+
setSliderRange();
244+
178245
int val = 0;
179246
if ( mActiveScalarDataset.isValid() )
180247
val = mActiveScalarDataset.dataset();
248+
else if ( mActiveVectorDataset.isValid() )
249+
val = mActiveVectorDataset.dataset();
181250
mDatasetSlider->setValue( val );
182-
183-
setSliderRange();
184251
onActiveDatasetChanged( val );
185252
}

‎src/app/mesh/qgsmeshrendereractivedatasetwidget.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ class APP_EXPORT QgsMeshRendererActiveDatasetWidget : public QWidget, private Ui
4747
void setLayer( QgsMeshLayer *layer );
4848

4949
//! Returns index of the active scalar dataset group
50-
int activeScalarDatasetGroup() const { return mActiveDatasetGroup; }
50+
int activeScalarDatasetGroup() const;
5151

5252
//! Returns index of the active vector dataset group
53-
int activeVectorDatasetGroup() const { return mActiveDatasetGroup; }
53+
int activeVectorDatasetGroup() const;
5454

5555
//! Gets index of the selected/active scalar dataset
5656
QgsMeshDatasetIndex activeScalarDataset() const;
@@ -69,23 +69,29 @@ class APP_EXPORT QgsMeshRendererActiveDatasetWidget : public QWidget, private Ui
6969
//! Emitted when active vector dataset changed
7070
void activeVectorDatasetChanged( QgsMeshDatasetIndex index );
7171

72-
//! Emitted when the current group gets changed
73-
void activeDatasetGroupChanged( int groupIndex );
72+
//! Emitted when the current scalar group gets changed
73+
void activeScalarGroupChanged( int groupIndex );
74+
75+
//! Emitted when the current vector group gets changed
76+
void activeVectorGroupChanged( int groupIndex );
7477

7578
//! Emitted when any settings related to rendering changed
7679
void widgetChanged();
7780

7881
private slots:
79-
void onActiveGroupChanged();
82+
void onActiveScalarGroupChanged( int groupIndex );
83+
void onActiveVectorGroupChanged( int groupIndex );
8084
void onActiveDatasetChanged( int value );
81-
void updateMetadata( QgsMeshDatasetIndex datasetIndex );
85+
void updateMetadata( );
86+
QString metadata( QgsMeshDatasetIndex datasetIndex );
8287

8388
private:
84-
QgsMeshDatasetIndex datasetIndex() const;
89+
//! Loop through all dataset groups and find the maximum number of datasets
8590
void setSliderRange();
8691

8792
QgsMeshLayer *mMeshLayer = nullptr; // not owned
88-
int mActiveDatasetGroup = -1;
93+
int mActiveScalarDatasetGroup = -1;
94+
int mActiveVectorDatasetGroup = -1;
8995
QgsMeshDatasetIndex mActiveScalarDataset;
9096
QgsMeshDatasetIndex mActiveVectorDataset;
9197
};

‎src/app/mesh/qgsrenderermeshpropertieswidget.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ QgsRendererMeshPropertiesWidget::QgsRendererMeshPropertiesWidget( QgsMeshLayer *
4444
mMeshRendererVectorSettingsWidget->setLayer( mMeshLayer );
4545
syncToLayer();
4646

47-
connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::activeDatasetGroupChanged,
48-
this, &QgsRendererMeshPropertiesWidget::onActiveDatasetGroupChanged );
47+
connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::activeScalarGroupChanged,
48+
this, &QgsRendererMeshPropertiesWidget::onActiveScalarGroupChanged );
49+
connect( mMeshRendererActiveDatasetWidget, &QgsMeshRendererActiveDatasetWidget::activeVectorGroupChanged,
50+
this, &QgsRendererMeshPropertiesWidget::onActiveVectorGroupChanged );
4951

5052
connect( mNativeMeshGroup, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
5153
connect( mTriangularMeshGroup, &QGroupBox::toggled, this, &QgsPanelWidget::widgetChanged );
@@ -108,24 +110,24 @@ void QgsRendererMeshPropertiesWidget::syncToLayer()
108110
mNativeMeshSettingsWidget->syncToLayer();
109111
mTriangularMeshSettingsWidget->syncToLayer();
110112

111-
onActiveDatasetGroupChanged();
113+
onActiveScalarGroupChanged( mMeshRendererActiveDatasetWidget->activeScalarDatasetGroup() );
114+
onActiveVectorGroupChanged( mMeshRendererActiveDatasetWidget->activeVectorDatasetGroup() );
112115
}
113116

114-
void QgsRendererMeshPropertiesWidget::onActiveDatasetGroupChanged()
117+
void QgsRendererMeshPropertiesWidget::onActiveScalarGroupChanged( int groupIndex )
115118
{
116-
int scalarGroup = mMeshRendererActiveDatasetWidget->activeScalarDatasetGroup();
117-
int vectorGroup = mMeshRendererActiveDatasetWidget->activeVectorDatasetGroup();
118-
if ( vectorGroup >= 0 && !mMeshLayer->dataProvider()->datasetGroupMetadata( vectorGroup ).isVector() )
119-
vectorGroup = -1;
120-
121-
mMeshRendererScalarSettingsWidget->setActiveDatasetGroup( scalarGroup );
122-
mMeshRendererVectorSettingsWidget->setActiveDatasetGroup( vectorGroup );
123-
119+
mMeshRendererScalarSettingsWidget->setActiveDatasetGroup( groupIndex );
124120
mMeshRendererScalarSettingsWidget->syncToLayer();
125-
mMeshRendererVectorSettingsWidget->syncToLayer();
121+
mContoursGroupBox->setChecked( groupIndex >= 0 );
122+
mContoursGroupBox->setEnabled( groupIndex >= 0 );
123+
}
126124

127-
mContoursGroupBox->setChecked( scalarGroup >= 0 );
128-
mContoursGroupBox->setEnabled( scalarGroup >= 0 );
129-
mVectorsGroupBox->setChecked( vectorGroup >= 0 );
130-
mVectorsGroupBox->setEnabled( vectorGroup >= 0 );
125+
void QgsRendererMeshPropertiesWidget::onActiveVectorGroupChanged( int groupIndex )
126+
{
127+
if ( groupIndex >= 0 && !mMeshLayer->dataProvider()->datasetGroupMetadata( groupIndex ).isVector() )
128+
groupIndex = -1;
129+
mMeshRendererVectorSettingsWidget->setActiveDatasetGroup( groupIndex );
130+
mMeshRendererVectorSettingsWidget->syncToLayer();
131+
mVectorsGroupBox->setChecked( groupIndex >= 0 );
132+
mVectorsGroupBox->setEnabled( groupIndex >= 0 );
131133
}

‎src/app/mesh/qgsrenderermeshpropertieswidget.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ class APP_EXPORT QgsRendererMeshPropertiesWidget : public QgsMapLayerConfigWidge
5353
void syncToLayer();
5454

5555
private slots:
56-
void onActiveDatasetGroupChanged();
56+
void onActiveScalarGroupChanged( int groupIndex );
57+
void onActiveVectorGroupChanged( int groupIndex );
5758

5859
private:
5960
QgsMeshLayer *mMeshLayer = nullptr; //not owned

‎src/core/mesh/qgsmeshdataprovider.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,16 @@ bool QgsMeshDatasetIndex::isValid() const
3939

4040
bool QgsMeshDatasetIndex::operator ==( const QgsMeshDatasetIndex &other ) const
4141
{
42-
return other.group() == group() && other.dataset() == dataset();
42+
if ( isValid() && other.isValid() )
43+
return other.group() == group() && other.dataset() == dataset();
44+
else
45+
return isValid() == other.isValid();
4346
}
4447

48+
bool QgsMeshDatasetIndex::operator !=( const QgsMeshDatasetIndex &other ) const
49+
{
50+
return !( operator==( other ) );
51+
}
4552

4653
QgsMeshDataProvider::QgsMeshDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options )
4754
: QgsDataProvider( uri, options )

‎src/core/mesh/qgsmeshdataprovider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class CORE_EXPORT QgsMeshDatasetIndex
5151
bool isValid() const;
5252
//! Equality operator
5353
bool operator == ( const QgsMeshDatasetIndex &other ) const;
54+
//! Inequality operator
55+
bool operator != ( const QgsMeshDatasetIndex &other ) const;
5456
private:
5557
int mGroupIndex = -1;
5658
int mDatasetIndex = -1;

0 commit comments

Comments
 (0)
Please sign in to comment.