From d5e0b183ff0c92243ea6a19c71a8e5063365afed Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Fri, 29 Sep 2017 14:15:30 +0200 Subject: [PATCH] Fix store/reload of widget configuration --- src/app/qgsattributesformproperties.cpp | 285 ++++++++++++------------ src/app/qgsattributesformproperties.h | 42 ++-- src/app/qgsattributetypedialog.cpp | 2 +- 3 files changed, 168 insertions(+), 161 deletions(-) diff --git a/src/app/qgsattributesformproperties.cpp b/src/app/qgsattributesformproperties.cpp index 567e4d59c4d..dc7ecf47487 100644 --- a/src/app/qgsattributesformproperties.cpp +++ b/src/app/qgsattributesformproperties.cpp @@ -4,8 +4,8 @@ QgsAttributesFormProperties::QgsAttributesFormProperties( QgsVectorLayer *layer, QWidget *parent ) : QWidget( parent ) , mLayer( layer ) - , mDragTree( nullptr ) - , mDropTree( nullptr ) + , mAvailableWidgetsTree( nullptr ) + , mFormLayoutTree( nullptr ) , mAttributeTypeDialog( nullptr ) { if ( !layer ) @@ -15,20 +15,20 @@ QgsAttributesFormProperties::QgsAttributesFormProperties( QgsVectorLayer *layer, // drag tree (not mixup with drag queen) QGridLayout *mDragListWidgetLayout = new QGridLayout; - mDragTree = new DnDTree( mLayer, mDragListWidget ); - mDragListWidgetLayout->addWidget( mDragTree ); + mAvailableWidgetsTree = new DnDTree( mLayer, mDragListWidget ); + mDragListWidgetLayout->addWidget( mAvailableWidgetsTree ); mDragListWidget->setLayout( mDragListWidgetLayout ); - mDragTree->setHeaderLabels( QStringList() << tr( "Available Widgets" ) ); - mDragTree->setType( DnDTree::Type::Drag ); + mAvailableWidgetsTree->setHeaderLabels( QStringList() << tr( "Available Widgets" ) ); + mAvailableWidgetsTree->setType( DnDTree::Type::Drag ); // drop tree QGridLayout *mDropListWidgetLayout = new QGridLayout; - mDropTree = new DnDTree( mLayer, mDropListWidget ); - mDropListWidgetLayout->addWidget( mDropTree ); + mFormLayoutTree = new DnDTree( mLayer, mDropListWidget ); + mDropListWidgetLayout->addWidget( mFormLayoutTree ); mDropListWidgetLayout->setMargin( 0 ); mDropListWidget->setLayout( mDropListWidgetLayout ); - mDropTree->setHeaderLabels( QStringList() << tr( "Form Structure" ) ); - mDropTree->setType( DnDTree::Type::Drop ); + mFormLayoutTree->setHeaderLabels( QStringList() << tr( "Form Structure" ) ); + mFormLayoutTree->setType( DnDTree::Type::Drop ); // AttributeTypeDialog mAttributeTypeDialog = new QgsAttributeTypeDialog( mLayer, 0, mAttributeTypeFrame ); @@ -36,8 +36,8 @@ QgsAttributesFormProperties::QgsAttributesFormProperties( QgsVectorLayer *layer, mAttributeTypeFrame->layout()->setMargin( 0 ); mAttributeTypeFrame->layout()->addWidget( mAttributeTypeDialog ); - connect( mDragTree, &QTreeWidget::itemSelectionChanged, this, &QgsAttributesFormProperties::onAttributeSelectionChanged ); - connect( mDropTree, &QTreeWidget::itemSelectionChanged, this, &QgsAttributesFormProperties::onAttributeSelectionChanged ); + connect( mAvailableWidgetsTree, &QTreeWidget::itemSelectionChanged, this, &QgsAttributesFormProperties::onAttributeSelectionChanged ); + connect( mFormLayoutTree, &QTreeWidget::itemSelectionChanged, this, &QgsAttributesFormProperties::onAttributeSelectionChanged ); connect( mAddTabOrGroupButton, &QAbstractButton::clicked, this, &QgsAttributesFormProperties::addTabOrGroupButton ); connect( mRemoveTabOrGroupButton, &QAbstractButton::clicked, this, &QgsAttributesFormProperties::removeTabOrGroupButton ); } @@ -50,66 +50,65 @@ QgsAttributesFormProperties::~QgsAttributesFormProperties() void QgsAttributesFormProperties::init() { - loadAttributeEditorTree( mDragTree ); - loadAttributeEditorTree( mDropTree ); + initAvailableWidgetsTree(); + initFormLayoutTree(); loadAttributeTypeDialog(); } -//Slots - void QgsAttributesFormProperties::loadAttributeTypeDialog() { - FieldConfig cfg; + QTreeWidgetItem *currentItem = mAvailableWidgetsTree->currentItem(); - int index = mDragTree->mIndexedWidgets.indexOf( mDragTree->currentItem() ); - - if ( index < 0 ) index = 0; - - Q_FOREACH ( QTreeWidgetItem *wdg, mDragTree->mIndexedWidgets ) + if ( !currentItem ) + mAttributeTypeDialog->setEnabled( false ); + else { - if ( mDragTree->invisibleRootItem()->indexOfChild( wdg ) == index ) - { - cfg = wdg->data( 0, FieldConfigRole ).value(); - } + FieldConfig cfg = mAvailableWidgetsTree->currentItem()->data( 0, FieldConfigRole ).value(); + QString fieldName = mAvailableWidgetsTree->currentItem()->data( 0, FieldNameRole ).toString(); + int index = mLayer->fields().indexOf( fieldName ); + + mAttributeTypeDialog->setEnabled( true ); + + qWarning() << "LOAD WIDGET : " << index << " : " << cfg.mEditorWidgetType; + + // AttributeTypeDialog + + mAttributeTypeFrame->layout()->removeWidget( mAttributeTypeDialog ); + delete mAttributeTypeDialog; + + // + mAttributeTypeDialog = new QgsAttributeTypeDialog( mLayer, index, mAttributeTypeFrame ); + + mAttributeTypeDialog->setFieldEditable( cfg.mEditable ); + mAttributeTypeDialog->setLabelOnTop( cfg.mLabelOnTop ); + mAttributeTypeDialog->setNotNull( cfg.mConstraints & QgsFieldConstraints::ConstraintNotNull ); + mAttributeTypeDialog->setNotNullEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintNotNull, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard ); + mAttributeTypeDialog->setUnique( cfg.mConstraints & QgsFieldConstraints::ConstraintUnique ); + mAttributeTypeDialog->setUniqueEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintUnique, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard ); + + QgsFieldConstraints constraints = mLayer->fields().at( index ).constraints(); + QgsFieldConstraints::Constraints providerConstraints = 0; + if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintOriginProvider ) + providerConstraints |= QgsFieldConstraints::ConstraintNotNull; + if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintUnique ) == QgsFieldConstraints::ConstraintOriginProvider ) + providerConstraints |= QgsFieldConstraints::ConstraintUnique; + if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintExpression ) == QgsFieldConstraints::ConstraintOriginProvider ) + providerConstraints |= QgsFieldConstraints::ConstraintExpression; + mAttributeTypeDialog->setProviderConstraints( providerConstraints ); + + mAttributeTypeDialog->setConstraintExpression( cfg.mConstraint ); + mAttributeTypeDialog->setConstraintExpressionDescription( cfg.mConstraintDescription ); + mAttributeTypeDialog->setConstraintExpressionEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintExpression, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard ); + mAttributeTypeDialog->setDefaultValueExpression( mLayer->defaultValueExpression( index ) ); + + mAttributeTypeDialog->setEditorWidgetConfig( cfg.mEditorWidgetConfig ); + mAttributeTypeDialog->setEditorWidgetType( cfg.mEditorWidgetType ); + + mAttributeTypeDialog->layout()->setMargin( 0 ); + mAttributeTypeFrame->layout()->setMargin( 0 ); + + mAttributeTypeFrame->layout()->addWidget( mAttributeTypeDialog ); } - - // AttributeTypeDialog - - mAttributeTypeFrame->layout()->removeWidget( mAttributeTypeDialog ); - delete mAttributeTypeDialog; - - // - mAttributeTypeDialog = new QgsAttributeTypeDialog( mLayer, index, mAttributeTypeFrame ); - - mAttributeTypeDialog->setFieldEditable( cfg.mEditable ); - mAttributeTypeDialog->setLabelOnTop( cfg.mLabelOnTop ); - mAttributeTypeDialog->setNotNull( cfg.mConstraints & QgsFieldConstraints::ConstraintNotNull ); - mAttributeTypeDialog->setNotNullEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintNotNull, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard ); - mAttributeTypeDialog->setUnique( cfg.mConstraints & QgsFieldConstraints::ConstraintUnique ); - mAttributeTypeDialog->setUniqueEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintUnique, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard ); - - QgsFieldConstraints constraints = mLayer->fields().at( index ).constraints(); - QgsFieldConstraints::Constraints providerConstraints = 0; - if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintOriginProvider ) - providerConstraints |= QgsFieldConstraints::ConstraintNotNull; - if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintUnique ) == QgsFieldConstraints::ConstraintOriginProvider ) - providerConstraints |= QgsFieldConstraints::ConstraintUnique; - if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintExpression ) == QgsFieldConstraints::ConstraintOriginProvider ) - providerConstraints |= QgsFieldConstraints::ConstraintExpression; - mAttributeTypeDialog->setProviderConstraints( providerConstraints ); - - mAttributeTypeDialog->setConstraintExpression( cfg.mConstraint ); - mAttributeTypeDialog->setConstraintExpressionDescription( cfg.mConstraintDescription ); - mAttributeTypeDialog->setConstraintExpressionEnforced( cfg.mConstraintStrength.value( QgsFieldConstraints::ConstraintExpression, QgsFieldConstraints::ConstraintStrengthHard ) == QgsFieldConstraints::ConstraintStrengthHard ); - mAttributeTypeDialog->setDefaultValueExpression( mLayer->defaultValueExpression( index ) ); - - mAttributeTypeDialog->setEditorWidgetConfig( cfg.mEditorWidgetConfig ); - mAttributeTypeDialog->setEditorWidgetType( cfg.mEditorWidgetType ); - - mAttributeTypeDialog->layout()->setMargin( 0 ); - mAttributeTypeFrame->layout()->setMargin( 0 ); - - mAttributeTypeFrame->layout()->addWidget( mAttributeTypeDialog ); } @@ -156,23 +155,29 @@ void QgsAttributesFormProperties::storeAttributeTypeDialog() cfg.mConstraintStrength.insert( QgsFieldConstraints::ConstraintExpression, mAttributeTypeDialog->constraintExpressionEnforced() ? QgsFieldConstraints::ConstraintStrengthHard : QgsFieldConstraints::ConstraintStrengthSoft ); - Q_FOREACH ( QTreeWidgetItem *wdg, mDragTree->mIndexedWidgets ) + QString fieldName = mLayer->fields().at( mAttributeTypeDialog->fieldIdx() ).name(); + + QTreeWidgetItemIterator itemIt( mAvailableWidgetsTree ); + while ( *itemIt ) { - if ( mDragTree->invisibleRootItem()->indexOfChild( wdg ) == mAttributeTypeDialog->fieldIdx() ) - { - wdg->setData( 0, FieldConfigRole, QVariant::fromValue( cfg ) ); - } + QTreeWidgetItem *item = *itemIt; + if ( item->data( 0, FieldNameRole ).toString() == fieldName ) + item->setData( 0, FieldConfigRole, QVariant::fromValue( cfg ) ); + ++itemIt; } } QgsAttributesFormProperties::FieldConfig QgsAttributesFormProperties::configForChild( int index ) { - Q_FOREACH ( QTreeWidgetItem *wdg, mDragTree->mIndexedWidgets ) + QString fieldName = mLayer->fields().at( index ).name(); + + QTreeWidgetItemIterator itemIt( mAvailableWidgetsTree ); + while ( *itemIt ) { - if ( mDragTree->invisibleRootItem()->indexOfChild( wdg ) == index ) - { - return wdg->data( 0, FieldConfigRole ).value(); - } + QTreeWidgetItem *item = *itemIt; + if ( item->data( 0, FieldNameRole ).toString() == fieldName ) + return item->data( 0, FieldConfigRole ).value(); + ++itemIt; } // Should never get here @@ -233,59 +238,18 @@ QTreeWidgetItem *QgsAttributesFormProperties::loadAttributeEditorTreeItem( QgsAt return newWidget; } - - -void QgsAttributesFormProperties::loadAttributeEditorTree( DnDTree *tree ) +void QgsAttributesFormProperties::initFormLayoutTree() { - if ( tree->type() == DnDTree::Type::Drop ) + // tabs and groups info + mFormLayoutTree->clear(); + mFormLayoutTree->setSortingEnabled( false ); + mFormLayoutTree->setSelectionBehavior( QAbstractItemView::SelectRows ); + mFormLayoutTree->setAcceptDrops( true ); + mFormLayoutTree->setDragDropMode( QAbstractItemView::DragDrop ); + + Q_FOREACH ( QgsAttributeEditorElement *wdg, mLayer->editFormConfig().tabs() ) { - // tabs and groups info - tree->clear(); - tree->setSortingEnabled( false ); - tree->setSelectionBehavior( QAbstractItemView::SelectRows ); - tree->setAcceptDrops( true ); - tree->setDragDropMode( QAbstractItemView::DragDrop ); - - Q_FOREACH ( QgsAttributeEditorElement *wdg, mLayer->editFormConfig().tabs() ) - { - loadAttributeEditorTreeItem( wdg, tree->invisibleRootItem(), tree ); - } - - } - else - { - tree->clear(); - tree->setSortingEnabled( false ); - tree->setSelectionBehavior( QAbstractItemView::SelectRows ); - tree->setAcceptDrops( false ); - tree->setDragDropMode( QAbstractItemView::DragOnly ); - - tree->mIndexedWidgets.clear(); - - const QgsFields fields = mLayer->fields(); - for ( int i = 0; i < fields.size(); ++i ) - { - DnDTreeItemData itemData = DnDTreeItemData( DnDTreeItemData::Field, fields.at( i ).name() ); - itemData.setShowLabel( true ); - - FieldConfig cfg( mLayer, i ); - - itemData.setData( 0, FieldConfigRole, QVariant::fromValue( cfg ) ); - tree->mIndexedWidgets.insert( i, tree->addItem( tree->invisibleRootItem(), itemData ) ); - } - - /*some stuff for containers - //load Container Field - DnDTreeItemData catItemData = DnDTreeItemData( DnDTreeItemData::Container, "Fields"); - catItemData.setShowLabel( true ); - QTreeWidgetItem *catWidget = nullptr; - catWidget=mTree->addItem( mTree->invisibleRootItem(), catItemData ); - mTree->mIndexedWidgets.insert( i, mTree->addItem( catWidget, itemData ) ); - - itemData.setIcon(i, mLayer->fields().iconForField( i )); - itemData.setText(i, QString::number( i+1 ) ); - itemData.setText(i, fields.at( i ).name() ); - */ + loadAttributeEditorTreeItem( wdg, mFormLayoutTree->invisibleRootItem(), mFormLayoutTree ); } } @@ -293,20 +257,56 @@ void QgsAttributesFormProperties::loadAttributeEditorTree( DnDTree *tree ) void QgsAttributesFormProperties::onAttributeSelectionChanged() { bool isAddPossible = false; - if ( mDropTree->selectedItems().count() == 1 && !mDragTree->selectedItems().isEmpty() ) - if ( mDropTree->selectedItems()[0]->data( 0, DnDTreeRole ).value().type() == DnDTreeItemData::Container ) + if ( mFormLayoutTree->selectedItems().count() == 1 && !mAvailableWidgetsTree->selectedItems().isEmpty() ) + if ( mFormLayoutTree->selectedItems()[0]->data( 0, DnDTreeRole ).value().type() == DnDTreeItemData::Container ) isAddPossible = true; storeAttributeTypeDialog(); loadAttributeTypeDialog(); } +void QgsAttributesFormProperties::initAvailableWidgetsTree() +{ + mAvailableWidgetsTree->clear(); + mAvailableWidgetsTree->setSortingEnabled( false ); + mAvailableWidgetsTree->setSelectionBehavior( QAbstractItemView::SelectRows ); + mAvailableWidgetsTree->setAcceptDrops( false ); + mAvailableWidgetsTree->setDragDropMode( QAbstractItemView::DragOnly ); + + const QgsFields fields = mLayer->fields(); + for ( int i = 0; i < fields.size(); ++i ) + { + const QgsField field = fields.at( i ); + DnDTreeItemData itemData = DnDTreeItemData( DnDTreeItemData::Field, field.name() ); + itemData.setShowLabel( true ); + + FieldConfig cfg( mLayer, i ); + + QTreeWidgetItem *item = mAvailableWidgetsTree->addItem( mAvailableWidgetsTree->invisibleRootItem(), itemData ); + item->setData( 0, FieldConfigRole, cfg ); + item->setData( 0, FieldNameRole, field.name() ); + } + + /*some stuff for containers + //load Container Field + DnDTreeItemData catItemData = DnDTreeItemData( DnDTreeItemData::Container, "Fields"); + catItemData.setShowLabel( true ); + QTreeWidgetItem *catWidget = nullptr; + catWidget=mTree->addItem( mTree->invisibleRootItem(), catItemData ); + mTree->mIndexedWidgets.insert( i, mTree->addItem( catWidget, itemData ) ); + + itemData.setIcon(i, mLayer->fields().iconForField( i )); + itemData.setText(i, QString::number( i+1 ) ); + itemData.setText(i, fields.at( i ).name() ); + */ +} + void QgsAttributesFormProperties::addTabOrGroupButton() { QList tabList; - for ( QTreeWidgetItemIterator it( mDropTree ); *it; ++it ) + for ( QTreeWidgetItemIterator it( mFormLayoutTree ); *it; ++it ) { DnDTreeItemData itemData = ( *it )->data( 0, DnDTreeRole ).value(); if ( itemData.type() == DnDTreeItemData::Container ) @@ -322,18 +322,18 @@ void QgsAttributesFormProperties::addTabOrGroupButton() QString name = addTabOrGroup.name(); if ( addTabOrGroup.tabButtonIsChecked() ) { - mDropTree->addContainer( mDropTree->invisibleRootItem(), name, addTabOrGroup.columnCount() ); + mFormLayoutTree->addContainer( mFormLayoutTree->invisibleRootItem(), name, addTabOrGroup.columnCount() ); } else { QTreeWidgetItem *tabItem = addTabOrGroup.tab(); - mDropTree->addContainer( tabItem, name, addTabOrGroup.columnCount() ); + mFormLayoutTree->addContainer( tabItem, name, addTabOrGroup.columnCount() ); } } void QgsAttributesFormProperties::removeTabOrGroupButton() { - qDeleteAll( mDropTree->selectedItems() ); + qDeleteAll( mFormLayoutTree->selectedItems() ); } @@ -392,9 +392,9 @@ void QgsAttributesFormProperties::apply() { QgsEditFormConfig editFormConfig = mLayer->editFormConfig(); - for ( QTreeWidgetItemIterator it( mDragTree ); *it; ++it ) + for ( QTreeWidgetItemIterator it( mAvailableWidgetsTree ); *it; ++it ) { - int idx = mDragTree->invisibleRootItem()->indexOfChild( ( *it ) ); + int idx = mAvailableWidgetsTree->invisibleRootItem()->indexOfChild( ( *it ) ); QString name = mLayer->fields().at( idx ).name(); FieldConfig cfg = configForChild( idx ); @@ -431,9 +431,9 @@ void QgsAttributesFormProperties::apply() // tabs and groups editFormConfig.clearTabs(); - for ( int t = 0; t < mDropTree->invisibleRootItem()->childCount(); t++ ) + for ( int t = 0; t < mFormLayoutTree->invisibleRootItem()->childCount(); t++ ) { - QTreeWidgetItem *tabItem = mDropTree->invisibleRootItem()->child( t ); + QTreeWidgetItem *tabItem = mFormLayoutTree->invisibleRootItem()->child( t ); editFormConfig.addTab( createAttributeEditorWidget( tabItem, nullptr, false ) ); } @@ -507,6 +507,11 @@ QgsAttributesFormProperties::FieldConfig::FieldConfig( QgsVectorLayer *layer, in mEditorWidgetConfig = setup.config(); } +QgsAttributesFormProperties::FieldConfig::operator QVariant() +{ + return QVariant::fromValue( *this ); +} + /* * DnDTree implementation */ @@ -518,7 +523,7 @@ QTreeWidgetItem *DnDTree::addContainer( QTreeWidgetItem *parent, const QString & newItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled ); QgsAttributesFormProperties::DnDTreeItemData itemData( QgsAttributesFormProperties::DnDTreeItemData::Container, title ); itemData.setColumnCount( columnCount ); - newItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData.asQVariant() ); + newItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData ); parent->addChild( newItem ); newItem->setExpanded( true ); return newItem; @@ -557,7 +562,7 @@ QTreeWidgetItem *DnDTree::addItem( QTreeWidgetItem *parent, QgsAttributesFormPro break; } } - newItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, data.asQVariant() ); + newItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, data ); parent->addChild( newItem ); return newItem; @@ -748,7 +753,7 @@ void DnDTree::onItemDoubleClicked( QTreeWidgetItem *item, int column ) visibilityExpression.setEnabled( visibilityExpressionGroupBox->isChecked() ); itemData.setVisibilityExpression( visibilityExpression ); - item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData.asQVariant() ); + item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData ); item->setText( 0, title->text() ); } } @@ -782,7 +787,7 @@ void DnDTree::onItemDoubleClicked( QTreeWidgetItem *item, int column ) itemData.setShowLabel( showLabelCheckbox->isChecked() ); itemData.setRelationEditorConfiguration( relEdCfg ); - item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData.asQVariant() ); + item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData ); } } else @@ -804,7 +809,7 @@ void DnDTree::onItemDoubleClicked( QTreeWidgetItem *item, int column ) { itemData.setShowLabel( showLabelCheckbox->isChecked() ); - item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData.asQVariant() ); + item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData ); } } } diff --git a/src/app/qgsattributesformproperties.h b/src/app/qgsattributesformproperties.h index 23e6c0b2b51..bc18aae88d9 100644 --- a/src/app/qgsattributesformproperties.h +++ b/src/app/qgsattributesformproperties.h @@ -56,7 +56,8 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt enum FieldPropertiesRoles { DnDTreeRole = Qt::UserRole, - FieldConfigRole + FieldConfigRole, + FieldNameRole }; struct RelationEditorConfiguration @@ -101,7 +102,7 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt Type type() const { return mType; } void setType( Type type ) { mType = type; } - QVariant asQVariant() { return QVariant::fromValue( *this ); } + operator QVariant() { return QVariant::fromValue( *this ); } int columnCount() const { return mColumnCount; } void setColumnCount( int count ) { mColumnCount = count; } @@ -132,22 +133,23 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt /** * Holds the configuration for a field */ - class FieldConfig + struct FieldConfig { - public: - FieldConfig(); - FieldConfig( QgsVectorLayer *layer, int idx ); + FieldConfig(); + FieldConfig( QgsVectorLayer *layer, int idx ); - bool mEditable; - bool mEditableEnabled; - bool mLabelOnTop; - QgsFieldConstraints::Constraints mConstraints; - QHash< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength > mConstraintStrength; - QString mConstraint; - QString mConstraintDescription; - QPushButton *mButton = nullptr; - QString mEditorWidgetType; - QMap mEditorWidgetConfig; + bool mEditable; + bool mEditableEnabled; + bool mLabelOnTop; + QgsFieldConstraints::Constraints mConstraints; + QHash< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength > mConstraintStrength; + QString mConstraint; + QString mConstraintDescription; + QPushButton *mButton = nullptr; + QString mEditorWidgetType; + QMap mEditorWidgetConfig; + + operator QVariant(); }; public: @@ -163,7 +165,8 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt void loadRelations(); - void loadAttributeEditorTree( DnDTree *tree ); + void initAvailableWidgetsTree(); + void initFormLayoutTree(); QTreeWidgetItem *loadAttributeEditorTreeItem( QgsAttributeEditorElement *const widgetDef, QTreeWidgetItem *parent, DnDTree *tree ); protected: @@ -175,8 +178,8 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt //QList mRelations; QgsVectorLayer *mLayer = nullptr; - DnDTree *mDragTree = nullptr; - DnDTree *mDropTree = nullptr; + DnDTree *mAvailableWidgetsTree = nullptr; + DnDTree *mFormLayoutTree = nullptr; QgsAttributeTypeDialog *mAttributeTypeDialog = nullptr; @@ -220,7 +223,6 @@ class DnDTree : public QTreeWidget }; - QList mIndexedWidgets; Type type() const; void setType( const Type &value ); diff --git a/src/app/qgsattributetypedialog.cpp b/src/app/qgsattributetypedialog.cpp index 61de05f89e0..e0260c2e54e 100644 --- a/src/app/qgsattributetypedialog.cpp +++ b/src/app/qgsattributetypedialog.cpp @@ -54,7 +54,6 @@ QgsAttributeTypeDialog::QgsAttributeTypeDialog( QgsVectorLayer *vl, int fieldIdx it.next(); mWidgetTypeComboBox->addItem( it.value()->name(), it.key() ); QStandardItem *item = widgetTypeModel->item( mWidgetTypeComboBox->count() - 1 ); - item->setData( it.key(), Qt::UserRole ); if ( !it.value()->supportsField( vl, fieldIdx ) ) item->setFlags( item->flags() & ~Qt::ItemIsEnabled ); } @@ -148,6 +147,7 @@ const QVariantMap QgsAttributeTypeDialog::editorWidgetConfig() void QgsAttributeTypeDialog::setEditorWidgetType( const QString &type ) { + mWidgetTypeComboBox->setCurrentIndex( mWidgetTypeComboBox->findData( type ) ); if ( mEditorConfigWidgets.contains( type ) )