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.