Fix store/reload of widget configuration

This commit is contained in:
Matthias Kuhn 2017-09-29 14:15:30 +02:00
parent 44ce819ca2
commit d5e0b183ff
No known key found for this signature in database
GPG Key ID: A0E766808764D73F
3 changed files with 168 additions and 161 deletions

View File

@ -4,8 +4,8 @@
QgsAttributesFormProperties::QgsAttributesFormProperties( QgsVectorLayer *layer, QWidget *parent ) QgsAttributesFormProperties::QgsAttributesFormProperties( QgsVectorLayer *layer, QWidget *parent )
: QWidget( parent ) : QWidget( parent )
, mLayer( layer ) , mLayer( layer )
, mDragTree( nullptr ) , mAvailableWidgetsTree( nullptr )
, mDropTree( nullptr ) , mFormLayoutTree( nullptr )
, mAttributeTypeDialog( nullptr ) , mAttributeTypeDialog( nullptr )
{ {
if ( !layer ) if ( !layer )
@ -15,20 +15,20 @@ QgsAttributesFormProperties::QgsAttributesFormProperties( QgsVectorLayer *layer,
// drag tree (not mixup with drag queen) // drag tree (not mixup with drag queen)
QGridLayout *mDragListWidgetLayout = new QGridLayout; QGridLayout *mDragListWidgetLayout = new QGridLayout;
mDragTree = new DnDTree( mLayer, mDragListWidget ); mAvailableWidgetsTree = new DnDTree( mLayer, mDragListWidget );
mDragListWidgetLayout->addWidget( mDragTree ); mDragListWidgetLayout->addWidget( mAvailableWidgetsTree );
mDragListWidget->setLayout( mDragListWidgetLayout ); mDragListWidget->setLayout( mDragListWidgetLayout );
mDragTree->setHeaderLabels( QStringList() << tr( "Available Widgets" ) ); mAvailableWidgetsTree->setHeaderLabels( QStringList() << tr( "Available Widgets" ) );
mDragTree->setType( DnDTree::Type::Drag ); mAvailableWidgetsTree->setType( DnDTree::Type::Drag );
// drop tree // drop tree
QGridLayout *mDropListWidgetLayout = new QGridLayout; QGridLayout *mDropListWidgetLayout = new QGridLayout;
mDropTree = new DnDTree( mLayer, mDropListWidget ); mFormLayoutTree = new DnDTree( mLayer, mDropListWidget );
mDropListWidgetLayout->addWidget( mDropTree ); mDropListWidgetLayout->addWidget( mFormLayoutTree );
mDropListWidgetLayout->setMargin( 0 ); mDropListWidgetLayout->setMargin( 0 );
mDropListWidget->setLayout( mDropListWidgetLayout ); mDropListWidget->setLayout( mDropListWidgetLayout );
mDropTree->setHeaderLabels( QStringList() << tr( "Form Structure" ) ); mFormLayoutTree->setHeaderLabels( QStringList() << tr( "Form Structure" ) );
mDropTree->setType( DnDTree::Type::Drop ); mFormLayoutTree->setType( DnDTree::Type::Drop );
// AttributeTypeDialog // AttributeTypeDialog
mAttributeTypeDialog = new QgsAttributeTypeDialog( mLayer, 0, mAttributeTypeFrame ); mAttributeTypeDialog = new QgsAttributeTypeDialog( mLayer, 0, mAttributeTypeFrame );
@ -36,8 +36,8 @@ QgsAttributesFormProperties::QgsAttributesFormProperties( QgsVectorLayer *layer,
mAttributeTypeFrame->layout()->setMargin( 0 ); mAttributeTypeFrame->layout()->setMargin( 0 );
mAttributeTypeFrame->layout()->addWidget( mAttributeTypeDialog ); mAttributeTypeFrame->layout()->addWidget( mAttributeTypeDialog );
connect( mDragTree, &QTreeWidget::itemSelectionChanged, this, &QgsAttributesFormProperties::onAttributeSelectionChanged ); connect( mAvailableWidgetsTree, &QTreeWidget::itemSelectionChanged, this, &QgsAttributesFormProperties::onAttributeSelectionChanged );
connect( mDropTree, &QTreeWidget::itemSelectionChanged, this, &QgsAttributesFormProperties::onAttributeSelectionChanged ); connect( mFormLayoutTree, &QTreeWidget::itemSelectionChanged, this, &QgsAttributesFormProperties::onAttributeSelectionChanged );
connect( mAddTabOrGroupButton, &QAbstractButton::clicked, this, &QgsAttributesFormProperties::addTabOrGroupButton ); connect( mAddTabOrGroupButton, &QAbstractButton::clicked, this, &QgsAttributesFormProperties::addTabOrGroupButton );
connect( mRemoveTabOrGroupButton, &QAbstractButton::clicked, this, &QgsAttributesFormProperties::removeTabOrGroupButton ); connect( mRemoveTabOrGroupButton, &QAbstractButton::clicked, this, &QgsAttributesFormProperties::removeTabOrGroupButton );
} }
@ -50,66 +50,65 @@ QgsAttributesFormProperties::~QgsAttributesFormProperties()
void QgsAttributesFormProperties::init() void QgsAttributesFormProperties::init()
{ {
loadAttributeEditorTree( mDragTree ); initAvailableWidgetsTree();
loadAttributeEditorTree( mDropTree ); initFormLayoutTree();
loadAttributeTypeDialog(); loadAttributeTypeDialog();
} }
//Slots
void QgsAttributesFormProperties::loadAttributeTypeDialog() void QgsAttributesFormProperties::loadAttributeTypeDialog()
{ {
FieldConfig cfg; QTreeWidgetItem *currentItem = mAvailableWidgetsTree->currentItem();
int index = mDragTree->mIndexedWidgets.indexOf( mDragTree->currentItem() ); if ( !currentItem )
mAttributeTypeDialog->setEnabled( false );
if ( index < 0 ) index = 0; else
Q_FOREACH ( QTreeWidgetItem *wdg, mDragTree->mIndexedWidgets )
{ {
if ( mDragTree->invisibleRootItem()->indexOfChild( wdg ) == index ) FieldConfig cfg = mAvailableWidgetsTree->currentItem()->data( 0, FieldConfigRole ).value<FieldConfig>();
{ QString fieldName = mAvailableWidgetsTree->currentItem()->data( 0, FieldNameRole ).toString();
cfg = wdg->data( 0, FieldConfigRole ).value<FieldConfig>(); 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() ? cfg.mConstraintStrength.insert( QgsFieldConstraints::ConstraintExpression, mAttributeTypeDialog->constraintExpressionEnforced() ?
QgsFieldConstraints::ConstraintStrengthHard : QgsFieldConstraints::ConstraintStrengthSoft ); 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() ) QTreeWidgetItem *item = *itemIt;
{ if ( item->data( 0, FieldNameRole ).toString() == fieldName )
wdg->setData( 0, FieldConfigRole, QVariant::fromValue<FieldConfig>( cfg ) ); item->setData( 0, FieldConfigRole, QVariant::fromValue<FieldConfig>( cfg ) );
} ++itemIt;
} }
} }
QgsAttributesFormProperties::FieldConfig QgsAttributesFormProperties::configForChild( int index ) 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 ) QTreeWidgetItem *item = *itemIt;
{ if ( item->data( 0, FieldNameRole ).toString() == fieldName )
return wdg->data( 0, FieldConfigRole ).value<FieldConfig>(); return item->data( 0, FieldConfigRole ).value<FieldConfig>();
} ++itemIt;
} }
// Should never get here // Should never get here
@ -233,59 +238,18 @@ QTreeWidgetItem *QgsAttributesFormProperties::loadAttributeEditorTreeItem( QgsAt
return newWidget; return newWidget;
} }
void QgsAttributesFormProperties::initFormLayoutTree()
void QgsAttributesFormProperties::loadAttributeEditorTree( DnDTree *tree )
{ {
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 loadAttributeEditorTreeItem( wdg, mFormLayoutTree->invisibleRootItem(), mFormLayoutTree );
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<FieldConfig>( 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() );
*/
} }
} }
@ -293,20 +257,56 @@ void QgsAttributesFormProperties::loadAttributeEditorTree( DnDTree *tree )
void QgsAttributesFormProperties::onAttributeSelectionChanged() void QgsAttributesFormProperties::onAttributeSelectionChanged()
{ {
bool isAddPossible = false; bool isAddPossible = false;
if ( mDropTree->selectedItems().count() == 1 && !mDragTree->selectedItems().isEmpty() ) if ( mFormLayoutTree->selectedItems().count() == 1 && !mAvailableWidgetsTree->selectedItems().isEmpty() )
if ( mDropTree->selectedItems()[0]->data( 0, DnDTreeRole ).value<DnDTreeItemData>().type() == DnDTreeItemData::Container ) if ( mFormLayoutTree->selectedItems()[0]->data( 0, DnDTreeRole ).value<DnDTreeItemData>().type() == DnDTreeItemData::Container )
isAddPossible = true; isAddPossible = true;
storeAttributeTypeDialog(); storeAttributeTypeDialog();
loadAttributeTypeDialog(); 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() void QgsAttributesFormProperties::addTabOrGroupButton()
{ {
QList<QgsAddTabOrGroup::TabPair> tabList; QList<QgsAddTabOrGroup::TabPair> tabList;
for ( QTreeWidgetItemIterator it( mDropTree ); *it; ++it ) for ( QTreeWidgetItemIterator it( mFormLayoutTree ); *it; ++it )
{ {
DnDTreeItemData itemData = ( *it )->data( 0, DnDTreeRole ).value<DnDTreeItemData>(); DnDTreeItemData itemData = ( *it )->data( 0, DnDTreeRole ).value<DnDTreeItemData>();
if ( itemData.type() == DnDTreeItemData::Container ) if ( itemData.type() == DnDTreeItemData::Container )
@ -322,18 +322,18 @@ void QgsAttributesFormProperties::addTabOrGroupButton()
QString name = addTabOrGroup.name(); QString name = addTabOrGroup.name();
if ( addTabOrGroup.tabButtonIsChecked() ) if ( addTabOrGroup.tabButtonIsChecked() )
{ {
mDropTree->addContainer( mDropTree->invisibleRootItem(), name, addTabOrGroup.columnCount() ); mFormLayoutTree->addContainer( mFormLayoutTree->invisibleRootItem(), name, addTabOrGroup.columnCount() );
} }
else else
{ {
QTreeWidgetItem *tabItem = addTabOrGroup.tab(); QTreeWidgetItem *tabItem = addTabOrGroup.tab();
mDropTree->addContainer( tabItem, name, addTabOrGroup.columnCount() ); mFormLayoutTree->addContainer( tabItem, name, addTabOrGroup.columnCount() );
} }
} }
void QgsAttributesFormProperties::removeTabOrGroupButton() void QgsAttributesFormProperties::removeTabOrGroupButton()
{ {
qDeleteAll( mDropTree->selectedItems() ); qDeleteAll( mFormLayoutTree->selectedItems() );
} }
@ -392,9 +392,9 @@ void QgsAttributesFormProperties::apply()
{ {
QgsEditFormConfig editFormConfig = mLayer->editFormConfig(); 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(); QString name = mLayer->fields().at( idx ).name();
FieldConfig cfg = configForChild( idx ); FieldConfig cfg = configForChild( idx );
@ -431,9 +431,9 @@ void QgsAttributesFormProperties::apply()
// tabs and groups // tabs and groups
editFormConfig.clearTabs(); 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 ) ); editFormConfig.addTab( createAttributeEditorWidget( tabItem, nullptr, false ) );
} }
@ -507,6 +507,11 @@ QgsAttributesFormProperties::FieldConfig::FieldConfig( QgsVectorLayer *layer, in
mEditorWidgetConfig = setup.config(); mEditorWidgetConfig = setup.config();
} }
QgsAttributesFormProperties::FieldConfig::operator QVariant()
{
return QVariant::fromValue<QgsAttributesFormProperties::FieldConfig>( *this );
}
/* /*
* DnDTree implementation * DnDTree implementation
*/ */
@ -518,7 +523,7 @@ QTreeWidgetItem *DnDTree::addContainer( QTreeWidgetItem *parent, const QString &
newItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled ); newItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled );
QgsAttributesFormProperties::DnDTreeItemData itemData( QgsAttributesFormProperties::DnDTreeItemData::Container, title ); QgsAttributesFormProperties::DnDTreeItemData itemData( QgsAttributesFormProperties::DnDTreeItemData::Container, title );
itemData.setColumnCount( columnCount ); itemData.setColumnCount( columnCount );
newItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData.asQVariant() ); newItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData );
parent->addChild( newItem ); parent->addChild( newItem );
newItem->setExpanded( true ); newItem->setExpanded( true );
return newItem; return newItem;
@ -557,7 +562,7 @@ QTreeWidgetItem *DnDTree::addItem( QTreeWidgetItem *parent, QgsAttributesFormPro
break; break;
} }
} }
newItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, data.asQVariant() ); newItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, data );
parent->addChild( newItem ); parent->addChild( newItem );
return newItem; return newItem;
@ -748,7 +753,7 @@ void DnDTree::onItemDoubleClicked( QTreeWidgetItem *item, int column )
visibilityExpression.setEnabled( visibilityExpressionGroupBox->isChecked() ); visibilityExpression.setEnabled( visibilityExpressionGroupBox->isChecked() );
itemData.setVisibilityExpression( visibilityExpression ); itemData.setVisibilityExpression( visibilityExpression );
item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData.asQVariant() ); item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData );
item->setText( 0, title->text() ); item->setText( 0, title->text() );
} }
} }
@ -782,7 +787,7 @@ void DnDTree::onItemDoubleClicked( QTreeWidgetItem *item, int column )
itemData.setShowLabel( showLabelCheckbox->isChecked() ); itemData.setShowLabel( showLabelCheckbox->isChecked() );
itemData.setRelationEditorConfiguration( relEdCfg ); itemData.setRelationEditorConfiguration( relEdCfg );
item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData.asQVariant() ); item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData );
} }
} }
else else
@ -804,7 +809,7 @@ void DnDTree::onItemDoubleClicked( QTreeWidgetItem *item, int column )
{ {
itemData.setShowLabel( showLabelCheckbox->isChecked() ); itemData.setShowLabel( showLabelCheckbox->isChecked() );
item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData.asQVariant() ); item->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData );
} }
} }
} }

View File

@ -56,7 +56,8 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt
enum FieldPropertiesRoles enum FieldPropertiesRoles
{ {
DnDTreeRole = Qt::UserRole, DnDTreeRole = Qt::UserRole,
FieldConfigRole FieldConfigRole,
FieldNameRole
}; };
struct RelationEditorConfiguration struct RelationEditorConfiguration
@ -101,7 +102,7 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt
Type type() const { return mType; } Type type() const { return mType; }
void setType( Type type ) { mType = type; } void setType( Type type ) { mType = type; }
QVariant asQVariant() { return QVariant::fromValue<DnDTreeItemData>( *this ); } operator QVariant() { return QVariant::fromValue<DnDTreeItemData>( *this ); }
int columnCount() const { return mColumnCount; } int columnCount() const { return mColumnCount; }
void setColumnCount( int count ) { mColumnCount = count; } 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 * Holds the configuration for a field
*/ */
class FieldConfig struct FieldConfig
{ {
public: FieldConfig();
FieldConfig(); FieldConfig( QgsVectorLayer *layer, int idx );
FieldConfig( QgsVectorLayer *layer, int idx );
bool mEditable; bool mEditable;
bool mEditableEnabled; bool mEditableEnabled;
bool mLabelOnTop; bool mLabelOnTop;
QgsFieldConstraints::Constraints mConstraints; QgsFieldConstraints::Constraints mConstraints;
QHash< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength > mConstraintStrength; QHash< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength > mConstraintStrength;
QString mConstraint; QString mConstraint;
QString mConstraintDescription; QString mConstraintDescription;
QPushButton *mButton = nullptr; QPushButton *mButton = nullptr;
QString mEditorWidgetType; QString mEditorWidgetType;
QMap<QString, QVariant> mEditorWidgetConfig; QMap<QString, QVariant> mEditorWidgetConfig;
operator QVariant();
}; };
public: public:
@ -163,7 +165,8 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt
void loadRelations(); void loadRelations();
void loadAttributeEditorTree( DnDTree *tree ); void initAvailableWidgetsTree();
void initFormLayoutTree();
QTreeWidgetItem *loadAttributeEditorTreeItem( QgsAttributeEditorElement *const widgetDef, QTreeWidgetItem *parent, DnDTree *tree ); QTreeWidgetItem *loadAttributeEditorTreeItem( QgsAttributeEditorElement *const widgetDef, QTreeWidgetItem *parent, DnDTree *tree );
protected: protected:
@ -175,8 +178,8 @@ class APP_EXPORT QgsAttributesFormProperties : public QWidget, private Ui_QgsAtt
//QList<QgsRelation> mRelations; //QList<QgsRelation> mRelations;
QgsVectorLayer *mLayer = nullptr; QgsVectorLayer *mLayer = nullptr;
DnDTree *mDragTree = nullptr; DnDTree *mAvailableWidgetsTree = nullptr;
DnDTree *mDropTree = nullptr; DnDTree *mFormLayoutTree = nullptr;
QgsAttributeTypeDialog *mAttributeTypeDialog = nullptr; QgsAttributeTypeDialog *mAttributeTypeDialog = nullptr;
@ -220,7 +223,6 @@ class DnDTree : public QTreeWidget
}; };
QList<QTreeWidgetItem *> mIndexedWidgets;
Type type() const; Type type() const;
void setType( const Type &value ); void setType( const Type &value );

View File

@ -54,7 +54,6 @@ QgsAttributeTypeDialog::QgsAttributeTypeDialog( QgsVectorLayer *vl, int fieldIdx
it.next(); it.next();
mWidgetTypeComboBox->addItem( it.value()->name(), it.key() ); mWidgetTypeComboBox->addItem( it.value()->name(), it.key() );
QStandardItem *item = widgetTypeModel->item( mWidgetTypeComboBox->count() - 1 ); QStandardItem *item = widgetTypeModel->item( mWidgetTypeComboBox->count() - 1 );
item->setData( it.key(), Qt::UserRole );
if ( !it.value()->supportsField( vl, fieldIdx ) ) if ( !it.value()->supportsField( vl, fieldIdx ) )
item->setFlags( item->flags() & ~Qt::ItemIsEnabled ); item->setFlags( item->flags() & ~Qt::ItemIsEnabled );
} }
@ -148,6 +147,7 @@ const QVariantMap QgsAttributeTypeDialog::editorWidgetConfig()
void QgsAttributeTypeDialog::setEditorWidgetType( const QString &type ) void QgsAttributeTypeDialog::setEditorWidgetType( const QString &type )
{ {
mWidgetTypeComboBox->setCurrentIndex( mWidgetTypeComboBox->findData( type ) ); mWidgetTypeComboBox->setCurrentIndex( mWidgetTypeComboBox->findData( type ) );
if ( mEditorConfigWidgets.contains( type ) ) if ( mEditorConfigWidgets.contains( type ) )