26 #include <QItemSelectionModel>
27 #include <QMouseEvent>
29 #include <QFileDialog>
30 #include <QMessageBox>
31 #include <QHeaderView>
35 : QAbstractItemModel( parent )
48 if ( !
index.isValid() )
61 case Qt::CheckStateRole :
62 if (
index.column() == 0 )
63 return static_cast< int >( item->
isEnabled() ? Qt::Checked : Qt::Unchecked );
75 if ( !
index.isValid() )
76 return Qt::NoItemFlags;
78 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
82 Qt::Orientation orientation,
87 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
88 return tr(
"Groups" );
96 if ( !hasIndex( row, column,
parent ) )
102 parentItem = mRootItem.get();
108 return createIndex( row, column, childItem );
110 return QModelIndex();
115 if ( !
index.isValid() )
116 return QModelIndex();
121 if ( parentItem == mRootItem.get() )
122 return QModelIndex();
124 return createIndex( parentItem->
row(), 0, parentItem );
130 if (
parent.column() > 0 )
134 parentItem = mRootItem.get();
156 return mRootItem.get();
162 return mRootItem->childFromDatasetGroupIndex( groupIndex );
177 if ( !
index.isValid() )
180 const QVariant checked =
data(
index, Qt::CheckStateRole );
182 return checked != QVariant() && checked.toInt() == Qt::Checked;
187 if ( !meshLayer && !mRootItem )
201 for (
int i = 0; i < mRootItem->childCount(); ++i )
205 for (
int j = 0; j < item->
childCount(); ++j )
211 dataChanged(
index( 0, 0 ),
index( mRootItem->childCount(), 0 ) );
216 if ( !
index.isValid() )
225 parent->removeChild( item );
231 if ( !
index.isValid() )
244 QSortFilterProxyModel( sourceModel )
246 setSourceModel( sourceModel );
251 return mActiveScalarGroupIndex;
256 if ( mActiveScalarGroupIndex == group )
259 const int oldGroupIndex = mActiveScalarGroupIndex;
260 mActiveScalarGroupIndex = group;
262 if ( oldGroupIndex > -1 || group > -1 )
268 return mActiveVectorGroupIndex;
273 if ( mActiveVectorGroupIndex == group )
276 const int oldGroupIndex = mActiveVectorGroupIndex;
277 mActiveVectorGroupIndex = group;
279 if ( oldGroupIndex > -1 || group > -1 )
285 if ( !index.isValid() )
286 return Qt::NoItemFlags;
288 return Qt::ItemIsEnabled;
293 if ( !index.isValid() )
296 const QModelIndex sourceIndex = mapToSource( index );
307 case Qt::CheckStateRole :
309 case Qt::DecorationRole:
312 #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0)
313 case Qt::BackgroundColorRole:
315 case Qt::BackgroundRole:
320 return sourceModel()->data( sourceIndex, role );
333 const QModelIndex sourceIndex = sourceModel()->index( source_row, 0, source_parent );
342 : QStyledItemDelegate( parent )
343 , mScalarSelectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshcontours.svg" ) )
344 , mScalarDeselectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshcontoursoff.svg" ) )
345 , mVectorSelectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshvectors.svg" ) )
346 , mVectorDeselectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshvectorsoff.svg" ) )
355 QStyledItemDelegate::paint( painter, option, index );
360 painter->drawPixmap(
iconRect( option.rect,
true ), isActive ? mVectorSelectedPixmap : mVectorDeselectedPixmap );
364 painter->drawPixmap(
iconRect( option.rect,
false ), isActive ? mScalarSelectedPixmap : mScalarDeselectedPixmap );
369 return iconRect( rect, isVector ? 1 : 2 );
374 const int iw = mScalarSelectedPixmap.width();
375 const int ih = mScalarSelectedPixmap.height();
376 const int margin = ( rect.height() - ih ) / 2;
377 return QRect( rect.right() - pos * ( iw + margin ), rect.top() + margin, iw, ih );
382 QSize hint = QStyledItemDelegate::sizeHint( option, index );
383 if ( hint.height() < 16 )
384 hint.setHeight( 16 );
391 : QTreeView( parent ),
394 setModel( mProxyModel );
395 setItemDelegate( &mDelegate );
396 setSelectionMode( QAbstractItemView::SingleSelection );
401 if ( layer != mMeshLayer )
417 mProxyModel->invalidate();
432 mProxyModel->invalidate();
448 bool processed =
false;
449 const QModelIndex idx = indexAt( event->pos() ) ;
452 const QRect vr = visualRect( idx );
453 if ( mDelegate.
iconRect( vr,
true ).contains( event->pos() ) )
465 else if ( mDelegate.
iconRect( vr,
false ).contains( event->pos() ) )
477 QTreeView::mousePressEvent( event );
480 void QgsMeshActiveDatasetGroupTreeView::setActiveGroup()
482 int scalarGroup = -1;
483 int vectorGroup = -1;
519 if ( !mRootItem || ! index.isValid() )
522 if ( index.row() >=
rowCount( QModelIndex() ) )
526 if ( index.row() >= list.count() )
536 case Qt::DisplayRole:
537 if ( mDisplayProviderName )
542 case Qt::DecorationRole:
552 mDisplayProviderName = displayProviderName;
557 const int varCount =
rowCount( QModelIndex() );
559 for (
int i = 0; i < varCount; ++i )
571 setStyleSheet(
"QgsMeshDatasetGroupTreeView::item {background:none}" );
574 setSelectionMode( QAbstractItemView::SingleSelection );
575 header()->setSectionResizeMode( QHeaderView::ResizeToContents );
590 selectAllItem(
true );
595 selectAllItem(
false );
600 const QModelIndex idx = indexAt( event->pos() );
601 if ( !idx.isValid() )
602 setCurrentIndex( QModelIndex() );
604 std::unique_ptr<QMenu> menu( createContextMenu() );
605 if ( menu && menu->actions().count() != 0 )
606 menu->exec( mapToGlobal( event->pos() ) );
609 void QgsMeshDatasetGroupTreeView::removeCurrentItem()
616 if ( !dependencies.isEmpty() )
619 for (
const int dependentGroupIndex : dependencies )
624 varList.append( item->
name() );
625 varList.append( QStringLiteral(
"\n" ) );
628 QMessageBox::information(
this, tr(
"Remove Dataset Group" ), tr(
"This dataset group can't be removed because other dataset groups depend on it:\n%1" )
634 if ( QMessageBox::question(
this, tr(
"Remove Dataset Group" ), tr(
"Remove dataset group?" ) ) == QMessageBox::Yes )
638 void QgsMeshDatasetGroupTreeView::onDatasetGroupSaved(
const QString &uri )
644 QMenu *QgsMeshDatasetGroupTreeView::createContextMenu()
646 QMenu *contextMenu =
new QMenu;
648 const QModelIndex &index = currentIndex();
649 if ( !index.isValid() )
666 contextMenu->addAction( tr(
"Remove Dataset Group" ),
this, &QgsMeshDatasetGroupTreeView::removeCurrentItem );
683 void QgsMeshDatasetGroupTreeView::selectAllItem(
bool isChecked )
693 QMenu *menu =
new QMenu( parentMenu );
694 menu->setTitle( QObject::tr(
"Save Datasets Group as..." ) );
698 if ( providerMetadata )
703 const QString driverName = driver.name();
704 const QString suffix = driver.writeDatasetOnFileSuffix();
705 if ( ( driver.capabilities().testFlag( QgsMeshDriverMetadata::MeshDriverCapability::CanWriteFaceDatasets )
707 ( driver.capabilities().testFlag( QgsMeshDriverMetadata::MeshDriverCapability::CanWriteVertexDatasets )
709 ( driver.capabilities().testFlag( QgsMeshDriverMetadata::MeshDriverCapability::CanWriteEdgeDatasets )
712 menu->addAction( driver.description(), [groupIndex, driverName, suffix,
this]
714 this->saveDatasetGroup( groupIndex, driverName, suffix );
720 if ( menu->actions().isEmpty() )
722 menu->addAction( QObject::tr(
"No Driver Available to Write this Dataset Group" ) );
723 menu->actions().last()->setDisabled(
true );
727 parentMenu->addMenu( menu );
734 mMeshLayer = meshLayer;
737 void QgsMeshDatasetGroupSaveMenu::saveDatasetGroup(
int datasetGroup,
const QString &driver,
const QString &fileSuffix )
744 if ( !fileSuffix.isEmpty() )
745 filter = QStringLiteral(
"%1 (*.%2)" ).arg( driver ).arg( fileSuffix );
746 const QString exportFileDir = settings.
value( QStringLiteral(
"lastMeshDatasetDir" ), QDir::homePath(),
QgsSettings::App ).toString();
747 const QString saveFileName = QFileDialog::getSaveFileName(
nullptr,
748 QObject::tr(
"Save Mesh Datasets" ),
752 if ( saveFileName.isEmpty() )
755 const QFileInfo openFileInfo( saveFileName );
759 if ( mMeshLayer->
saveDataset( saveFileName, datasetGroup, driver ) )
761 QMessageBox::warning(
nullptr, QObject::tr(
"Save Mesh Datasets" ), QObject::tr(
"Saving datasets fails" ) );
766 QMessageBox::information(
nullptr, QObject::tr(
"Save Mesh Datasets" ), QObject::tr(
"Datasets successfully saved on file" ) );
776 if ( !
index.isValid() )
781 case Qt::DisplayRole:
783 return textDisplayed(
index );
785 #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0)
786 case Qt::BackgroundColorRole:
788 case Qt::BackgroundRole:
790 return backGroundColor(
index );
797 if ( !
index.isValid() )
807 if ( value != QString() )
809 item->
setName( value.toString() );
813 case Qt::CheckStateRole :
822 if ( !
index.isValid() )
823 return Qt::NoItemFlags;
825 if (
index.column() > 0 )
826 return Qt::ItemIsEnabled;
828 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
835 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
838 return tr(
"Group" );
842 return tr(
"Description" );
850 QString QgsMeshAvailableDatasetGroupTreeModel::textDisplayed(
const QModelIndex &index )
const
856 switch (
index.column() )
862 return tr(
"Vector" );
864 return tr(
"Scalar" );
871 QColor QgsMeshAvailableDatasetGroupTreeModel::backGroundColor(
const QModelIndex &index )
const
878 return QColor( 103, 0, 243, 44 );
880 return QColor( 252, 155, 79, 44 );
882 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
QRect iconRect(const QRect &rect, bool isVector) const
Icon rectangle for given item rectangle.
QgsMeshDatasetGroupTreeItemDelagate(QObject *parent=nullptr)
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
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 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)
@ Virtual
Temporary dataset group in memory.
@ Memory
Dataset group store in a file.
@ Persistent
Generic type used for non typed dataset group.
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.