26#include <QItemSelectionModel>
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() )
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:
311 case Qt::BackgroundRole:
315 return sourceModel()->data( sourceIndex, role );
328 const QModelIndex sourceIndex = sourceModel()->index( source_row, 0, source_parent );
337 : QStyledItemDelegate( parent )
338 , mScalarSelectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshcontours.svg" ) )
339 , mScalarDeselectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshcontoursoff.svg" ) )
340 , mVectorSelectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshvectors.svg" ) )
341 , mVectorDeselectedPixmap( QStringLiteral(
":/images/themes/default/propertyicons/meshvectorsoff.svg" ) )
350 QStyledItemDelegate::paint( painter, option, index );
355 painter->drawPixmap(
iconRect( option.rect,
true ), isActive ? mVectorSelectedPixmap : mVectorDeselectedPixmap );
359 painter->drawPixmap(
iconRect( option.rect,
false ), isActive ? mScalarSelectedPixmap : mScalarDeselectedPixmap );
364 return iconRect( rect, isVector ? 1 : 2 );
369 const int iw = mScalarSelectedPixmap.width();
370 const int ih = mScalarSelectedPixmap.height();
371 const int margin = ( rect.height() - ih ) / 2;
372 return QRect( rect.right() - pos * ( iw + margin ), rect.top() + margin, iw, ih );
377 QSize hint = QStyledItemDelegate::sizeHint( option, index );
378 if ( hint.height() < 16 )
379 hint.setHeight( 16 );
386 : QTreeView( parent ),
389 setModel( mProxyModel );
390 setItemDelegate( &mDelegate );
391 setSelectionMode( QAbstractItemView::SingleSelection );
396 if ( layer != mMeshLayer )
412 mProxyModel->invalidate();
427 mProxyModel->invalidate();
443 bool processed =
false;
444 const QModelIndex idx = indexAt( event->pos() ) ;
447 const QRect vr = visualRect( idx );
448 if ( mDelegate.
iconRect( vr,
true ).contains( event->pos() ) )
460 else if ( mDelegate.
iconRect( vr,
false ).contains( event->pos() ) )
472 QTreeView::mousePressEvent( event );
475void QgsMeshActiveDatasetGroupTreeView::setActiveGroup()
477 int scalarGroup = -1;
478 int vectorGroup = -1;
514 if ( !mRootItem || ! index.isValid() )
517 if ( index.row() >=
rowCount( QModelIndex() ) )
521 if ( index.row() >= list.count() )
531 case Qt::DisplayRole:
532 if ( mDisplayProviderName )
537 case Qt::DecorationRole:
547 mDisplayProviderName = displayProviderName;
552 const int varCount =
rowCount( QModelIndex() );
554 for (
int i = 0; i < varCount; ++i )
566 setStyleSheet(
"QgsMeshDatasetGroupTreeView::item {background:none}" );
569 setSelectionMode( QAbstractItemView::SingleSelection );
570 header()->setSectionResizeMode( QHeaderView::ResizeToContents );
585 selectAllItem(
true );
590 selectAllItem(
false );
595 const QModelIndex idx = indexAt( event->pos() );
596 if ( !idx.isValid() )
597 setCurrentIndex( QModelIndex() );
599 std::unique_ptr<QMenu> menu( createContextMenu() );
600 if ( menu && menu->actions().count() != 0 )
601 menu->exec( mapToGlobal( event->pos() ) );
604void QgsMeshDatasetGroupTreeView::removeCurrentItem()
611 if ( !dependencies.isEmpty() )
614 for (
const int dependentGroupIndex : dependencies )
619 varList.append( item->
name() );
620 varList.append( QStringLiteral(
"\n" ) );
623 QMessageBox::information(
this, tr(
"Remove Dataset Group" ), tr(
"This dataset group can't be removed because other dataset groups depend on it:\n%1" )
629 if ( QMessageBox::question(
this, tr(
"Remove Dataset Group" ), tr(
"Remove dataset group?" ) ) == QMessageBox::Yes )
633void QgsMeshDatasetGroupTreeView::onDatasetGroupSaved(
const QString &uri )
639QMenu *QgsMeshDatasetGroupTreeView::createContextMenu()
641 QMenu *contextMenu =
new QMenu;
643 const QModelIndex &index = currentIndex();
644 if ( !index.isValid() )
661 contextMenu->addAction( tr(
"Remove Dataset Group" ),
this, &QgsMeshDatasetGroupTreeView::removeCurrentItem );
678void QgsMeshDatasetGroupTreeView::selectAllItem(
bool isChecked )
688 QMenu *menu =
new QMenu( parentMenu );
689 menu->setTitle( QObject::tr(
"Save Datasets Group as..." ) );
693 if ( providerMetadata )
698 const QString driverName = driver.name();
699 const QString suffix = driver.writeDatasetOnFileSuffix();
707 menu->addAction( driver.description(),
this, [groupIndex, driverName, suffix,
this]
709 this->saveDatasetGroup( groupIndex, driverName, suffix );
715 if ( menu->actions().isEmpty() )
717 menu->addAction( QObject::tr(
"No Driver Available to Write this Dataset Group" ) );
718 menu->actions().last()->setDisabled(
true );
722 parentMenu->addMenu( menu );
729 mMeshLayer = meshLayer;
732void QgsMeshDatasetGroupSaveMenu::saveDatasetGroup(
int datasetGroup,
const QString &driver,
const QString &fileSuffix )
739 if ( !fileSuffix.isEmpty() )
740 filter = QStringLiteral(
"%1 (*.%2)" ).arg( driver ).arg( fileSuffix );
741 const QString exportFileDir = settings.
value( QStringLiteral(
"lastMeshDatasetDir" ), QDir::homePath(),
QgsSettings::App ).toString();
742 const QString saveFileName = QFileDialog::getSaveFileName(
nullptr,
743 QObject::tr(
"Save Mesh Datasets" ),
747 if ( saveFileName.isEmpty() )
750 const QFileInfo openFileInfo( saveFileName );
754 if ( mMeshLayer->
saveDataset( saveFileName, datasetGroup, driver ) )
756 QMessageBox::warning(
nullptr, QObject::tr(
"Save Mesh Datasets" ), QObject::tr(
"Saving datasets fails" ) );
761 QMessageBox::information(
nullptr, QObject::tr(
"Save Mesh Datasets" ), QObject::tr(
"Datasets successfully saved on file" ) );
771 if ( !
index.isValid() )
776 case Qt::DisplayRole:
779 return textDisplayed(
index );
781 case Qt::BackgroundRole:
782 return backGroundColor(
index );
789 if ( !
index.isValid() )
799 if ( value != QString() )
801 item->
setName( value.toString() );
805 case Qt::CheckStateRole :
814 if ( !
index.isValid() )
815 return Qt::NoItemFlags;
817 if (
index.column() > 0 )
818 return Qt::ItemIsEnabled;
820 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
827 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
830 return tr(
"Group" );
834 return tr(
"Description" );
842QString QgsMeshAvailableDatasetGroupTreeModel::textDisplayed(
const QModelIndex &index )
const
848 switch (
index.column() )
854 return tr(
"Vector" );
856 return tr(
"Scalar" );
863QColor QgsMeshAvailableDatasetGroupTreeModel::backGroundColor(
const QModelIndex &index )
const
870 return QColor( 103, 0, 243, 44 );
872 return QColor( 252, 155, 79, 44 );
874 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)
@ 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.