17#include "moc_qgsmeshdatasetgrouptreeview.cpp"
27#include <QItemSelectionModel>
36 : QAbstractItemModel( parent )
49 if ( !
index.isValid() )
62 case Qt::CheckStateRole:
63 if (
index.column() == 0 )
64 return static_cast<int>( item->
isEnabled() ? Qt::Checked : Qt::Unchecked );
76 if ( !
index.isValid() )
77 return Qt::NoItemFlags;
79 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
86 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
87 return tr(
"Groups" );
95 if ( !hasIndex( row, column,
parent ) )
101 parentItem = mRootItem.get();
107 return createIndex( row, column, childItem );
109 return QModelIndex();
114 if ( !
index.isValid() )
115 return QModelIndex();
120 if ( parentItem == mRootItem.get() )
121 return QModelIndex();
123 return createIndex( parentItem->
row(), 0, parentItem );
129 if (
parent.column() > 0 )
133 parentItem = mRootItem.get();
155 return mRootItem.get();
161 return mRootItem->childFromDatasetGroupIndex( groupIndex );
176 if ( !
index.isValid() )
179 const QVariant checked =
data(
index, Qt::CheckStateRole );
181 return checked != QVariant() && checked.toInt() == Qt::Checked;
186 if ( !meshLayer && !mRootItem )
200 for (
int i = 0; i < mRootItem->childCount(); ++i )
204 for (
int j = 0; j < item->
childCount(); ++j )
210 dataChanged(
index( 0, 0 ),
index( mRootItem->childCount(), 0 ) );
215 if ( !
index.isValid() )
230 if ( !
index.isValid() )
243 : QSortFilterProxyModel( sourceModel )
245 setSourceModel( sourceModel );
250 return mActiveScalarGroupIndex;
255 if ( mActiveScalarGroupIndex == group )
258 const int oldGroupIndex = mActiveScalarGroupIndex;
259 mActiveScalarGroupIndex = group;
261 if ( oldGroupIndex > -1 || group > -1 )
267 return mActiveVectorGroupIndex;
272 if ( mActiveVectorGroupIndex == group )
275 const int oldGroupIndex = mActiveVectorGroupIndex;
276 mActiveVectorGroupIndex = group;
278 if ( oldGroupIndex > -1 || group > -1 )
284 if ( !index.isValid() )
285 return Qt::NoItemFlags;
287 return Qt::ItemIsEnabled;
292 if ( !index.isValid() )
295 const QModelIndex sourceIndex = mapToSource( index );
306 case Qt::CheckStateRole:
308 case Qt::DecorationRole:
310 case Qt::BackgroundRole:
314 return sourceModel()->data( sourceIndex, role );
327 const QModelIndex sourceIndex = sourceModel()->index( source_row, 0, source_parent );
336 : QStyledItemDelegate( parent )
337 , mScalarSelectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshcontours.svg" ) )
338 , mScalarDeselectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshcontoursoff.svg" ) )
339 , mVectorSelectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshvectors.svg" ) )
340 , mVectorDeselectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshvectorsoff.svg" ) )
349 QStyledItemDelegate::paint( painter, option, index );
354 painter->drawPixmap(
iconRect( option.rect,
true ), isActive ? mVectorSelectedPixmap : mVectorDeselectedPixmap );
358 painter->drawPixmap(
iconRect( option.rect,
false ), isActive ? mScalarSelectedPixmap : mScalarDeselectedPixmap );
363 return iconRect( rect, isVector ? 1 : 2 );
368 const int iw = mScalarSelectedPixmap.width();
369 const int ih = mScalarSelectedPixmap.height();
370 const int margin = ( rect.height() - ih ) / 2;
371 return QRect( rect.right() - pos * ( iw + margin ), rect.top() + margin, iw, ih );
376 QSize hint = QStyledItemDelegate::sizeHint( option, index );
377 if ( hint.height() < 16 )
378 hint.setHeight( 16 );
387 setModel( mProxyModel );
388 setItemDelegate( &mDelegate );
389 setSelectionMode( QAbstractItemView::SingleSelection );
394 if ( layer != mMeshLayer )
410 mProxyModel->invalidate();
425 mProxyModel->invalidate();
441 bool processed =
false;
442 const QModelIndex idx = indexAt( event->pos() );
445 const QRect vr = visualRect( idx );
446 if ( mDelegate.
iconRect( vr,
true ).contains( event->pos() ) )
458 else if ( mDelegate.
iconRect( vr,
false ).contains( event->pos() ) )
470 QTreeView::mousePressEvent( event );
473void QgsMeshActiveDatasetGroupTreeView::setActiveGroup()
475 int scalarGroup = -1;
476 int vectorGroup = -1;
491 : QAbstractListModel( parent )
513 if ( !mRootItem || !index.isValid() )
516 if ( index.row() >=
rowCount( QModelIndex() ) )
520 if ( index.row() >= list.count() )
530 case Qt::DisplayRole:
531 if ( mDisplayProviderName )
536 case Qt::DecorationRole:
546 mDisplayProviderName = displayProviderName;
551 const int varCount =
rowCount( QModelIndex() );
553 for (
int i = 0; i < varCount; ++i )
560 : QTreeView( parent )
565 setStyleSheet(
"QgsMeshDatasetGroupTreeView::item {background:none}" );
568 setSelectionMode( QAbstractItemView::SingleSelection );
569 header()->setSectionResizeMode( QHeaderView::ResizeToContents );
584 selectAllItem(
true );
589 selectAllItem(
false );
594 const QModelIndex idx = indexAt( event->pos() );
595 if ( !idx.isValid() )
596 setCurrentIndex( QModelIndex() );
598 std::unique_ptr<QMenu> menu( createContextMenu() );
599 if ( menu && menu->actions().count() != 0 )
600 menu->exec( mapToGlobal( event->pos() ) );
603void QgsMeshDatasetGroupTreeView::removeCurrentItem()
610 if ( !dependencies.isEmpty() )
613 for (
const int dependentGroupIndex : dependencies )
618 varList.append( item->
name() );
619 varList.append( QStringLiteral(
"\n" ) );
622 QMessageBox::information(
this, tr(
"Remove Dataset Group" ), tr(
"This dataset group can't be removed because other dataset groups depend on it:\n%1" ).arg( varList ) );
627 if ( QMessageBox::question(
this, tr(
"Remove Dataset Group" ), tr(
"Remove dataset group?" ) ) == QMessageBox::Yes )
631void QgsMeshDatasetGroupTreeView::onDatasetGroupSaved(
const QString &uri )
637QMenu *QgsMeshDatasetGroupTreeView::createContextMenu()
639 QMenu *contextMenu =
new QMenu;
641 const QModelIndex &index = currentIndex();
642 if ( !index.isValid() )
659 contextMenu->addAction( tr(
"Remove Dataset Group" ),
this, &QgsMeshDatasetGroupTreeView::removeCurrentItem );
676void QgsMeshDatasetGroupTreeView::selectAllItem(
bool isChecked )
686 QMenu *menu =
new QMenu( parentMenu );
687 menu->setTitle( QObject::tr(
"Save Datasets Group as..." ) );
691 if ( providerMetadata )
696 const QString driverName = driver.name();
697 const QString suffix = driver.writeDatasetOnFileSuffix();
702 menu->addAction( driver.description(),
this, [groupIndex, driverName, suffix,
this] {
703 this->saveDatasetGroup( groupIndex, driverName, suffix );
709 if ( menu->actions().isEmpty() )
711 menu->addAction( QObject::tr(
"No Driver Available to Write this Dataset Group" ) );
712 menu->actions().last()->setDisabled(
true );
716 parentMenu->addMenu( menu );
723 mMeshLayer = meshLayer;
726void QgsMeshDatasetGroupSaveMenu::saveDatasetGroup(
int datasetGroup,
const QString &driver,
const QString &fileSuffix )
733 if ( !fileSuffix.isEmpty() )
734 filter = QStringLiteral(
"%1 (*.%2)" ).arg( driver ).arg( fileSuffix );
735 const QString exportFileDir = settings.
value( QStringLiteral(
"lastMeshDatasetDir" ), QDir::homePath(),
QgsSettings::App ).toString();
736 const QString saveFileName = QFileDialog::getSaveFileName(
nullptr, QObject::tr(
"Save Mesh Datasets" ), exportFileDir, filter );
738 if ( saveFileName.isEmpty() )
741 const QFileInfo openFileInfo( saveFileName );
745 if ( mMeshLayer->
saveDataset( saveFileName, datasetGroup, driver ) )
747 QMessageBox::warning(
nullptr, QObject::tr(
"Save Mesh Datasets" ), QObject::tr(
"Saving datasets fails" ) );
752 QMessageBox::information(
nullptr, QObject::tr(
"Save Mesh Datasets" ), QObject::tr(
"Datasets successfully saved on file" ) );
762 if ( !
index.isValid() )
767 case Qt::DisplayRole:
770 return textDisplayed(
index );
772 case Qt::BackgroundRole:
773 return backGroundColor(
index );
780 if ( !
index.isValid() )
790 if ( value != QString() )
792 item->
setName( value.toString() );
796 case Qt::CheckStateRole:
805 if ( !
index.isValid() )
806 return Qt::NoItemFlags;
808 if (
index.column() > 0 )
809 return Qt::ItemIsEnabled;
811 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
818 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
821 return tr(
"Group" );
825 return tr(
"Description" );
837QString QgsMeshAvailableDatasetGroupTreeModel::textDisplayed(
const QModelIndex &index )
const
843 switch (
index.column() )
849 return tr(
"Vector" );
851 return tr(
"Scalar" );
858QColor QgsMeshAvailableDatasetGroupTreeModel::backGroundColor(
const QModelIndex &index )
const
865 return QColor( 103, 0, 243, 44 );
867 return QColor( 252, 155, 79, 44 );
869 return QColor( 252, 255, 79, 44 );
virtual QString name() const =0
Returns a provider name.
void setActiveScalarGroup(int group)
Sets active group for contours.
QgsMeshActiveDatasetGroupTreeView(QWidget *parent=nullptr)
int activeScalarGroup() const
Returns index of active group for contours.
void setActiveVectorGroup(int group)
Sets active vector group.
void syncToLayer()
Synchronize widgets state with associated mesh layer.
void activeVectorGroupChanged(int groupIndex)
Selected dataset group for vectors changed. -1 for invalid group.
void mousePressEvent(QMouseEvent *event) override
void activeScalarGroupChanged(int groupIndex)
Selected dataset group for contours changed. -1 for invalid group.
int activeVectorGroup() const
Returns index of active group for vectors.
void setLayer(QgsMeshLayer *layer)
Associates mesh layer with the widget.
Qt::ItemFlags flags(const QModelIndex &index) const override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
QgsMeshAvailableDatasetGroupTreeModel(QObject *parent=nullptr)
int columnCount(const QModelIndex &parent=QModelIndex()) const override
QVariant data(const QModelIndex &index, int role) const override
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
void setDisplayProviderName(bool displayProviderName)
QVariant data(const QModelIndex &index, int role) const override
int rowCount(const QModelIndex &parent) const override
void syncToLayer(QgsMeshLayer *layer)
Add groups to the model from mesh layer.
QgsMeshDatasetGroupListModel(QObject *parent)
QStringList variableNames() const
void setActiveVectorGroup(int group)
Sets active vector group.
int activeScalarGroup() const
Returns index of active group for contours.
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
void setActiveScalarGroup(int group)
Sets active group for contours.
Qt::ItemFlags flags(const QModelIndex &index) const override
void syncToLayer(QgsMeshLayer *layer)
Add groups to the model from mesh layer.
int activeVectorGroup() const
Returns index of active group for vectors.
QgsMeshDatasetGroupProxyModel(QAbstractItemModel *sourceModel)
QVariant data(const QModelIndex &index, int role) const override
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
QgsMeshDatasetGroupTreeItemDelegate(QObject *parent=nullptr)
QRect iconRect(const QRect &rect, bool isVector) const
Icon rectangle for given item rectangle.
Tree item for display of the mesh dataset groups.
void setName(const QString &name)
Overrides the default name with the name to display.
QgsMeshDatasetGroupTreeItem * clone() const
Clones the item.
QList< int > groupIndexDependencies() const
Returns a list of group index corresponding to dataset group that depends on the dataset group repres...
void setPersistentDatasetGroup(const QString &uri)
Set parameters of the item in accordance with the persistent dataset group with uri.
int childCount() const
Returns the count of children.
int datasetGroupIndex() const
QgsMeshDatasetGroupTreeItem * parentItem() const
Returns the parent item, nullptr if it is root item.
QgsMeshDatasetGroupTreeItem * childFromDatasetGroupIndex(int index)
Returns the child with dataset group index Searches as depper as needed on the child hierarchy.
void removeChild(QgsMeshDatasetGroupTreeItem *item)
Removes and destroy a item child if exists.
void setIsEnabled(bool isEnabled)
Sets whether the item is enabled, that is if it is displayed in view.
QList< int > enabledDatasetGroupIndexes() const
Returns a list of enabled dataset group indexes, included deeper children.
QString providerName() const
Returns the name used by the provider to identify the dataset.
QgsMeshDatasetGroupTreeItem * child(int row) const
Returns a child.
QString description() const
Returns description about the dataset group (URI, formula,...)
int row() const
Returns the position of the item in the parent.
QString name() const
Returns the name of the item This name is the default name if the name has not been overridden (.
QgsMeshDatasetGroup::Type datasetGroupType() const
Item Model for QgsMeshDatasetGroupTreeItem.
QgsMeshDatasetGroupTreeItem * datasetGroupTreeItem(int groupIndex)
Returns the dataset group tree item with index, keeps ownership.
QVariant data(const QModelIndex &index, int role) const override
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
void syncToLayer(QgsMeshLayer *layer)
Synchronizes groups to the model from mesh layer.
bool isEnabled(const QModelIndex &index) const
Returns whether the dataset groups related to the QModelIndex is set as enabled.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
void resetDefault(QgsMeshLayer *meshLayer)
Resets all groups with default state from the mesh layer.
@ IsActiveVectorDatasetGroup
@ IsActiveScalarDatasetGroup
QgsMeshDatasetGroupTreeItem * datasetGroupTreeRootItem()
Returns the dataset group root tree item, keeps ownership.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
QgsMeshDatasetGroupTreeModel(QObject *parent=nullptr)
void removeItem(const QModelIndex &index)
Removes an item from the tree.
QModelIndex parent(const QModelIndex &index) const override
void setAllGroupsAsEnabled(bool isEnabled)
Sets all groups as enabled.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
void setPersistentDatasetGroup(const QModelIndex &index, const QString &uri)
Sets the dataset group as persistent with specified uri and for specified index.
Qt::ItemFlags flags(const QModelIndex &index) const override
void syncToLayer(QgsMeshLayer *layer)
QgsMeshDatasetGroupTreeView(QWidget *parent=nullptr)
QgsMeshDatasetGroupTreeItem * datasetGroupTreeRootItem()
void contextMenuEvent(QContextMenuEvent *event) override
void resetDefault(QgsMeshLayer *meshLayer)
@ Unknown
Generic type used for non typed dataset group.
@ Virtual
Virtual Dataset group defined by a formula.
@ Memory
Temporary dataset group in memory.
@ Persistent
Dataset group store in a file.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
void resetDatasetGroupTreeItem()
Reset the dataset group tree item to default from provider.
bool saveDataset(const QString &path, int datasetGroupIndex, QString driver)
Saves datasets group on file with the specified driver.
QgsMeshDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
QgsMeshDatasetGroupTreeItem * datasetGroupTreeRootItem() const
Returns the root items of the dataset group tree item.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
Represents all mesh renderer settings.
int activeVectorDatasetGroup() const
Returns the active vector dataset group.
int activeScalarDatasetGroup() const
Returns the active scalar dataset group.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QgsProviderMetadata * providerMetadata(const QString &providerKey) const
Returns metadata of the provider or nullptr if not found.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.