From b3d0a4109ed068783c4537f2ab113cd85a9b8a0f Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Tue, 19 Sep 2023 11:00:55 +0700 Subject: [PATCH 1/2] Remove long-gone need for keeping track of inserted items in the attribute form's buildForm() --- src/core/attributeformmodelbase.cpp | 19 ++++--------------- src/core/attributeformmodelbase.h | 1 - 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/core/attributeformmodelbase.cpp b/src/core/attributeformmodelbase.cpp index 5ad50f4556..cd6f91f316 100644 --- a/src/core/attributeformmodelbase.cpp +++ b/src/core/attributeformmodelbase.cpp @@ -222,16 +222,14 @@ void AttributeFormModelBase::resetModel() visibilityExpression = container->visibilityExpression().data().expression(); } - QVector dummy; - buildForm( container, item, visibilityExpression, dummy, currentTab, columnCount ); + buildForm( container, item, visibilityExpression, currentTab, columnCount ); currentTab++; } } } else { - QVector dummy; - buildForm( invisibleRootContainer(), invisibleRootItem(), QString(), dummy ); + buildForm( invisibleRootContainer(), invisibleRootItem(), QString() ); } } } @@ -344,7 +342,7 @@ void AttributeFormModelBase::updateAttributeValue( QStandardItem *item ) } } -void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, QStandardItem *parent, const QString &parentVisibilityExpressions, QVector &items, int currentTabIndex, int columnCount ) +void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, QStandardItem *parent, const QString &parentVisibilityExpressions, int currentTabIndex, int columnCount ) { const QList children { container->children() }; for ( QgsAttributeEditorElement *element : children ) @@ -391,12 +389,10 @@ void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, if ( innerContainer->backgroundColor().isValid() ) item->setData( innerContainer->backgroundColor(), AttributeFormModel::GroupColor ); - items.append( item ); parent->appendRow( item ); item->setData( item->index(), AttributeFormModel::GroupIndex ); - QVector newItems; - buildForm( innerContainer, item, visibilityExpression, newItems, 0, innerColumnCount ); + buildForm( innerContainer, item, visibilityExpression, 0, innerColumnCount ); if ( !visibilityExpression.isEmpty() ) mVisibilityExpressions.append( qMakePair( QgsExpression( visibilityExpression ), QVector() << item ) ); break; @@ -454,8 +450,6 @@ void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, mConstraints.insert( item, field.constraints() ); - items.append( item ); - parent->appendRow( item ); break; } @@ -483,8 +477,6 @@ void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, item->setData( true, AttributeFormModel::ConstraintSoftValid ); item->setData( true, AttributeFormModel::AttributeAllowEdit ); - items.append( item ); - parent->appendRow( item ); break; } @@ -507,7 +499,6 @@ void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, updateAttributeValue( item ); - items.append( item ); parent->appendRow( item ); break; } @@ -530,7 +521,6 @@ void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, updateAttributeValue( item ); - items.append( item ); parent->appendRow( item ); break; } @@ -550,7 +540,6 @@ void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, updateAttributeValue( item ); - items.append( item ); parent->appendRow( item ); break; } diff --git a/src/core/attributeformmodelbase.h b/src/core/attributeformmodelbase.h index 975785d231..db2f208e4e 100644 --- a/src/core/attributeformmodelbase.h +++ b/src/core/attributeformmodelbase.h @@ -82,7 +82,6 @@ class AttributeFormModelBase : public QStandardItemModel void buildForm( QgsAttributeEditorContainer *container, QStandardItem *parent, const QString &parentVisibilityExpressions, - QVector &items, int currentTabIndex = 0, int columnCount = 1 ); From c86a2d71f8f7acc5310572ab18e16f8304ad9787 Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Tue, 19 Sep 2023 11:21:42 +0700 Subject: [PATCH 2/2] Only append an attribute form container item when its children have been added, hopefully will avoid a bunch of needless layout calculation --- src/core/attributeformmodelbase.cpp | 34 ++++++++++++++++------------- src/core/attributeformmodelbase.h | 3 ++- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/core/attributeformmodelbase.cpp b/src/core/attributeformmodelbase.cpp index cd6f91f316..e16cd04e26 100644 --- a/src/core/attributeformmodelbase.cpp +++ b/src/core/attributeformmodelbase.cpp @@ -189,6 +189,7 @@ void AttributeFormModelBase::resetModel() #endif invisibleRootItem()->setColumnCount( 1 ); + QList containers; if ( hasTabs ) { const QList children { root->children() }; @@ -212,24 +213,29 @@ void AttributeFormModelBase::resetModel() item->setData( true, AttributeFormModel::CurrentlyVisible ); item->setData( true, AttributeFormModel::ConstraintHardValid ); item->setData( true, AttributeFormModel::ConstraintSoftValid ); - invisibleRootItem()->appendRow( item ); - setHasTabs( true ); QString visibilityExpression; if ( container->visibilityExpression().enabled() ) { - mVisibilityExpressions.append( qMakePair( container->visibilityExpression().data(), QVector() << item ) ); + mVisibilityExpressions.append( qMakePair( container->visibilityExpression().data(), item ) ); visibilityExpression = container->visibilityExpression().data().expression(); } - buildForm( container, item, visibilityExpression, currentTab, columnCount ); + buildForm( container, item, visibilityExpression, containers, currentTab, columnCount ); + invisibleRootItem()->appendRow( item ); + setHasTabs( true ); currentTab++; } } } else { - buildForm( invisibleRootContainer(), invisibleRootItem(), QString() ); + buildForm( invisibleRootContainer(), invisibleRootItem(), QString(), containers ); + } + + for ( QStandardItem *container : std::as_const( containers ) ) + { + container->setData( container->index(), AttributeFormModel::GroupIndex ); } } } @@ -342,7 +348,7 @@ void AttributeFormModelBase::updateAttributeValue( QStandardItem *item ) } } -void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, QStandardItem *parent, const QString &parentVisibilityExpressions, int currentTabIndex, int columnCount ) +void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, QStandardItem *parent, const QString &parentVisibilityExpressions, QList &containers, int currentTabIndex, int columnCount ) { const QList children { container->children() }; for ( QgsAttributeEditorElement *element : children ) @@ -389,12 +395,12 @@ void AttributeFormModelBase::buildForm( QgsAttributeEditorContainer *container, if ( innerContainer->backgroundColor().isValid() ) item->setData( innerContainer->backgroundColor(), AttributeFormModel::GroupColor ); + buildForm( innerContainer, item, visibilityExpression, containers, 0, innerColumnCount ); parent->appendRow( item ); - item->setData( item->index(), AttributeFormModel::GroupIndex ); + containers << item; - buildForm( innerContainer, item, visibilityExpression, 0, innerColumnCount ); if ( !visibilityExpression.isEmpty() ) - mVisibilityExpressions.append( qMakePair( QgsExpression( visibilityExpression ), QVector() << item ) ); + mVisibilityExpressions.append( qMakePair( QgsExpression( visibilityExpression ), item ) ); break; } @@ -719,13 +725,11 @@ void AttributeFormModelBase::updateVisibilityAndConstraints( int fieldIndex ) exp.prepare( &mExpressionContext ); bool visible = exp.evaluate( &mExpressionContext ).toInt(); - for ( QStandardItem *item : std::as_const( it.second ) ) + QStandardItem *item = it.second; + if ( item->data( AttributeFormModel::CurrentlyVisible ).toBool() != visible ) { - if ( item->data( AttributeFormModel::CurrentlyVisible ).toBool() != visible ) - { - item->setData( visible, AttributeFormModel::CurrentlyVisible ); - visibilityChanged = true; - } + item->setData( visible, AttributeFormModel::CurrentlyVisible ); + visibilityChanged = true; } } } diff --git a/src/core/attributeformmodelbase.h b/src/core/attributeformmodelbase.h index db2f208e4e..1286601901 100644 --- a/src/core/attributeformmodelbase.h +++ b/src/core/attributeformmodelbase.h @@ -82,6 +82,7 @@ class AttributeFormModelBase : public QStandardItemModel void buildForm( QgsAttributeEditorContainer *container, QStandardItem *parent, const QString &parentVisibilityExpressions, + QList &containers, int currentTabIndex = 0, int columnCount = 1 ); @@ -120,7 +121,7 @@ class AttributeFormModelBase : public QStandardItemModel std::unique_ptr mTemporaryContainer; bool mHasTabs = false; - typedef QPair> VisibilityExpression; + typedef QPair VisibilityExpression; QList mVisibilityExpressions; QMap mConstraints; QMap mEditorWidgetCodes;