QGIS API Documentation 3.99.0-Master (a8f284845db)
Loading...
Searching...
No Matches
qgsattributesformmodel.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsattributesformmodel.h
3 ---------------------
4 begin : March 2025
5 copyright : (C) 2025 by Germán Carrillo
6 email : german at opengis dot ch
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
16#ifndef QGSATTRIBUTESFORMMODEL_H
17#define QGSATTRIBUTESFORMMODEL_H
18
19// We don't want to expose this in the public API
20
21#include "qgsaction.h"
22#include "qgsaddtaborgroup.h"
25#include "qgsvectorlayer.h"
26
27#include <QAbstractItemModel>
28#include <QPushButton>
29#include <QSortFilterProxyModel>
30
31#define SIP_NO_FILE
32
41class GUI_EXPORT QgsAttributesFormData
42{
43 public:
62
89
91 {
92 operator QVariant();
93
96 QVariant nmRelationId;
98 QString label;
99 };
100
102 {
103 QString qmlCode;
104 };
105
107 {
108 QString htmlCode;
109 };
110
112 {
113 QString text;
114 };
115
117 {
118 bool drawLine = false;
119 };
120
128 class GUI_EXPORT AttributeFormItemData
129 {
130 public:
132
134 operator QVariant() { return QVariant::fromValue<AttributeFormItemData>( *this ); }
135
137 int columnCount() const { return mColumnCount; }
138
140 void setColumnCount( int count ) { mColumnCount = count; }
141
148 Qgis::AttributeEditorContainerType containerType() const;
149
156 void setContainerType( Qgis::AttributeEditorContainerType type );
157
166 bool collapsed() const { return mCollapsed; };
167
175 void setCollapsed( bool collapsed ) { mCollapsed = collapsed; };
176
182 const QgsAttributeEditorElement::LabelStyle labelStyle() const;
183
189 void setLabelStyle( const QgsAttributeEditorElement::LabelStyle &labelStyle );
190
192 bool showLabel() const;
193
195 void setShowLabel( bool showLabel );
196
205 int horizontalStretch() const { return mHorizontalStretch; }
206
215 void setHorizontalStretch( int stretch ) { mHorizontalStretch = stretch; }
216
225 int verticalStretch() const { return mVerticalStretch; }
226
235 void setVerticalStretch( int stretch ) { mVerticalStretch = stretch; }
236
242 QgsOptionalExpression visibilityExpression() const;
243
250 void setVisibilityExpression( const QgsOptionalExpression &visibilityExpression );
251
260 QgsOptionalExpression collapsedExpression() const;
261
270 void setCollapsedExpression( const QgsOptionalExpression &collapsedExpression );
271
277 RelationEditorConfiguration relationEditorConfiguration() const;
278
284 void setRelationEditorConfiguration( const RelationEditorConfiguration &relationEditorConfiguration );
285
291 QmlElementEditorConfiguration qmlElementEditorConfiguration() const;
292
298 void setQmlElementEditorConfiguration( const QmlElementEditorConfiguration &qmlElementEditorConfiguration );
299
305 HtmlElementEditorConfiguration htmlElementEditorConfiguration() const;
306
312 void setHtmlElementEditorConfiguration( const HtmlElementEditorConfiguration &htmlElementEditorConfiguration );
313
318 SpacerElementEditorConfiguration spacerElementEditorConfiguration() const;
319
324 void setSpacerElementEditorConfiguration( SpacerElementEditorConfiguration spacerElementEditorConfiguration );
325
331 QColor backgroundColor() const;
332
338 void setBackgroundColor( const QColor &backgroundColor );
339
344 TextElementEditorConfiguration textElementEditorConfiguration() const;
345
350 void setTextElementEditorConfiguration( const TextElementEditorConfiguration &textElementEditorConfiguration );
351
352 private:
353 int mColumnCount = 1;
355 bool mShowLabel = true;
356 int mHorizontalStretch = 0;
357 int mVerticalStretch = 0;
358 QgsOptionalExpression mVisibilityExpression;
359 RelationEditorConfiguration mRelationEditorConfiguration;
360 QmlElementEditorConfiguration mQmlElementEditorConfiguration;
361 HtmlElementEditorConfiguration mHtmlElementEditorConfiguration;
362 TextElementEditorConfiguration mTextElementEditorConfiguration;
363 SpacerElementEditorConfiguration mSpacerElementEditorConfiguration;
364 QColor mBackgroundColor;
365 bool mCollapsed = false;
366 QgsOptionalExpression mCollapsedExpression;
368 };
369};
370
371
379class GUI_EXPORT QgsAttributesFormItem : public QObject
380{
381 Q_OBJECT
382
383 public:
385
396 explicit QgsAttributesFormItem( QgsAttributesFormData::AttributesFormItemType itemType, const QString &name, const QString &displayName = QString(), QgsAttributesFormItem *parent = nullptr );
397
409
416
422 QgsAttributesFormItem *firstTopChild( const QgsAttributesFormData::AttributesFormItemType itemType, const QString &itemId ) const;
423
429 QgsAttributesFormItem *firstChildRecursive( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
430
434 int childCount() const;
435
441 QgsAttributesFormItem *parent() { return mParent; }
442
446 int row() const;
447
451 QVariant data( int role ) const;
452
456 bool setData( int role, const QVariant &value );
457
461 void addChild( std::unique_ptr< QgsAttributesFormItem > &&child );
462
466 void insertChild( int position, std::unique_ptr< QgsAttributesFormItem > &&item );
467
471 void deleteChildAtIndex( int index );
472
476 void deleteChildren();
477
482
486 QString id() const { return mId; }
487
491 QString name() const { return mName; }
492
496 QString displayName() const { return mDisplayName; }
497
503 QIcon icon() const { return mIcon; }
504
510 void setIcon( const QIcon &icon ) { mIcon = icon; }
511
517 static bool isGroup( QgsAttributesFormItem *item );
518
519 signals:
520
526 void addedChildren( QgsAttributesFormItem *item, int indexFrom, int indexTo );
527
528 private:
529 QString mName = QString();
530 QString mDisplayName = QString();
531 QIcon mIcon;
533 QString mId = QString();
535 QgsAttributesFormData::FieldConfig mFieldConfigData;
536
537 std::vector< std::unique_ptr< QgsAttributesFormItem > > mChildren;
538 QgsAttributesFormItem *mParent = nullptr;
539
540 Q_DISABLE_COPY( QgsAttributesFormItem )
541};
542
543
551class GUI_EXPORT QgsAttributesFormModel : public QAbstractItemModel
552{
553 Q_OBJECT
554
555 public:
571
577 explicit QgsAttributesFormModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
578
580
581 QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
582 QModelIndex parent( const QModelIndex &index ) const override;
583
584 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
585 int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
586
587 bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
588
594 QModelIndex firstTopMatchingModelIndex( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
595
601 QModelIndex firstRecursiveMatchingModelIndex( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
602
608 bool showAliases() const;
609
615 void setShowAliases( bool show );
616
622 QgsAttributesFormItem *itemForIndex( const QModelIndex &index ) const;
623
630
631 public slots:
632
636 virtual void populate() = 0;
637
638 signals:
639
646
647 protected:
659 bool indexLessThan( const QModelIndex &a, const QModelIndex &b ) const;
660
666 QVector<int> rootToLeafPath( QgsAttributesFormItem *item ) const;
667
668
677 void emitDataChangedRecursively( const QModelIndex &parent = QModelIndex(), const QVector<int> &roles = QVector<int>() );
678
679 std::unique_ptr< QgsAttributesFormItem > mRootItem;
682
683 bool mShowAliases = false;
684};
685
686
695{
696 Q_OBJECT
697
698 public:
704 explicit QgsAttributesAvailableWidgetsModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
705
706 Qt::ItemFlags flags( const QModelIndex &index ) const override;
707 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
708
709 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
710
711 Qt::DropActions supportedDragActions() const override;
712 QStringList mimeTypes() const override;
713 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
714
720 QModelIndex fieldContainer() const;
721
727 QModelIndex relationContainer() const;
728
734 QModelIndex actionContainer() const;
735
739 QModelIndex fieldModelIndex( const QString &fieldName ) const;
740
741 public slots:
742 void populate() override;
743
749 void populateLayerActions( const QList< QgsAction > actions );
750
751 private:
757 void populateActionItems( const QList<QgsAction> actions );
758};
759
760
769{
770 Q_OBJECT
771
772 public:
779 explicit QgsAttributesFormLayoutModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
780
781 Qt::ItemFlags flags( const QModelIndex &index ) const override;
782 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
783
784 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
785
789 bool removeRow( int row, const QModelIndex &parent = QModelIndex() );
790
791 Qt::DropActions supportedDragActions() const override;
792 Qt::DropActions supportedDropActions() const override;
793 QStringList mimeTypes() const override;
794 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
795 bool dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ) override;
796 bool removeRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override;
797
802
806 QList< QgsAddAttributeFormContainerDialog::ContainerPair > listOfContainers() const;
807
813 void addContainer( QModelIndex &parent, const QString &name, int columnCount, Qgis::AttributeEditorContainerType type );
814
823 void updateFieldConfigForFieldItems( const QString &fieldName, const QgsAttributesFormData::FieldConfig &config );
824
833 void updateAliasForFieldItems( const QString &fieldName, const QString &fieldAlias );
834
840 void insertChild( const QModelIndex &parent, int row, const QString &itemId, QgsAttributesFormData::AttributesFormItemType itemType, const QString &itemName );
841
842 public slots:
843 void populate() override;
844
845 signals:
847 void externalItemDropped( QModelIndex &index );
849 void internalItemDropped( QModelIndex &index );
850
851 private:
853 void updateFieldConfigForFieldItemsRecursive( QgsAttributesFormItem *parent, const QString &fieldName, const QgsAttributesFormData::FieldConfig &config );
855 void updateAliasForFieldItemsRecursive( QgsAttributesFormItem *parent, const QString &fieldName, const QString &fieldAlias );
856
857 QList< QgsAddAttributeFormContainerDialog::ContainerPair > recursiveListOfContainers( QgsAttributesFormItem *parent ) const;
858 void loadAttributeEditorElementItem( QgsAttributeEditorElement *const editorElement, QgsAttributesFormItem *parent, const int position = -1 );
859
868 QModelIndexList curateIndexesForMimeData( const QModelIndexList &indexes ) const;
869};
870
871
879class GUI_EXPORT QgsAttributesFormProxyModel : public QSortFilterProxyModel
880{
881 Q_OBJECT
882
883 public:
887 QgsAttributesFormProxyModel( QObject *parent = nullptr );
888
893
897 const QString filterText() const;
898
905
906 public slots:
908 void setFilterText( const QString &filterText = QString() );
909
910 protected:
911 bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override;
912
913 private:
914 QgsAttributesFormModel *mModel = nullptr;
915 QString mFilterText;
916};
917
918
922
923#endif // QGSATTRIBUTESFORMMODEL_H
AttributeEditorContainerType
Attribute editor container types.
Definition qgis.h:5786
AttributeFormReuseLastValuePolicy
Attribute form policy for reusing last entered values.
Definition qgis.h:5845
@ NotAllowed
Reuse of last values not allowed.
Definition qgis.h:5846
FieldDomainMergePolicy
Merge policy for field domains.
Definition qgis.h:4009
@ DefaultValue
Use default field value.
Definition qgis.h:4010
FieldDomainSplitPolicy
Split policy for field domains.
Definition qgis.h:3992
@ Duplicate
Duplicate original value.
Definition qgis.h:3994
FieldDuplicatePolicy
Duplicate policy for fields.
Definition qgis.h:4029
@ Duplicate
Duplicate original value.
Definition qgis.h:4031
An abstract base class for any elements of a drag and drop form.
QgsAttributesAvailableWidgetsModel(QgsVectorLayer *layer, QgsProject *project, QObject *parent=nullptr)
Constructor for QgsAttributesAvailableWidgetsModel, with the given parent.
Qt::DropActions supportedDragActions() const override
Qt::ItemFlags flags(const QModelIndex &index) const override
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
QMimeData * mimeData(const QModelIndexList &indexes) const override
QModelIndex fieldModelIndex(const QString &fieldName) const
Returns the model index that corresponds to the field with the given fieldName.
QModelIndex actionContainer() const
Returns the action container in this model, expected to be placed at the third top-level row.
void populateLayerActions(const QList< QgsAction > actions)
Refresh layer actions in the model to keep an updated action list.
QModelIndex fieldContainer() const
Returns the field container in this model, expected to be placed at the first top-level row.
QModelIndex relationContainer() const
Returns the relation container in this model, expected to be placed at the second top-level row.
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Main class to store and transfer editor data contained in a QgsAttributesFormModel.
bool collapsed() const
For group box containers returns if this group box is collapsed.
void setColumnCount(int count)
Sets the number of columns for a container.
int columnCount() const
Returns the number of columns in a container.
int horizontalStretch() const
Returns the horizontal stretch factor for the element.
void setHorizontalStretch(int stretch)
Sets the horizontal stretch factor for the element.
int verticalStretch() const
Returns the vertical stretch factor for the element.
void setVerticalStretch(int stretch)
Sets the vertical stretch factor for the element.
void setCollapsed(bool collapsed)
For group box containers sets if this group box is collapsed.
Describes editor data contained in a QgsAttributesFormModel.
AttributesFormItemType
Custom item types.
@ Container
Container for the form, which may be tab, group or row.
@ Relation
Relation between two vector layers.
@ Field
Vector layer field.
@ SpacerWidget
Spacer widget type,.
@ WidgetType
In the available widgets tree, the type of widget.
@ TextWidget
Text widget type,.
Holds parent-child relations as well as item data contained in a QgsAttributesFormModel.
QIcon icon() const
Returns the icon of the item.
void setIcon(const QIcon &icon)
Sets an icon for the item.
QgsAttributesFormItem()=default
QString name() const
Returns the name of the item.
int childCount() const
Returns the number of children items for the given item.
QgsAttributesFormItem * child(int row)
Access the child item located at row position.
QgsAttributesFormItem * parent()
Returns the parent object of the item.
QgsAttributesFormItem * firstChildRecursive(const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId) const
Access the first child item that matches itemType and itemId, recursively.
int row() const
Returns the position of the item regarding its parent.
QgsAttributesFormData::AttributesFormItemType type() const
Returns the type of the item.
QString id() const
Returns the id of the item.
QVariant data(int role) const
Returns the data stored in the item, corresponding to the given role.
QString displayName() const
Returns the display name of the item.
void addedChildren(QgsAttributesFormItem *item, int indexFrom, int indexTo)
Notifies other objects when children have been added to the item, informing the indices where added c...
QgsAttributesFormItem * firstTopChild(const QgsAttributesFormData::AttributesFormItemType itemType, const QString &itemId) const
Access the first top-level child item that matches itemType and itemId.
void externalItemDropped(QModelIndex &index)
Informs that items were inserted (via drop) in the model from another model.
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Qt::DropActions supportedDragActions() const override
void updateAliasForFieldItems(const QString &fieldName, const QString &fieldAlias)
Updates the aliases of all matching fields in the model.
QStringList mimeTypes() const override
QgsAttributesFormLayoutModel(QgsVectorLayer *layer, QgsProject *project, QObject *parent=nullptr)
Constructor for QgsAttributesFormLayoutModel, with the given parent.
QMimeData * mimeData(const QModelIndexList &indexes) const override
bool removeRow(int row, const QModelIndex &parent=QModelIndex())
Removes the index located at row within the given parent.
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
Qt::DropActions supportedDropActions() const override
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
void updateFieldConfigForFieldItems(const QString &fieldName, const QgsAttributesFormData::FieldConfig &config)
Updates the field config of all matching fields in the model.
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
void addContainer(QModelIndex &parent, const QString &name, int columnCount, Qgis::AttributeEditorContainerType type)
Adds a new container to parent.
QList< QgsAddAttributeFormContainerDialog::ContainerPair > listOfContainers() const
Returns a list of containers stored in the model, structured as pairs (name, container model index).
QgsAttributeEditorElement * createAttributeEditorWidget(const QModelIndex &index, QgsAttributeEditorElement *parent) const
Creates a new attribute editor element based on the definition stored in a form layout model index.
Qt::ItemFlags flags(const QModelIndex &index) const override
void internalItemDropped(QModelIndex &index)
Informs that items were moved (via drop) in the model from the same model.
void insertChild(const QModelIndex &parent, int row, const QString &itemId, QgsAttributesFormData::AttributesFormItemType itemType, const QString &itemName)
Inserts a new child to parent model index at the given row position.
Abstract class for tree models allowing for configuration of attributes forms.
void emitDataChangedRecursively(const QModelIndex &parent=QModelIndex(), const QVector< int > &roles=QVector< int >())
Emits dataChanged signal for all parent items in a model.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
std::unique_ptr< QgsAttributesFormItem > mRootItem
bool showAliases() const
Returns whether field aliases are preferred over field names as item text.
virtual void populate()=0
Populates the model with initial data read from the layer.
@ ItemFieldConfigRole
Prior to QGIS 3.44, this was available as FieldConfigRole.
@ ItemDisplayRole
Display text for the item.
@ ItemNameRole
Prior to QGIS 3.44, this was available as FieldNameRole.
@ ItemDataRole
Prior to QGIS 3.44, this was available as DnDTreeRole.
@ ItemIdRole
Items may have ids to ease comparison. Used by Relations, fields, actions and containers.
void setShowAliases(bool show)
Sets whether field aliases should be preferred over field names as item text.
QModelIndex firstRecursiveMatchingModelIndex(const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId) const
Returns the first model index that matches the given itemType and itemId, recursively.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
QgsAttributesFormModel(QgsVectorLayer *layer, QgsProject *project, QObject *parent=nullptr)
Constructor for QgsAttributesFormModel, with the given parent.
QModelIndex parent(const QModelIndex &index) const override
~QgsAttributesFormModel() override
QModelIndex firstTopMatchingModelIndex(const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId) const
Returns the first top-level model index that matches the given itemType and itemId.
bool indexLessThan(const QModelIndex &a, const QModelIndex &b) const
Auxiliary function to sort indexes, returning true if index a is less than index b.
void fieldConfigDataChanged(QgsAttributesFormItem *item)
Notifies other objects that the field config data has changed in the item.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
QgsAttributesFormItem * rootItem() const
Returns the root item in this model.
QVector< int > rootToLeafPath(QgsAttributesFormItem *item) const
Returns a QVector of iterative positions from root item to the given item.
QgsAttributesFormItem * itemForIndex(const QModelIndex &index) const
Returns the underlying item that corresponds to the given index.
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
QgsAttributesFormModel * sourceAttributesFormModel() const
Returns the source model.
void setFilterText(const QString &filterText=QString())
Sets the filter text.
const QString filterText() const
Returns the text used to filter source model items.
QgsAttributesFormProxyModel(QObject *parent=nullptr)
Constructor for QgsAttributesFormProxyModel, with the given parent.
void setAttributesFormSourceModel(QgsAttributesFormModel *model)
Sets the source model for the proxy model.
Stores information about constraints which may be present on a field.
An expression with an additional enabled flag.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:113
A grouped map of multiple QgsProperty objects, each referenced by an integer key value.
Represents a vector layer which manages a vector based dataset.
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
The TabStyle struct defines color and font overrides for form fields, tabs and groups labels.
Holds the configuration for a field.
Qgis::FieldDuplicatePolicy mDuplicatePolicy
QMap< QString, QVariant > mEditorWidgetConfig
Qgis::FieldDomainSplitPolicy mSplitPolicy
Qgis::FieldDomainMergePolicy mMergePolicy
Qgis::AttributeFormReuseLastValuePolicy mReuseLastValuePolicy