QGIS API Documentation 4.1.0-Master (009143bf4b4)
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
90
92 {
93 operator QVariant();
94
97 QVariant nmRelationId;
99 QString label;
100 };
101
103 {
104 QString qmlCode;
105 };
106
108 {
109 QString htmlCode;
110 };
111
113 {
114 QString text;
115 };
116
118 {
119 bool drawLine = false;
120 };
121
129 class GUI_EXPORT AttributeFormItemData
130 {
131 public:
133
135 operator QVariant() { return QVariant::fromValue<AttributeFormItemData>( *this ); }
136
138 int columnCount() const { return mColumnCount; }
139
141 void setColumnCount( int count ) { mColumnCount = count; }
142
149 Qgis::AttributeEditorContainerType containerType() const;
150
157 void setContainerType( Qgis::AttributeEditorContainerType type );
158
167 bool collapsed() const { return mCollapsed; };
168
176 void setCollapsed( bool collapsed ) { mCollapsed = collapsed; };
177
183 const QgsAttributeEditorElement::LabelStyle labelStyle() const;
184
190 void setLabelStyle( const QgsAttributeEditorElement::LabelStyle &labelStyle );
191
193 bool showLabel() const;
194
196 void setShowLabel( bool showLabel );
197
206 int horizontalStretch() const { return mHorizontalStretch; }
207
216 void setHorizontalStretch( int stretch ) { mHorizontalStretch = stretch; }
217
226 int verticalStretch() const { return mVerticalStretch; }
227
236 void setVerticalStretch( int stretch ) { mVerticalStretch = stretch; }
237
243 QgsOptionalExpression visibilityExpression() const;
244
251 void setVisibilityExpression( const QgsOptionalExpression &visibilityExpression );
252
261 QgsOptionalExpression collapsedExpression() const;
262
271 void setCollapsedExpression( const QgsOptionalExpression &collapsedExpression );
272
278 RelationEditorConfiguration relationEditorConfiguration() const;
279
285 void setRelationEditorConfiguration( const RelationEditorConfiguration &relationEditorConfiguration );
286
292 QmlElementEditorConfiguration qmlElementEditorConfiguration() const;
293
299 void setQmlElementEditorConfiguration( const QmlElementEditorConfiguration &qmlElementEditorConfiguration );
300
306 HtmlElementEditorConfiguration htmlElementEditorConfiguration() const;
307
313 void setHtmlElementEditorConfiguration( const HtmlElementEditorConfiguration &htmlElementEditorConfiguration );
314
319 SpacerElementEditorConfiguration spacerElementEditorConfiguration() const;
320
325 void setSpacerElementEditorConfiguration( SpacerElementEditorConfiguration spacerElementEditorConfiguration );
326
332 QColor backgroundColor() const;
333
339 void setBackgroundColor( const QColor &backgroundColor );
340
345 TextElementEditorConfiguration textElementEditorConfiguration() const;
346
351 void setTextElementEditorConfiguration( const TextElementEditorConfiguration &textElementEditorConfiguration );
352
353 private:
354 int mColumnCount = 1;
356 bool mShowLabel = true;
357 int mHorizontalStretch = 0;
358 int mVerticalStretch = 0;
359 QgsOptionalExpression mVisibilityExpression;
360 RelationEditorConfiguration mRelationEditorConfiguration;
361 QmlElementEditorConfiguration mQmlElementEditorConfiguration;
362 HtmlElementEditorConfiguration mHtmlElementEditorConfiguration;
363 TextElementEditorConfiguration mTextElementEditorConfiguration;
364 SpacerElementEditorConfiguration mSpacerElementEditorConfiguration;
365 QColor mBackgroundColor;
366 bool mCollapsed = false;
367 QgsOptionalExpression mCollapsedExpression;
369 };
370};
371
372
380class GUI_EXPORT QgsAttributesFormItem : public QObject
381{
382 Q_OBJECT
383
384 public:
386
397 explicit QgsAttributesFormItem( QgsAttributesFormData::AttributesFormItemType itemType, const QString &name, const QString &displayName = QString(), QgsAttributesFormItem *parent = nullptr );
398
409 explicit QgsAttributesFormItem(
412 const QString &name,
413 const QString &displayName = QString(),
415 );
416
423
429 QgsAttributesFormItem *firstTopChild( const QgsAttributesFormData::AttributesFormItemType itemType, const QString &itemId ) const;
430
436 QgsAttributesFormItem *firstChildRecursive( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
437
441 int childCount() const;
442
448 QgsAttributesFormItem *parent() { return mParent; }
449
453 int row() const;
454
458 QVariant data( int role ) const;
459
463 bool setData( int role, const QVariant &value );
464
468 void addChild( std::unique_ptr< QgsAttributesFormItem > &&child );
469
473 void insertChild( int position, std::unique_ptr< QgsAttributesFormItem > &&item );
474
478 void deleteChildAtIndex( int index );
479
483 void deleteChildren();
484
489
493 QString id() const { return mId; }
494
498 QString name() const { return mName; }
499
503 QString displayName() const { return mDisplayName; }
504
510 QIcon icon() const { return mIcon; }
511
517 void setIcon( const QIcon &icon ) { mIcon = icon; }
518
524 static bool isGroup( QgsAttributesFormItem *item );
525
526 signals:
527
533 void addedChildren( QgsAttributesFormItem *item, int indexFrom, int indexTo );
534
535 private:
536 QString mName = QString();
537 QString mDisplayName = QString();
538 QIcon mIcon;
540 QString mId = QString();
542 QgsAttributesFormData::FieldConfig mFieldConfigData;
543
544 std::vector< std::unique_ptr< QgsAttributesFormItem > > mChildren;
545 QgsAttributesFormItem *mParent = nullptr;
546
547 Q_DISABLE_COPY( QgsAttributesFormItem )
548};
549
550
558class GUI_EXPORT QgsAttributesFormModel : public QAbstractItemModel
559{
560 Q_OBJECT
561
562 public:
578
584 explicit QgsAttributesFormModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
585
587
588 QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
589 QModelIndex parent( const QModelIndex &index ) const override;
590
591 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
592 int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
593
594 bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
595
601 QModelIndex firstTopMatchingModelIndex( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
602
608 QModelIndex firstRecursiveMatchingModelIndex( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
609
615 bool showAliases() const;
616
622 void setShowAliases( bool show );
623
629 QgsAttributesFormItem *itemForIndex( const QModelIndex &index ) const;
630
637
638 public slots:
639
643 virtual void populate() = 0;
644
645 signals:
646
653
654 protected:
666 bool indexLessThan( const QModelIndex &a, const QModelIndex &b ) const;
667
673 QVector<int> rootToLeafPath( QgsAttributesFormItem *item ) const;
674
675
684 void emitDataChangedRecursively( const QModelIndex &parent = QModelIndex(), const QVector<int> &roles = QVector<int>() );
685
686 std::unique_ptr< QgsAttributesFormItem > mRootItem;
689
690 bool mShowAliases = false;
691};
692
693
702{
703 Q_OBJECT
704
705 public:
711 explicit QgsAttributesAvailableWidgetsModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
712
713 Qt::ItemFlags flags( const QModelIndex &index ) const override;
714 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
715
716 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
717
718 Qt::DropActions supportedDragActions() const override;
719 QStringList mimeTypes() const override;
720 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
721
727 QModelIndex fieldContainer() const;
728
734 QModelIndex relationContainer() const;
735
741 QModelIndex actionContainer() const;
742
746 QModelIndex fieldModelIndex( const QString &fieldName ) const;
747
748 public slots:
749 void populate() override;
750
756 void populateLayerActions( const QList< QgsAction > actions );
757
758 private:
764 void populateActionItems( const QList<QgsAction> actions );
765};
766
767
776{
777 Q_OBJECT
778
779 public:
786 explicit QgsAttributesFormLayoutModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
787
788 Qt::ItemFlags flags( const QModelIndex &index ) const override;
789 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
790
791 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
792
796 bool removeRow( int row, const QModelIndex &parent = QModelIndex() );
797
798 Qt::DropActions supportedDragActions() const override;
799 Qt::DropActions supportedDropActions() const override;
800 QStringList mimeTypes() const override;
801 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
802 bool dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ) override;
803 bool removeRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override;
804
809
813 QList< QgsAddAttributeFormContainerDialog::ContainerPair > listOfContainers() const;
814
820 void addContainer( QModelIndex &parent, const QString &name, int columnCount, Qgis::AttributeEditorContainerType type );
821
830 void updateFieldConfigForFieldItems( const QString &fieldName, const QgsAttributesFormData::FieldConfig &config );
831
840 void updateAliasForFieldItems( const QString &fieldName, const QString &fieldAlias );
841
847 void insertChild( const QModelIndex &parent, int row, const QString &itemId, QgsAttributesFormData::AttributesFormItemType itemType, const QString &itemName );
848
849 public slots:
850 void populate() override;
851
852 signals:
854 void externalItemDropped( QModelIndex &index );
856 void internalItemDropped( QModelIndex &index );
857
858 private:
860 void updateFieldConfigForFieldItemsRecursive( QgsAttributesFormItem *parent, const QString &fieldName, const QgsAttributesFormData::FieldConfig &config );
862 void updateAliasForFieldItemsRecursive( QgsAttributesFormItem *parent, const QString &fieldName, const QString &fieldAlias );
863
864 QList< QgsAddAttributeFormContainerDialog::ContainerPair > recursiveListOfContainers( QgsAttributesFormItem *parent ) const;
865 void loadAttributeEditorElementItem( QgsAttributeEditorElement *const editorElement, QgsAttributesFormItem *parent, const int position = -1 );
866
875 QModelIndexList curateIndexesForMimeData( const QModelIndexList &indexes ) const;
876};
877
878
886class GUI_EXPORT QgsAttributesFormProxyModel : public QSortFilterProxyModel
887{
888 Q_OBJECT
889
890 public:
894 QgsAttributesFormProxyModel( QObject *parent = nullptr );
895
900
904 const QString filterText() const;
905
912
913 public slots:
915 void setFilterText( const QString &filterText = QString() );
916
917 protected:
918 bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override;
919
920 private:
921 QgsAttributesFormModel *mModel = nullptr;
922 QString mFilterText;
923};
924
925
929
930#endif // QGSATTRIBUTESFORMMODEL_H
AttributeEditorContainerType
Attribute editor container types.
Definition qgis.h:5956
AttributeFormReuseLastValuePolicy
Attribute form policy for reusing last entered values.
Definition qgis.h:6015
@ NotAllowed
Reuse of last values not allowed.
Definition qgis.h:6016
FieldDomainMergePolicy
Merge policy for field domains.
Definition qgis.h:4093
@ DefaultValue
Use default field value.
Definition qgis.h:4094
FieldDomainSplitPolicy
Split policy for field domains.
Definition qgis.h:4076
@ Duplicate
Duplicate original value.
Definition qgis.h:4078
FieldDuplicatePolicy
Duplicate policy for fields.
Definition qgis.h:4113
@ Duplicate
Duplicate original value.
Definition qgis.h:4115
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