QGIS API Documentation 3.99.0-Master (e9821da5c6b)
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}
43
45{
46 Q_UNUSED( parent )
47 return 1;
48}
49
50QVariant QgsMeshDatasetGroupTreeModel::data( const QModelIndex &index, int role ) const
51{
52 if ( !index.isValid() )
53 return QVariant();
54
55 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
56 if ( !item )
57 return QVariant();
58
59 switch ( role )
60 {
61 case Qt::DisplayRole:
62 case Name:
63 return item->name();
64 break;
65 case Qt::CheckStateRole:
66 if ( index.column() == 0 )
67 return static_cast<int>( item->isEnabled() ? Qt::Checked : Qt::Unchecked );
68 break;
70 return item->datasetGroupIndex();
71 break;
72 }
73
74 return QVariant();
75}
76
77Qt::ItemFlags QgsMeshDatasetGroupTreeModel::flags( const QModelIndex &index ) const
78{
79 if ( !index.isValid() )
80 return Qt::NoItemFlags;
81
82 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
83}
84
85QVariant QgsMeshDatasetGroupTreeModel::headerData( int section, Qt::Orientation orientation, int role ) const
86{
87 Q_UNUSED( section )
88
89 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
90 return tr( "Groups" );
91
92 return QVariant();
93}
94
95QModelIndex QgsMeshDatasetGroupTreeModel::index( int row, int column, const QModelIndex &parent )
96 const
97{
98 if ( !hasIndex( row, column, parent ) )
99 return QModelIndex();
100
101 QgsMeshDatasetGroupTreeItem *parentItem;
102
103 if ( !parent.isValid() )
104 parentItem = mRootItem.get();
105 else
106 parentItem = static_cast<QgsMeshDatasetGroupTreeItem *>( parent.internalPointer() );
107
108 QgsMeshDatasetGroupTreeItem *childItem = parentItem->child( row );
109 if ( childItem )
110 return createIndex( row, column, childItem );
111 else
112 return QModelIndex();
113}
114
115QModelIndex QgsMeshDatasetGroupTreeModel::parent( const QModelIndex &index ) const
116{
117 if ( !index.isValid() )
118 return QModelIndex();
119
120 QgsMeshDatasetGroupTreeItem *childItem = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
121 QgsMeshDatasetGroupTreeItem *parentItem = childItem->parentItem();
122
123 if ( parentItem == mRootItem.get() )
124 return QModelIndex();
125
126 return createIndex( parentItem->row(), 0, parentItem );
127}
128
129int QgsMeshDatasetGroupTreeModel::rowCount( const QModelIndex &parent ) const
130{
131 QgsMeshDatasetGroupTreeItem *parentItem;
132 if ( parent.column() > 0 )
133 return 0;
134
135 if ( !parent.isValid() )
136 parentItem = mRootItem.get();
137 else
138 parentItem = static_cast<QgsMeshDatasetGroupTreeItem *>( parent.internalPointer() );
139
140 if ( parentItem )
141 return parentItem->childCount();
142 else
143 return 0;
144}
145
147{
148 beginResetModel();
149 if ( layer && layer->datasetGroupTreeRootItem() )
150 mRootItem.reset( layer->datasetGroupTreeRootItem()->clone() );
151 else
152 mRootItem.reset();
153 endResetModel();
154}
155
160
162{
163 if ( mRootItem )
164 return mRootItem->childFromDatasetGroupIndex( groupIndex );
165 else
166 return nullptr;
167}
168
170{
171 if ( !index.isValid() || !hasIndex( index.row(), index.column(), index.parent() ) )
172 return nullptr;
173
174 return static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
175}
176
177bool QgsMeshDatasetGroupTreeModel::isEnabled( const QModelIndex &index ) const
178{
179 if ( !index.isValid() )
180 return false;
181
182 const QVariant checked = data( index, Qt::CheckStateRole );
183
184 return checked != QVariant() && checked.toInt() == Qt::Checked;
185}
186
188{
189 if ( !meshLayer )
190 return;
191
192 beginResetModel();
193 meshLayer->resetDatasetGroupTreeItem();
194 mRootItem.reset( meshLayer->datasetGroupTreeRootItem()->clone() );
195 endResetModel();
196}
197
199{
200 if ( !mRootItem )
201 return;
202
203 for ( int i = 0; i < mRootItem->childCount(); ++i )
204 {
205 QgsMeshDatasetGroupTreeItem *item = mRootItem->child( i );
206 item->setIsEnabled( isEnabled );
207 for ( int j = 0; j < item->childCount(); ++j )
208 {
209 QgsMeshDatasetGroupTreeItem *child = item->child( j );
210 child->setIsEnabled( isEnabled );
211 }
212 }
213 dataChanged( index( 0, 0 ), index( mRootItem->childCount(), 0 ) );
214}
215
217{
218 if ( !index.isValid() )
219 return;
220
221 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
222 if ( !item || item->datasetGroupType() == QgsMeshDatasetGroup::Persistent )
223 return;
224
225 beginRemoveRows( index.parent(), index.row(), index.row() );
227 parent->removeChild( item );
228 endRemoveRows();
229}
230
231void QgsMeshDatasetGroupTreeModel::setPersistentDatasetGroup( const QModelIndex &index, const QString &uri )
232{
233 if ( !index.isValid() )
234 return;
235
236 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
237 if ( !item )
238 return;
239 item->setPersistentDatasetGroup( uri );
240 dataChanged( index, index );
241}
242
244
246 : QSortFilterProxyModel( sourceModel )
247{
248 setSourceModel( sourceModel );
249}
250
252{
253 return mActiveScalarGroupIndex;
254}
255
257{
258 if ( mActiveScalarGroupIndex == group )
259 return;
260
261 const int oldGroupIndex = mActiveScalarGroupIndex;
262 mActiveScalarGroupIndex = group;
263
264 if ( oldGroupIndex > -1 || group > -1 )
265 invalidate();
266}
267
269{
270 return mActiveVectorGroupIndex;
271}
272
274{
275 if ( mActiveVectorGroupIndex == group )
276 return;
277
278 const int oldGroupIndex = mActiveVectorGroupIndex;
279 mActiveVectorGroupIndex = group;
280
281 if ( oldGroupIndex > -1 || group > -1 )
282 invalidate();
283}
284
285Qt::ItemFlags QgsMeshDatasetGroupProxyModel::flags( const QModelIndex &index ) const
286{
287 if ( !index.isValid() )
288 return Qt::NoItemFlags;
289
290 return Qt::ItemIsEnabled;
291}
292
293QVariant QgsMeshDatasetGroupProxyModel::data( const QModelIndex &index, int role ) const
294{
295 if ( !index.isValid() )
296 return QVariant();
297
298 const QModelIndex sourceIndex = mapToSource( index );
299 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( sourceIndex.internalPointer() );
300
301 switch ( role )
302 {
304 return item->isVector();
306 return item->datasetGroupIndex() == mActiveScalarGroupIndex;
308 return item->datasetGroupIndex() == mActiveVectorGroupIndex;
309 case Qt::CheckStateRole:
310 return QVariant();
311 case Qt::DecorationRole:
312 return QVariant();
313 case Qt::BackgroundRole:
314 return QVariant();
315 }
316
317 return sourceModel()->data( sourceIndex, role );
318}
319
321{
322 static_cast<QgsMeshDatasetGroupTreeModel *>( sourceModel() )->syncToLayer( layer );
323 mActiveScalarGroupIndex = layer->rendererSettings().activeScalarDatasetGroup();
324 mActiveVectorGroupIndex = layer->rendererSettings().activeVectorDatasetGroup();
325 invalidate();
326}
327
328bool QgsMeshDatasetGroupProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
329{
330 const QModelIndex sourceIndex = sourceModel()->index( source_row, 0, source_parent );
331
332 return static_cast<QgsMeshDatasetGroupTreeModel *>( sourceModel() )->isEnabled( sourceIndex );
333}
334
335
337
339 : QStyledItemDelegate( parent )
340 , mScalarSelectedPixmap( u":/images/themes/default/propertyicons/meshcontours.svg"_s )
341 , mScalarDeselectedPixmap( u":/images/themes/default/propertyicons/meshcontoursoff.svg"_s )
342 , mVectorSelectedPixmap( u":/images/themes/default/propertyicons/meshvectors.svg"_s )
343 , mVectorDeselectedPixmap( u":/images/themes/default/propertyicons/meshvectorsoff.svg"_s )
344{
345}
346
347void QgsMeshDatasetGroupTreeItemDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
348{
349 if ( !painter )
350 return;
351
352 QStyledItemDelegate::paint( painter, option, index );
353 const bool isVector = index.data( QgsMeshDatasetGroupTreeModel::IsVector ).toBool();
354 if ( isVector )
355 {
356 const bool isActive = index.data( QgsMeshDatasetGroupTreeModel::IsActiveVectorDatasetGroup ).toBool();
357 painter->drawPixmap( iconRect( option.rect, true ), isActive ? mVectorSelectedPixmap : mVectorDeselectedPixmap );
358 }
359
360 const bool isActive = index.data( QgsMeshDatasetGroupTreeModel::IsActiveScalarDatasetGroup ).toBool();
361 painter->drawPixmap( iconRect( option.rect, false ), isActive ? mScalarSelectedPixmap : mScalarDeselectedPixmap );
362}
363
364QRect QgsMeshDatasetGroupTreeItemDelegate::iconRect( const QRect &rect, bool isVector ) const
365{
366 return iconRect( rect, isVector ? 1 : 2 );
367}
368
369QRect QgsMeshDatasetGroupTreeItemDelegate::iconRect( const QRect &rect, int pos ) const
370{
371 const int iw = mScalarSelectedPixmap.width();
372 const int ih = mScalarSelectedPixmap.height();
373 const int margin = ( rect.height() - ih ) / 2;
374 return QRect( rect.right() - pos * ( iw + margin ), rect.top() + margin, iw, ih );
375}
376
377QSize QgsMeshDatasetGroupTreeItemDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
378{
379 QSize hint = QStyledItemDelegate::sizeHint( option, index );
380 if ( hint.height() < 16 )
381 hint.setHeight( 16 );
382 return hint;
383}
384
386
388 : QTreeView( parent ), mProxyModel( new QgsMeshDatasetGroupProxyModel( new QgsMeshDatasetGroupTreeModel( this ) ) )
389{
390 setModel( mProxyModel );
391 setItemDelegate( &mDelegate );
392 setSelectionMode( QAbstractItemView::SingleSelection );
393}
394
396{
397 if ( layer != mMeshLayer )
398 {
399 mMeshLayer = layer;
400 }
401}
402
404{
405 return mProxyModel->activeScalarGroup();
406}
407
409{
410 if ( mProxyModel->activeScalarGroup() != group )
411 {
412 mProxyModel->setActiveScalarGroup( group );
413 mProxyModel->invalidate();
414 emit activeScalarGroupChanged( group );
415 }
416}
417
419{
420 return mProxyModel->activeVectorGroup();
421}
422
424{
425 if ( mProxyModel->activeVectorGroup() != group )
426 {
427 mProxyModel->setActiveVectorGroup( group );
428 mProxyModel->invalidate();
429 emit activeVectorGroupChanged( group );
430 }
431}
432
434{
435 mProxyModel->syncToLayer( mMeshLayer );
436 setActiveGroup();
437}
438
440{
441 if ( !event )
442 return;
443
444 bool processed = false;
445 const QModelIndex idx = indexAt( event->pos() );
446 if ( idx.isValid() )
447 {
448 const QRect vr = visualRect( idx );
449 if ( mDelegate.iconRect( vr, true ).contains( event->pos() ) )
450 {
451 const bool isVector = idx.data( QgsMeshDatasetGroupTreeModel::IsVector ).toBool();
452 if ( isVector )
453 {
454 int datasetIndex = idx.data( QgsMeshDatasetGroupTreeModel::DatasetGroupIndex ).toInt();
455 if ( datasetIndex == activeVectorGroup() )
456 datasetIndex = -1;
457 setActiveVectorGroup( datasetIndex );
458 processed = true;
459 }
460 }
461 else if ( mDelegate.iconRect( vr, false ).contains( event->pos() ) )
462 {
463 int datasetIndex = idx.data( QgsMeshDatasetGroupTreeModel::DatasetGroupIndex ).toInt();
464 if ( datasetIndex == activeScalarGroup() )
465 datasetIndex = -1;
466 setActiveScalarGroup( datasetIndex );
467 processed = true;
468 }
469 }
470
471 // only if the user did not click one of the icons do usual handling
472 if ( !processed )
473 QTreeView::mousePressEvent( event );
474}
475
476void QgsMeshActiveDatasetGroupTreeView::setActiveGroup()
477{
478 int scalarGroup = -1;
479 int vectorGroup = -1;
480
481 // find active dataset
482 if ( mMeshLayer )
483 {
484 const QgsMeshRendererSettings rendererSettings = mMeshLayer->rendererSettings();
485 scalarGroup = rendererSettings.activeScalarDatasetGroup();
486 vectorGroup = rendererSettings.activeVectorDatasetGroup();
487 }
488
489 setActiveScalarGroup( scalarGroup );
490 setActiveVectorGroup( vectorGroup );
491}
492
494 : QAbstractListModel( parent )
495{}
496
498{
499 beginResetModel();
500 if ( layer )
501 mRootItem = layer->datasetGroupTreeRootItem();
502 endResetModel();
503}
504
505int QgsMeshDatasetGroupListModel::rowCount( const QModelIndex &parent ) const
506{
507 Q_UNUSED( parent );
508 if ( mRootItem )
509 return mRootItem->enabledDatasetGroupIndexes().count();
510 else
511 return 0;
512}
513
514QVariant QgsMeshDatasetGroupListModel::data( const QModelIndex &index, int role ) const
515{
516 if ( !mRootItem || !index.isValid() )
517 return QVariant();
518
519 if ( index.row() >= rowCount( QModelIndex() ) )
520 return QVariant();
521
522 const QList<int> list = mRootItem->enabledDatasetGroupIndexes();
523 if ( index.row() >= list.count() )
524 return QVariant();
525
526 QgsMeshDatasetGroupTreeItem *item = mRootItem->childFromDatasetGroupIndex( list.at( index.row() ) );
527
528 if ( !item )
529 return QVariant();
530
531 switch ( role )
532 {
533 case Qt::DisplayRole:
534 if ( mDisplayProviderName )
535 return item->providerName();
536 else
537 return item->name();
538 break;
539 case Qt::DecorationRole:
540 return QVariant();
541 break;
542 }
543
544 return QVariant();
545}
546
548{
549 mDisplayProviderName = displayProviderName;
550}
551
553{
554 const int varCount = rowCount( QModelIndex() );
555 QStringList variableNames;
556 for ( int i = 0; i < varCount; ++i )
557 variableNames.append( data( createIndex( i, 0 ), Qt::DisplayRole ).toString() );
558
559 return variableNames;
560}
561
563 : QTreeView( parent )
564 , mModel( new QgsMeshAvailableDatasetGroupTreeModel( this ) )
565 , mSaveMenu( new QgsMeshDatasetGroupSaveMenu( this ) )
566{
567 // To avoid the theme style overrides the background defined by the model
568 setStyleSheet( "QgsMeshDatasetGroupTreeView::item {background:none}" );
569
570 setModel( mModel );
571 setSelectionMode( QAbstractItemView::SingleSelection );
572 header()->setSectionResizeMode( QHeaderView::ResizeToContents );
573
574 connect( mSaveMenu, &QgsMeshDatasetGroupSaveMenu::datasetGroupSaved, this, &QgsMeshDatasetGroupTreeView::onDatasetGroupSaved );
575}
576
578{
579 if ( mModel )
580 mModel->syncToLayer( layer );
581 if ( mSaveMenu )
582 mSaveMenu->setMeshLayer( layer );
583}
584
586{
587 selectAllItem( true );
588}
589
591{
592 selectAllItem( false );
593}
594
595void QgsMeshDatasetGroupTreeView::contextMenuEvent( QContextMenuEvent *event )
596{
597 const QModelIndex idx = indexAt( event->pos() );
598 if ( !idx.isValid() )
599 setCurrentIndex( QModelIndex() );
600
601 std::unique_ptr<QMenu> menu( createContextMenu() );
602 if ( menu && menu->actions().count() != 0 )
603 menu->exec( mapToGlobal( event->pos() ) );
604}
605
606void QgsMeshDatasetGroupTreeView::removeCurrentItem()
607{
608 QgsMeshDatasetGroupTreeItem *item = mModel->datasetGroupTreeItem( currentIndex() );
609
610 if ( item )
611 {
612 const QList<int> dependencies = item->groupIndexDependencies();
613 if ( !dependencies.isEmpty() )
614 {
615 QString varList;
616 for ( const int dependentGroupIndex : dependencies )
617 {
618 QgsMeshDatasetGroupTreeItem *item = mModel->datasetGroupTreeItem( dependentGroupIndex );
619 if ( item )
620 {
621 varList.append( item->name() );
622 varList.append( u"\n"_s );
623 }
624 }
625 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 ) );
626 return;
627 }
628 }
629
630 if ( QMessageBox::question( this, tr( "Remove Dataset Group" ), tr( "Remove dataset group?" ) ) == QMessageBox::Yes )
631 mModel->removeItem( currentIndex() );
632}
633
634void QgsMeshDatasetGroupTreeView::onDatasetGroupSaved( const QString &uri )
635{
636 mModel->setPersistentDatasetGroup( currentIndex(), uri );
637 emit apply();
638}
639
640QMenu *QgsMeshDatasetGroupTreeView::createContextMenu()
641{
642 QMenu *contextMenu = new QMenu;
643
644 const QModelIndex &index = currentIndex();
645 if ( !index.isValid() )
646 return nullptr;
647
648 const int groupIndex = mModel->data( index, QgsMeshDatasetGroupTreeModel::DatasetGroupIndex ).toInt();
649 QgsMeshDatasetGroupTreeItem *item = mModel->datasetGroupTreeItem( groupIndex );
650
651 if ( !item )
652 return nullptr;
653
654 switch ( item->datasetGroupType() )
655 {
657 break;
659 break;
662 contextMenu->addAction( tr( "Remove Dataset Group" ), this, &QgsMeshDatasetGroupTreeView::removeCurrentItem );
663 mSaveMenu->createSaveMenu( groupIndex, contextMenu );
664 break;
665 }
666 return contextMenu;
667}
668
670{
671 mModel->resetDefault( meshLayer );
672}
673
675{
676 return mModel->datasetGroupTreeRootItem();
677}
678
679void QgsMeshDatasetGroupTreeView::selectAllItem( bool isChecked )
680{
681 mModel->setAllGroupsAsEnabled( isChecked );
682}
683
684QMenu *QgsMeshDatasetGroupSaveMenu::createSaveMenu( int groupIndex, QMenu *parentMenu )
685{
686 if ( !mMeshLayer )
687 return nullptr;
688
689 QMenu *menu = new QMenu( parentMenu );
690 menu->setTitle( QObject::tr( "Save Datasets Group as..." ) );
691 const QgsMeshDatasetGroupMetadata groupMeta = mMeshLayer->datasetGroupMetadata( groupIndex );
692
693 QgsProviderMetadata *providerMetadata = QgsProviderRegistry::instance()->providerMetadata( mMeshLayer->dataProvider()->name() );
694 if ( providerMetadata )
695 {
696 const QList<QgsMeshDriverMetadata> allDrivers = providerMetadata->meshDriversMetadata();
697 for ( const QgsMeshDriverMetadata &driver : allDrivers )
698 {
699 const QString driverName = driver.name();
700 const QString suffix = driver.writeDatasetOnFileSuffix();
701 if ( ( driver.capabilities().testFlag( QgsMeshDriverMetadata::MeshDriverCapability::CanWriteFaceDatasets )
704 {
705 menu->addAction( driver.description(), this, [groupIndex, driverName, suffix, this] {
706 this->saveDatasetGroup( groupIndex, driverName, suffix );
707 } );
708 }
709 }
710 }
711
712 if ( menu->actions().isEmpty() )
713 {
714 menu->addAction( QObject::tr( "No Driver Available to Write this Dataset Group" ) );
715 menu->actions().last()->setDisabled( true );
716 }
717
718 if ( parentMenu )
719 parentMenu->addMenu( menu );
720
721 return menu;
722}
723
725{
726 mMeshLayer = meshLayer;
727}
728
729void QgsMeshDatasetGroupSaveMenu::saveDatasetGroup( int datasetGroup, const QString &driver, const QString &fileSuffix )
730{
731 if ( !mMeshLayer )
732 return;
733
734 QgsSettings settings;
735 QString filter;
736 if ( !fileSuffix.isEmpty() )
737 filter = u"%1 (*.%2)"_s.arg( driver ).arg( fileSuffix );
738 const QString exportFileDir = settings.value( u"lastMeshDatasetDir"_s, QDir::homePath(), QgsSettings::App ).toString();
739 const QString saveFileName = QFileDialog::getSaveFileName( nullptr, QObject::tr( "Save Mesh Datasets" ), exportFileDir, filter );
740
741 if ( saveFileName.isEmpty() )
742 return;
743
744 const QFileInfo openFileInfo( saveFileName );
745 settings.setValue( u"lastMeshDatasetDir"_s, openFileInfo.absolutePath(), QgsSettings::App );
746
747
748 if ( mMeshLayer->saveDataset( saveFileName, datasetGroup, driver ) )
749 {
750 QMessageBox::warning( nullptr, QObject::tr( "Save Mesh Datasets" ), QObject::tr( "Saving datasets fails" ) );
751 }
752 else
753 {
754 emit datasetGroupSaved( saveFileName );
755 QMessageBox::information( nullptr, QObject::tr( "Save Mesh Datasets" ), QObject::tr( "Datasets successfully saved on file" ) );
756 }
757}
758
762
763QVariant QgsMeshAvailableDatasetGroupTreeModel::data( const QModelIndex &index, int role ) const
764{
765 if ( !index.isValid() )
766 return QVariant();
767
768 switch ( role )
769 {
770 case Qt::DisplayRole:
771 case Qt::EditRole:
772 case Name:
773 return textDisplayed( index );
774
775 case Qt::BackgroundRole:
776 return backGroundColor( index );
777 }
779}
780
781bool QgsMeshAvailableDatasetGroupTreeModel::setData( const QModelIndex &index, const QVariant &value, int role )
782{
783 if ( !index.isValid() )
784 return false;
785
786 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
787 if ( !item )
788 return false;
789
790 switch ( role )
791 {
792 case Qt::EditRole:
793 if ( value != QString() )
794 {
795 item->setName( value.toString() );
796 return true;
797 }
798 break;
799 case Qt::CheckStateRole:
800 item->setIsEnabled( value.toBool() );
801 return true;
802 }
803 return false;
804}
805
806Qt::ItemFlags QgsMeshAvailableDatasetGroupTreeModel::flags( const QModelIndex &index ) const
807{
808 if ( !index.isValid() )
809 return Qt::NoItemFlags;
810
811 if ( index.column() > 0 )
812 return Qt::ItemIsEnabled;
813
814 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
815}
816
817QVariant QgsMeshAvailableDatasetGroupTreeModel::headerData( int section, Qt::Orientation orientation, int role ) const
818{
819 Q_UNUSED( section )
820
821 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
822 {
823 if ( section == 0 )
824 return tr( "Group" );
825 if ( section == 1 )
826 return tr( "Type" );
827 if ( section == 2 )
828 return tr( "Description" );
829 }
830
831 return QVariant();
832}
833
835{
836 Q_UNUSED( parent );
837 return 3;
838}
839
840QString QgsMeshAvailableDatasetGroupTreeModel::textDisplayed( const QModelIndex &index ) const
841{
842 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
843 if ( !item )
844 return QString();
845
846 switch ( index.column() )
847 {
848 case 0:
849 return item->name();
850 case 1:
851 if ( item->isVector() )
852 return tr( "Vector" );
853 else
854 return tr( "Scalar" );
855 case 2:
856 return item->description();
857 }
858 return QString();
859}
860
861QColor QgsMeshAvailableDatasetGroupTreeModel::backGroundColor( const QModelIndex &index ) const
862{
863 QgsMeshDatasetGroupTreeItem *item = static_cast<QgsMeshDatasetGroupTreeItem *>( index.internalPointer() );
864 if ( !item )
865 return QColor();
866
868 return QColor( 103, 0, 243, 44 );
869 else if ( item->datasetGroupType() == QgsMeshDatasetGroup::Memory )
870 return QColor( 252, 155, 79, 44 );
871 else
872 return QColor( 252, 255, 79, 44 );
873}
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.