QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
Loading...
Searching...
No Matches
qgsmeshdatasetgrouptreeview.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmeshdatasetgrouptreeview.cpp
3 -------------------------------
4 begin : June 2018
5 copyright : (C) 2018 by Peter Petrik
6 email : zilolv at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgis.h"
19#include "qgsapplication.h"
20#include "qgsmeshlayer.h"
21#include "qgsprovidermetadata.h"
22#include "qgsproviderregistry.h"
23#include "qgssettings.h"
24
25#include <QFileDialog>
26#include <QHeaderView>
27#include <QItemSelectionModel>
28#include <QList>
29#include <QMenu>
30#include <QMessageBox>
31#include <QMouseEvent>
32#include <QString>
33
34#include "moc_qgsmeshdatasetgrouptreeview.cpp"
35
36using namespace Qt::StringLiterals;
37
39 : QAbstractItemModel( parent )
40 , mRootItem( new QgsMeshDatasetGroupTreeItem() )
41{}
42
44{
45 Q_UNUSED( parent )
46 return 1;
47}
48
49QVariant QgsMeshDatasetGroupTreeModel::data( const QModelIndex &index, int role ) const
50{
51 if ( !index.isValid() )
52 return QVariant();
53
54 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
55 if ( !item )
56 return QVariant();
57
58 switch ( role )
59 {
60 case Qt::DisplayRole:
61 case Name:
62 return item->name();
63 break;
64 case Qt::CheckStateRole:
65 if ( index.column() == 0 )
66 return static_cast<int>( item->isEnabled() ? Qt::Checked : Qt::Unchecked );
67 break;
69 return item->datasetGroupIndex();
70 break;
71 }
72
73 return QVariant();
74}
75
76Qt::ItemFlags QgsMeshDatasetGroupTreeModel::flags( const QModelIndex &index ) const
77{
78 if ( !index.isValid() )
79 return Qt::NoItemFlags;
80
81 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
82}
83
84QVariant QgsMeshDatasetGroupTreeModel::headerData( int section, Qt::Orientation orientation, int role ) const
85{
86 Q_UNUSED( section )
87
88 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
89 return tr( "Groups" );
90
91 return QVariant();
92}
93
94QModelIndex QgsMeshDatasetGroupTreeModel::index( int row, int column, const QModelIndex &parent ) const
95{
96 if ( !hasIndex( row, column, parent ) )
97 return QModelIndex();
98
100
101 if ( !parent.isValid() )
102 parentItem = mRootItem.get();
103 else
104 parentItem = static_cast<QgsMeshDatasetGroupTreeItem *>( parent.internalPointer() );
105
106 QgsMeshDatasetGroupTreeItem *childItem = parentItem->child( row );
107 if ( childItem )
108 return createIndex( row, column, childItem );
109 else
110 return QModelIndex();
111}
112
113QModelIndex QgsMeshDatasetGroupTreeModel::parent( const QModelIndex &index ) const
114{
115 if ( !index.isValid() )
116 return QModelIndex();
117
118 QgsMeshDatasetGroupTreeItem *childItem = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
119 QgsMeshDatasetGroupTreeItem *parentItem = childItem->parentItem();
120
121 if ( parentItem == mRootItem.get() )
122 return QModelIndex();
123
124 return createIndex( parentItem->row(), 0, parentItem );
125}
126
127int QgsMeshDatasetGroupTreeModel::rowCount( const QModelIndex &parent ) const
128{
129 QgsMeshDatasetGroupTreeItem *parentItem;
130 if ( parent.column() > 0 )
131 return 0;
132
133 if ( !parent.isValid() )
134 parentItem = mRootItem.get();
135 else
136 parentItem = static_cast<QgsMeshDatasetGroupTreeItem *>( parent.internalPointer() );
137
138 if ( parentItem )
139 return parentItem->childCount();
140 else
141 return 0;
142}
143
145{
146 beginResetModel();
147 if ( layer && layer->datasetGroupTreeRootItem() )
148 mRootItem.reset( layer->datasetGroupTreeRootItem()->clone() );
149 else
150 mRootItem.reset();
151 endResetModel();
152}
153
158
160{
161 if ( mRootItem )
162 return mRootItem->childFromDatasetGroupIndex( groupIndex );
163 else
164 return nullptr;
165}
166
168{
169 if ( !index.isValid() || !hasIndex( index.row(), index.column(), index.parent() ) )
170 return nullptr;
171
172 return static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
173}
174
175bool QgsMeshDatasetGroupTreeModel::isEnabled( const QModelIndex &index ) const
176{
177 if ( !index.isValid() )
178 return false;
179
180 const QVariant checked = data( index, Qt::CheckStateRole );
181
182 return checked != QVariant() && checked.toInt() == Qt::Checked;
183}
184
186{
187 if ( !meshLayer )
188 return;
189
190 beginResetModel();
191 meshLayer->resetDatasetGroupTreeItem();
192 mRootItem.reset( meshLayer->datasetGroupTreeRootItem()->clone() );
193 endResetModel();
194}
195
197{
198 if ( !mRootItem )
199 return;
200
201 for ( int i = 0; i < mRootItem->childCount(); ++i )
202 {
203 QgsMeshDatasetGroupTreeItem *item = mRootItem->child( i );
204 item->setIsEnabled( isEnabled );
205 for ( int j = 0; j < item->childCount(); ++j )
206 {
207 QgsMeshDatasetGroupTreeItem *child = item->child( j );
208 child->setIsEnabled( isEnabled );
209 }
210 }
211 dataChanged( index( 0, 0 ), index( mRootItem->childCount(), 0 ) );
212}
213
215{
216 if ( !index.isValid() )
217 return;
218
219 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
220 if ( !item || item->datasetGroupType() == QgsMeshDatasetGroup::Persistent )
221 return;
222
223 beginRemoveRows( index.parent(), index.row(), index.row() );
225 parent->removeChild( item );
226 endRemoveRows();
227}
228
229void QgsMeshDatasetGroupTreeModel::setPersistentDatasetGroup( const QModelIndex &index, const QString &uri )
230{
231 if ( !index.isValid() )
232 return;
233
234 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
235 if ( !item )
236 return;
237 item->setPersistentDatasetGroup( uri );
238 dataChanged( index, index );
239}
240
242
244 : QSortFilterProxyModel( sourceModel )
245{
246 setSourceModel( sourceModel );
247}
248
250{
251 return mActiveScalarGroupIndex;
252}
253
255{
256 if ( mActiveScalarGroupIndex == group )
257 return;
258
259 const int oldGroupIndex = mActiveScalarGroupIndex;
260 mActiveScalarGroupIndex = group;
261
262 if ( oldGroupIndex > -1 || group > -1 )
263 invalidate();
264}
265
267{
268 return mActiveVectorGroupIndex;
269}
270
272{
273 if ( mActiveVectorGroupIndex == group )
274 return;
275
276 const int oldGroupIndex = mActiveVectorGroupIndex;
277 mActiveVectorGroupIndex = group;
278
279 if ( oldGroupIndex > -1 || group > -1 )
280 invalidate();
281}
282
283Qt::ItemFlags QgsMeshDatasetGroupProxyModel::flags( const QModelIndex &index ) const
284{
285 if ( !index.isValid() )
286 return Qt::NoItemFlags;
287
288 return Qt::ItemIsEnabled;
289}
290
291QVariant QgsMeshDatasetGroupProxyModel::data( const QModelIndex &index, int role ) const
292{
293 if ( !index.isValid() )
294 return QVariant();
295
296 const QModelIndex sourceIndex = mapToSource( index );
297 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( sourceIndex.internalPointer() );
298
299 switch ( role )
300 {
302 return item->isVector();
304 return item->datasetGroupIndex() == mActiveScalarGroupIndex;
306 return item->datasetGroupIndex() == mActiveVectorGroupIndex;
307 case Qt::CheckStateRole:
308 return QVariant();
309 case Qt::DecorationRole:
310 return QVariant();
311 case Qt::BackgroundRole:
312 return QVariant();
313 }
314
315 return sourceModel()->data( sourceIndex, role );
316}
317
319{
320 static_cast<QgsMeshDatasetGroupTreeModel *>( sourceModel() )->syncToLayer( layer );
321 mActiveScalarGroupIndex = layer->rendererSettings().activeScalarDatasetGroup();
322 mActiveVectorGroupIndex = layer->rendererSettings().activeVectorDatasetGroup();
323 invalidate();
324}
325
326bool QgsMeshDatasetGroupProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
327{
328 const QModelIndex sourceIndex = sourceModel()->index( source_row, 0, source_parent );
329
330 return static_cast<QgsMeshDatasetGroupTreeModel *>( sourceModel() )->isEnabled( sourceIndex );
331}
332
333
335
337 : QStyledItemDelegate( parent )
338 , mScalarSelectedPixmap( u":/images/themes/default/propertyicons/meshcontours.svg"_s )
339 , mScalarDeselectedPixmap( u":/images/themes/default/propertyicons/meshcontoursoff.svg"_s )
340 , mVectorSelectedPixmap( u":/images/themes/default/propertyicons/meshvectors.svg"_s )
341 , mVectorDeselectedPixmap( u":/images/themes/default/propertyicons/meshvectorsoff.svg"_s )
342{}
343
344void QgsMeshDatasetGroupTreeItemDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
345{
346 if ( !painter )
347 return;
348
349 QStyledItemDelegate::paint( painter, option, index );
350 const bool isVector = index.data( QgsMeshDatasetGroupTreeModel::IsVector ).toBool();
351 if ( isVector )
352 {
353 const bool isActive = index.data( QgsMeshDatasetGroupTreeModel::IsActiveVectorDatasetGroup ).toBool();
354 painter->drawPixmap( iconRect( option.rect, true ), isActive ? mVectorSelectedPixmap : mVectorDeselectedPixmap );
355 }
356
357 const bool isActive = index.data( QgsMeshDatasetGroupTreeModel::IsActiveScalarDatasetGroup ).toBool();
358 painter->drawPixmap( iconRect( option.rect, false ), isActive ? mScalarSelectedPixmap : mScalarDeselectedPixmap );
359}
360
361QRect QgsMeshDatasetGroupTreeItemDelegate::iconRect( const QRect &rect, bool isVector ) const
362{
363 return iconRect( rect, isVector ? 1 : 2 );
364}
365
366QRect QgsMeshDatasetGroupTreeItemDelegate::iconRect( const QRect &rect, int pos ) const
367{
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 );
372}
373
374QSize QgsMeshDatasetGroupTreeItemDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
375{
376 QSize hint = QStyledItemDelegate::sizeHint( option, index );
377 if ( hint.height() < 16 )
378 hint.setHeight( 16 );
379 return hint;
380}
381
383
385 : QTreeView( parent )
386 , mProxyModel( new QgsMeshDatasetGroupProxyModel( new QgsMeshDatasetGroupTreeModel( this ) ) )
387{
388 setModel( mProxyModel );
389 setItemDelegate( &mDelegate );
390 setSelectionMode( QAbstractItemView::SingleSelection );
391}
392
394{
395 if ( layer != mMeshLayer )
396 {
397 mMeshLayer = layer;
398 }
399}
400
402{
403 return mProxyModel->activeScalarGroup();
404}
405
407{
408 if ( mProxyModel->activeScalarGroup() != group )
409 {
410 mProxyModel->setActiveScalarGroup( group );
411 mProxyModel->invalidate();
412 emit activeScalarGroupChanged( group );
413 }
414}
415
417{
418 return mProxyModel->activeVectorGroup();
419}
420
422{
423 if ( mProxyModel->activeVectorGroup() != group )
424 {
425 mProxyModel->setActiveVectorGroup( group );
426 mProxyModel->invalidate();
427 emit activeVectorGroupChanged( group );
428 }
429}
430
432{
433 mProxyModel->syncToLayer( mMeshLayer );
434 setActiveGroup();
435}
436
438{
439 if ( !event )
440 return;
441
442 bool processed = false;
443 const QModelIndex idx = indexAt( event->pos() );
444 if ( idx.isValid() )
445 {
446 const QRect vr = visualRect( idx );
447 if ( mDelegate.iconRect( vr, true ).contains( event->pos() ) )
448 {
449 const bool isVector = idx.data( QgsMeshDatasetGroupTreeModel::IsVector ).toBool();
450 if ( isVector )
451 {
452 int datasetIndex = idx.data( QgsMeshDatasetGroupTreeModel::DatasetGroupIndex ).toInt();
453 if ( datasetIndex == activeVectorGroup() )
454 datasetIndex = -1;
455 setActiveVectorGroup( datasetIndex );
456 processed = true;
457 }
458 }
459 else if ( mDelegate.iconRect( vr, false ).contains( event->pos() ) )
460 {
461 int datasetIndex = idx.data( QgsMeshDatasetGroupTreeModel::DatasetGroupIndex ).toInt();
462 if ( datasetIndex == activeScalarGroup() )
463 datasetIndex = -1;
464 setActiveScalarGroup( datasetIndex );
465 processed = true;
466 }
467 }
468
469 // only if the user did not click one of the icons do usual handling
470 if ( !processed )
471 QTreeView::mousePressEvent( event );
472}
473
474void QgsMeshActiveDatasetGroupTreeView::setActiveGroup()
475{
476 int scalarGroup = -1;
477 int vectorGroup = -1;
478
479 // find active dataset
480 if ( mMeshLayer )
481 {
482 const QgsMeshRendererSettings rendererSettings = mMeshLayer->rendererSettings();
483 scalarGroup = rendererSettings.activeScalarDatasetGroup();
484 vectorGroup = rendererSettings.activeVectorDatasetGroup();
485 }
486
487 setActiveScalarGroup( scalarGroup );
488 setActiveVectorGroup( vectorGroup );
489}
490
492 : QAbstractListModel( parent )
493{}
494
496{
497 beginResetModel();
498 if ( layer )
499 mRootItem = layer->datasetGroupTreeRootItem();
500 endResetModel();
501}
502
503int QgsMeshDatasetGroupListModel::rowCount( const QModelIndex &parent ) const
504{
505 Q_UNUSED( parent );
506 if ( mRootItem )
507 return mRootItem->enabledDatasetGroupIndexes().count();
508 else
509 return 0;
510}
511
512QVariant QgsMeshDatasetGroupListModel::data( const QModelIndex &index, int role ) const
513{
514 if ( !mRootItem || !index.isValid() )
515 return QVariant();
516
517 if ( index.row() >= rowCount( QModelIndex() ) )
518 return QVariant();
519
520 const QList<int> list = mRootItem->enabledDatasetGroupIndexes();
521 if ( index.row() >= list.count() )
522 return QVariant();
523
524 QgsMeshDatasetGroupTreeItem *item = mRootItem->childFromDatasetGroupIndex( list.at( index.row() ) );
525
526 if ( !item )
527 return QVariant();
528
529 switch ( role )
530 {
531 case Qt::DisplayRole:
532 if ( mDisplayProviderName )
533 return item->providerName();
534 else
535 return item->name();
536 break;
537 case Qt::DecorationRole:
538 return QVariant();
539 break;
540 }
541
542 return QVariant();
543}
544
546{
547 mDisplayProviderName = displayProviderName;
548}
549
551{
552 const int varCount = rowCount( QModelIndex() );
553 QStringList variableNames;
554 for ( int i = 0; i < varCount; ++i )
555 variableNames.append( data( createIndex( i, 0 ), Qt::DisplayRole ).toString() );
556
557 return variableNames;
558}
559
561 : QTreeView( parent )
562 , mModel( new QgsMeshAvailableDatasetGroupTreeModel( this ) )
563 , mSaveMenu( new QgsMeshDatasetGroupSaveMenu( this ) )
564{
565 // To avoid the theme style overrides the background defined by the model
566 setStyleSheet( "QgsMeshDatasetGroupTreeView::item {background:none}" );
567
568 setModel( mModel );
569 setSelectionMode( QAbstractItemView::SingleSelection );
570 header()->setSectionResizeMode( QHeaderView::ResizeToContents );
571
572 connect( mSaveMenu, &QgsMeshDatasetGroupSaveMenu::datasetGroupSaved, this, &QgsMeshDatasetGroupTreeView::onDatasetGroupSaved );
573}
574
576{
577 if ( mModel )
578 mModel->syncToLayer( layer );
579 if ( mSaveMenu )
580 mSaveMenu->setMeshLayer( layer );
581}
582
584{
585 selectAllItem( true );
586}
587
589{
590 selectAllItem( false );
591}
592
593void QgsMeshDatasetGroupTreeView::contextMenuEvent( QContextMenuEvent *event )
594{
595 const QModelIndex idx = indexAt( event->pos() );
596 if ( !idx.isValid() )
597 setCurrentIndex( QModelIndex() );
598
599 std::unique_ptr<QMenu> menu( createContextMenu() );
600 if ( menu && menu->actions().count() != 0 )
601 menu->exec( mapToGlobal( event->pos() ) );
602}
603
604void QgsMeshDatasetGroupTreeView::removeCurrentItem()
605{
606 QgsMeshDatasetGroupTreeItem *item = mModel->datasetGroupTreeItem( currentIndex() );
607
608 if ( item )
609 {
610 const QList<int> dependencies = item->groupIndexDependencies();
611 if ( !dependencies.isEmpty() )
612 {
613 QString varList;
614 for ( const int dependentGroupIndex : dependencies )
615 {
616 QgsMeshDatasetGroupTreeItem *item = mModel->datasetGroupTreeItem( dependentGroupIndex );
617 if ( item )
618 {
619 varList.append( item->name() );
620 varList.append( u"\n"_s );
621 }
622 }
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" ).arg( varList ) );
624 return;
625 }
626 }
627
628 if ( QMessageBox::question( this, tr( "Remove Dataset Group" ), tr( "Remove dataset group?" ) ) == QMessageBox::Yes )
629 mModel->removeItem( currentIndex() );
630}
631
632void QgsMeshDatasetGroupTreeView::onDatasetGroupSaved( const QString &uri )
633{
634 mModel->setPersistentDatasetGroup( currentIndex(), uri );
635 emit apply();
636}
637
638QMenu *QgsMeshDatasetGroupTreeView::createContextMenu()
639{
640 QMenu *contextMenu = new QMenu;
641
642 const QModelIndex &index = currentIndex();
643 if ( !index.isValid() )
644 return nullptr;
645
646 const int groupIndex = mModel->data( index, QgsMeshDatasetGroupTreeModel::DatasetGroupIndex ).toInt();
647 QgsMeshDatasetGroupTreeItem *item = mModel->datasetGroupTreeItem( groupIndex );
648
649 if ( !item )
650 return nullptr;
651
652 switch ( item->datasetGroupType() )
653 {
655 break;
657 break;
660 contextMenu->addAction( tr( "Remove Dataset Group" ), this, &QgsMeshDatasetGroupTreeView::removeCurrentItem );
661 mSaveMenu->createSaveMenu( groupIndex, contextMenu );
662 break;
663 }
664 return contextMenu;
665}
666
668{
669 mModel->resetDefault( meshLayer );
670}
671
673{
674 return mModel->datasetGroupTreeRootItem();
675}
676
677void QgsMeshDatasetGroupTreeView::selectAllItem( bool isChecked )
678{
679 mModel->setAllGroupsAsEnabled( isChecked );
680}
681
682QMenu *QgsMeshDatasetGroupSaveMenu::createSaveMenu( int groupIndex, QMenu *parentMenu )
683{
684 if ( !mMeshLayer )
685 return nullptr;
686
687 QMenu *menu = new QMenu( parentMenu );
688 menu->setTitle( QObject::tr( "Save Datasets Group as..." ) );
689 const QgsMeshDatasetGroupMetadata groupMeta = mMeshLayer->datasetGroupMetadata( groupIndex );
690
691 QgsProviderMetadata *providerMetadata = QgsProviderRegistry::instance()->providerMetadata( mMeshLayer->dataProvider()->name() );
692 if ( providerMetadata )
693 {
694 const QList<QgsMeshDriverMetadata> allDrivers = providerMetadata->meshDriversMetadata();
695 for ( const QgsMeshDriverMetadata &driver : allDrivers )
696 {
697 const QString driverName = driver.name();
698 const QString suffix = driver.writeDatasetOnFileSuffix();
702 {
703 menu->addAction( driver.description(), this, [groupIndex, driverName, suffix, this] { this->saveDatasetGroup( groupIndex, driverName, suffix ); } );
704 }
705 }
706 }
707
708 if ( menu->actions().isEmpty() )
709 {
710 menu->addAction( QObject::tr( "No Driver Available to Write this Dataset Group" ) );
711 menu->actions().last()->setDisabled( true );
712 }
713
714 if ( parentMenu )
715 parentMenu->addMenu( menu );
716
717 return menu;
718}
719
721{
722 mMeshLayer = meshLayer;
723}
724
725void QgsMeshDatasetGroupSaveMenu::saveDatasetGroup( int datasetGroup, const QString &driver, const QString &fileSuffix )
726{
727 if ( !mMeshLayer )
728 return;
729
730 QgsSettings settings;
731 QString filter;
732 if ( !fileSuffix.isEmpty() )
733 filter = u"%1 (*.%2)"_s.arg( driver ).arg( fileSuffix );
734 const QString exportFileDir = settings.value( u"lastMeshDatasetDir"_s, QDir::homePath(), QgsSettings::App ).toString();
735 const QString saveFileName = QFileDialog::getSaveFileName( nullptr, QObject::tr( "Save Mesh Datasets" ), exportFileDir, filter );
736
737 if ( saveFileName.isEmpty() )
738 return;
739
740 const QFileInfo openFileInfo( saveFileName );
741 settings.setValue( u"lastMeshDatasetDir"_s, openFileInfo.absolutePath(), QgsSettings::App );
742
743
744 if ( mMeshLayer->saveDataset( saveFileName, datasetGroup, driver ) )
745 {
746 QMessageBox::warning( nullptr, QObject::tr( "Save Mesh Datasets" ), QObject::tr( "Saving datasets fails" ) );
747 }
748 else
749 {
750 emit datasetGroupSaved( saveFileName );
751 QMessageBox::information( nullptr, QObject::tr( "Save Mesh Datasets" ), QObject::tr( "Datasets successfully saved on file" ) );
752 }
753}
754
758
759QVariant QgsMeshAvailableDatasetGroupTreeModel::data( const QModelIndex &index, int role ) const
760{
761 if ( !index.isValid() )
762 return QVariant();
763
764 switch ( role )
765 {
766 case Qt::DisplayRole:
767 case Qt::EditRole:
768 case Name:
769 return textDisplayed( index );
770
771 case Qt::BackgroundRole:
772 return backGroundColor( index );
773 }
775}
776
777bool QgsMeshAvailableDatasetGroupTreeModel::setData( const QModelIndex &index, const QVariant &value, int role )
778{
779 if ( !index.isValid() )
780 return false;
781
782 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
783 if ( !item )
784 return false;
785
786 switch ( role )
787 {
788 case Qt::EditRole:
789 if ( value != QString() )
790 {
791 item->setName( value.toString() );
792 return true;
793 }
794 break;
795 case Qt::CheckStateRole:
796 item->setIsEnabled( value.toBool() );
797 return true;
798 }
799 return false;
800}
801
802Qt::ItemFlags QgsMeshAvailableDatasetGroupTreeModel::flags( const QModelIndex &index ) const
803{
804 if ( !index.isValid() )
805 return Qt::NoItemFlags;
806
807 if ( index.column() > 0 )
808 return Qt::ItemIsEnabled;
809
810 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
811}
812
813QVariant QgsMeshAvailableDatasetGroupTreeModel::headerData( int section, Qt::Orientation orientation, int role ) const
814{
815 Q_UNUSED( section )
816
817 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
818 {
819 if ( section == 0 )
820 return tr( "Group" );
821 if ( section == 1 )
822 return tr( "Type" );
823 if ( section == 2 )
824 return tr( "Description" );
825 }
826
827 return QVariant();
828}
829
831{
832 Q_UNUSED( parent );
833 return 3;
834}
835
836QString QgsMeshAvailableDatasetGroupTreeModel::textDisplayed( const QModelIndex &index ) const
837{
838 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
839 if ( !item )
840 return QString();
841
842 switch ( index.column() )
843 {
844 case 0:
845 return item->name();
846 case 1:
847 if ( item->isVector() )
848 return tr( "Vector" );
849 else
850 return tr( "Scalar" );
851 case 2:
852 return item->description();
853 }
854 return QString();
855}
856
857QColor QgsMeshAvailableDatasetGroupTreeModel::backGroundColor( const QModelIndex &index ) const
858{
859 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
860 if ( !item )
861 return QColor();
862
864 return QColor( 103, 0, 243, 44 );
865 else if ( item->datasetGroupType() == QgsMeshDatasetGroup::Memory )
866 return QColor( 252, 155, 79, 44 );
867 else
868 return QColor( 252, 255, 79, 44 );
869}
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.
Item model for available mesh dataset groups.
Qt::ItemFlags flags(const QModelIndex &index) const override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
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.
A collection of dataset group metadata such as whether the data is vector or scalar,...
DataType dataType() const
Returns whether dataset group data is defined on vertices or faces or volumes.
@ DataOnEdges
Data is defined on edges.
@ DataOnFaces
Data is defined on faces.
@ DataOnVertices
Data is defined on vertices.
A proxy model for filtering mesh dataset groups.
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
Responsible for creating menus for saving mesh dataset groups.
QMenu * createSaveMenu(int groupIndex, QMenu *parentMenu=nullptr)
void datasetGroupSaved(const QString &uri)
void setMeshLayer(QgsMeshLayer *meshLayer)
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
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...
bool isVector() const
Return true if the dataset group is vector.
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
Returns the dataset group index.
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.
bool isEnabled() const
Returns true if the item is enabled, i.e.
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
Returns the dataset group type.
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.
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
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.
Holds metadata about mesh drivers.
@ CanWriteVertexDatasets
If the driver can persist datasets defined on vertices.
@ CanWriteEdgeDatasets
If the driver can persist datasets defined on edges.
@ CanWriteFaceDatasets
If the driver can persist datasets defined on faces.
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.
QgsMeshDatasetGroupTreeItem * datasetGroupTreeRootItem() const
Returns the root items of the dataset group tree item.
Represents all mesh renderer settings.
int activeVectorDatasetGroup() const
Returns the active vector dataset group.
int activeScalarDatasetGroup() const
Returns the active scalar dataset group.
Holds data provider key, description, and associated shared library file or function pointer informat...
virtual QList< QgsMeshDriverMetadata > meshDriversMetadata()
Builds the list of available mesh drivers metadata.
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.
Stores settings for use within QGIS.
Definition qgssettings.h:68
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.