QGIS API Documentation 3.43.0-Master (8607fd0c408)
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#define SIP_NO_FILE
21
22#include "qgsaction.h"
23#include "qgsaddtaborgroup.h"
26#include "qgsvectorlayer.h"
27
28#include <QAbstractItemModel>
29#include <QPushButton>
30#include <QSortFilterProxyModel>
31
40class GUI_EXPORT QgsAttributesFormData
41{
42 public:
61
65 struct GUI_EXPORT FieldConfig
66 {
67 FieldConfig() = default;
68 FieldConfig( QgsVectorLayer *layer, int idx );
69
70 bool mEditable = true;
71 bool mLabelOnTop = false;
72 bool mReuseLastValues = false;
74 QPushButton *mButton = nullptr;
76 QMap<QString, QVariant> mEditorWidgetConfig;
77 QString mAlias;
79 QString mComment;
83
84 operator QVariant();
85 };
86
88 {
89 operator QVariant();
90
93 QVariant nmRelationId;
94 bool forceSuppressFormPopup = false;
95 QString label;
96 };
97
99 {
100 QString qmlCode;
101 };
102
104 {
105 QString htmlCode;
106 };
107
109 {
110 QString text;
111 };
112
114 {
115 bool drawLine = false;
116 };
117
125 class GUI_EXPORT AttributeFormItemData
126 {
127 public:
129
131 operator QVariant() { return QVariant::fromValue<AttributeFormItemData>( *this ); }
132
134 int columnCount() const { return mColumnCount; }
135
137 void setColumnCount( int count ) { mColumnCount = count; }
138
145 Qgis::AttributeEditorContainerType containerType() const;
146
153 void setContainerType( Qgis::AttributeEditorContainerType type );
154
163 bool collapsed() const { return mCollapsed; };
164
172 void setCollapsed( bool collapsed ) { mCollapsed = collapsed; };
173
179 const QgsAttributeEditorElement::LabelStyle labelStyle() const;
180
186 void setLabelStyle( const QgsAttributeEditorElement::LabelStyle &labelStyle );
187
189 bool showLabel() const;
190
192 void setShowLabel( bool showLabel );
193
202 int horizontalStretch() const { return mHorizontalStretch; }
203
212 void setHorizontalStretch( int stretch ) { mHorizontalStretch = stretch; }
213
222 int verticalStretch() const { return mVerticalStretch; }
223
232 void setVerticalStretch( int stretch ) { mVerticalStretch = stretch; }
233
239 QgsOptionalExpression visibilityExpression() const;
240
247 void setVisibilityExpression( const QgsOptionalExpression &visibilityExpression );
248
257 QgsOptionalExpression collapsedExpression() const;
258
267 void setCollapsedExpression( const QgsOptionalExpression &collapsedExpression );
268
274 RelationEditorConfiguration relationEditorConfiguration() const;
275
281 void setRelationEditorConfiguration( const RelationEditorConfiguration &relationEditorConfiguration );
282
288 QmlElementEditorConfiguration qmlElementEditorConfiguration() const;
289
295 void setQmlElementEditorConfiguration( const QmlElementEditorConfiguration &qmlElementEditorConfiguration );
296
302 HtmlElementEditorConfiguration htmlElementEditorConfiguration() const;
303
309 void setHtmlElementEditorConfiguration( const HtmlElementEditorConfiguration &htmlElementEditorConfiguration );
310
315 SpacerElementEditorConfiguration spacerElementEditorConfiguration() const;
316
321 void setSpacerElementEditorConfiguration( SpacerElementEditorConfiguration spacerElementEditorConfiguration );
322
328 QColor backgroundColor() const;
329
335 void setBackgroundColor( const QColor &backgroundColor );
336
341 TextElementEditorConfiguration textElementEditorConfiguration() const;
342
347 void setTextElementEditorConfiguration( const TextElementEditorConfiguration &textElementEditorConfiguration );
348
349 private:
350 int mColumnCount = 1;
352 bool mShowLabel = true;
353 int mHorizontalStretch = 0;
354 int mVerticalStretch = 0;
355 QgsOptionalExpression mVisibilityExpression;
356 RelationEditorConfiguration mRelationEditorConfiguration;
357 QmlElementEditorConfiguration mQmlElementEditorConfiguration;
358 HtmlElementEditorConfiguration mHtmlElementEditorConfiguration;
359 TextElementEditorConfiguration mTextElementEditorConfiguration;
360 SpacerElementEditorConfiguration mSpacerElementEditorConfiguration;
361 QColor mBackgroundColor;
362 bool mCollapsed = false;
363 QgsOptionalExpression mCollapsedExpression;
365 };
366};
367
368
376class GUI_EXPORT QgsAttributesFormItem : public QObject
377{
378 Q_OBJECT
379
380 public:
382
393 explicit QgsAttributesFormItem( QgsAttributesFormData::AttributesFormItemType itemType, const QString &name, const QString &displayName = QString(), QgsAttributesFormItem *parent = nullptr );
394
405 explicit QgsAttributesFormItem( QgsAttributesFormData::AttributesFormItemType itemType, const QgsAttributesFormData::AttributeFormItemData &data, const QString &name, const QString &displayName = QString(), QgsAttributesFormItem *parent = nullptr );
406
412 QgsAttributesFormItem *child( int row );
413
419 QgsAttributesFormItem *firstTopChild( const QgsAttributesFormData::AttributesFormItemType itemType, const QString &itemId ) const;
420
426 QgsAttributesFormItem *firstChildRecursive( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
427
431 int childCount() const;
432
438 QgsAttributesFormItem *parent() { return mParent; }
439
443 int row() const;
444
448 QVariant data( int role ) const;
449
453 bool setData( int role, const QVariant &value );
454
458 void addChild( std::unique_ptr< QgsAttributesFormItem > &&child );
459
463 void insertChild( int position, std::unique_ptr< QgsAttributesFormItem > &&item );
464
468 void deleteChildAtIndex( int index );
469
473 void deleteChildren();
474
479
483 QString id() const { return mId; }
484
488 QString name() const { return mName; }
489
493 QString displayName() const { return mDisplayName; }
494
500 QIcon icon() const { return mIcon; }
501
507 void setIcon( const QIcon &icon ) { mIcon = icon; }
508
509 private:
510 QString mName = QString();
511 QString mDisplayName = QString();
512 QIcon mIcon;
514 QString mId = QString();
516 QgsAttributesFormData::FieldConfig mFieldConfigData;
517
518 std::vector< std::unique_ptr< QgsAttributesFormItem > > mChildren;
519 QgsAttributesFormItem *mParent = nullptr;
520
521 Q_DISABLE_COPY( QgsAttributesFormItem )
522};
523
524
532class GUI_EXPORT QgsAttributesFormModel : public QAbstractItemModel
533{
534 Q_OBJECT
535
536 public:
552
558 explicit QgsAttributesFormModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
559
561
562 QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
563 QModelIndex parent( const QModelIndex &index ) const override;
564
565 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
566 int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
567
573 QModelIndex firstTopMatchingModelIndex( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
574
580 QModelIndex firstRecursiveMatchingModelIndex( const QgsAttributesFormData::AttributesFormItemType &itemType, const QString &itemId ) const;
581
587 bool showAliases() const;
588
594 void setShowAliases( bool show );
595
596 public slots:
600 virtual void populate() = 0;
601
602 protected:
608 QgsAttributesFormItem *itemForIndex( const QModelIndex &index ) const;
609
621 bool indexLessThan( const QModelIndex &a, const QModelIndex &b ) const;
622
628 QVector<int> rootToLeafPath( QgsAttributesFormItem *item ) const;
629
630
639 void emitDataChangedRecursively( const QModelIndex &parent = QModelIndex(), const QVector<int> &roles = QVector<int>() );
640
641 std::unique_ptr< QgsAttributesFormItem > mRootItem;
644
645 bool mShowAliases = false;
646};
647
648
657{
658 Q_OBJECT
659
660 public:
666 explicit QgsAttributesAvailableWidgetsModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
667
668 Qt::ItemFlags flags( const QModelIndex &index ) const override;
669 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
670
671 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
672 bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
673
674 Qt::DropActions supportedDragActions() const override;
675 QStringList mimeTypes() const override;
676 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
677
683 QModelIndex fieldContainer() const;
684
690 QModelIndex relationContainer() const;
691
697 QModelIndex actionContainer() const;
698
702 QModelIndex fieldModelIndex( const QString &fieldName ) const;
703
704 public slots:
705 void populate() override;
706
712 void populateLayerActions( const QList< QgsAction > actions );
713
714 private:
720 void populateActionItems( const QList<QgsAction> actions );
721};
722
723
732{
733 Q_OBJECT
734
735 public:
742 explicit QgsAttributesFormLayoutModel( QgsVectorLayer *layer, QgsProject *project, QObject *parent = nullptr );
743
744 Qt::ItemFlags flags( const QModelIndex &index ) const override;
745 QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
746
747 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
748 bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
749
753 bool removeRow( int row, const QModelIndex &parent = QModelIndex() );
754
755 Qt::DropActions supportedDragActions() const override;
756 Qt::DropActions supportedDropActions() const override;
757 QStringList mimeTypes() const override;
758 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
759 bool dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent ) override;
760 bool removeRows( int row, int count, const QModelIndex &parent = QModelIndex() ) override;
761
765 QgsAttributeEditorElement *createAttributeEditorWidget( const QModelIndex &index, QgsAttributeEditorElement *parent ) const;
766
770 QList< QgsAddAttributeFormContainerDialog::ContainerPair > listOfContainers() const;
771
777 void addContainer( QModelIndex &parent, const QString &name, int columnCount, Qgis::AttributeEditorContainerType type );
778
787 void updateAliasForFieldItems( const QString &fieldName, const QString &fieldAlias );
788
794 void insertChild( const QModelIndex &parent, int row, const QString &itemId, QgsAttributesFormData::AttributesFormItemType itemType, const QString &itemName );
795
796 public slots:
797 void populate() override;
798
799 signals:
801 void externalItemDropped( QModelIndex &index );
803 void internalItemDropped( QModelIndex &index );
804
805 private:
806 void updateAliasForFieldItemsRecursive( QgsAttributesFormItem *parent, const QString &fieldName, const QString &fieldAlias );
807 QList< QgsAddAttributeFormContainerDialog::ContainerPair > recursiveListOfContainers( QgsAttributesFormItem *parent ) const;
808 void loadAttributeEditorElementItem( QgsAttributeEditorElement *const editorElement, QgsAttributesFormItem *parent, const int position = -1 );
809
818 QModelIndexList curateIndexesForMimeData( const QModelIndexList &indexes ) const;
819};
820
821
829class GUI_EXPORT QgsAttributesFormProxyModel : public QSortFilterProxyModel
830{
831 Q_OBJECT
832
833 public:
837 QgsAttributesFormProxyModel( QObject *parent = nullptr );
838
842 void setAttributesFormSourceModel( QgsAttributesFormModel *model );
843
847 const QString filterText() const;
848
849 public slots:
851 void setFilterText( const QString &filterText = QString() );
852
853 protected:
854 bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override;
855
856 private:
857 QgsAttributesFormModel *mModel = nullptr;
858 QString mFilterText;
859};
860
861
865
866#endif // QGSATTRIBUTESFORMMODEL_H
AttributeEditorContainerType
Attribute editor container types.
Definition qgis.h:5329
FieldDomainMergePolicy
Merge policy for field domains.
Definition qgis.h:3805
@ DefaultValue
Use default field value.
FieldDomainSplitPolicy
Split policy for field domains.
Definition qgis.h:3788
@ Duplicate
Duplicate original value.
FieldDuplicatePolicy
Duplicate policy for fields.
Definition qgis.h:3825
@ Duplicate
Duplicate original value.
An abstract base class for any elements of a drag and drop form.
Manages available widgets when configuring attributes forms.
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.
QgsAttributesFormItem * parent()
Returns the parent object of the item.
QgsAttributesFormData::AttributesFormItemType type() const
Returns the type of the item.
QString id() const
Returns the id of the item.
QString displayName() const
Returns the display name of the item.
Manages form layouts when configuring attributes forms via drag and drop designer.
void externalItemDropped(QModelIndex &index)
Informs that items were inserted (via drop) in the model from another model.
void internalItemDropped(QModelIndex &index)
Informs that items were moved (via drop) in the model from the same model.
Abstract class for tree models allowing for configuration of attributes forms.
std::unique_ptr< QgsAttributesFormItem > mRootItem
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.
@ ItemIdRole
Items may have ids to ease comparison. Used by Relations, fields, actions and containers.
~QgsAttributesFormModel() override
Proxy model to filter items in the tree views of the drag and drop designer.
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:107
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.
QMap< QString, QVariant > mEditorWidgetConfig