diff --git a/python/core/qgseditformconfig.sip b/python/core/qgseditformconfig.sip index 1f698792232..cf0086ab2af 100644 --- a/python/core/qgseditformconfig.sip +++ b/python/core/qgseditformconfig.sip @@ -287,9 +287,4 @@ class QgsEditFormConfig * Deserialize drag and drop designer elements. */ QgsAttributeEditorElement* attributeEditorElementFromDomElement( QDomElement &elem, QgsAttributeEditorElement* parent ); - - /** - * Parse the XML for the config of one editor widget. - */ - static QgsEditorWidgetConfig parseEditorWidgetConfig( const QDomElement& cfgElem ); }; diff --git a/src/core/qgseditformconfig.cpp b/src/core/qgseditformconfig.cpp index 8dc518e6b02..e9fbe9ea3a8 100644 --- a/src/core/qgseditformconfig.cpp +++ b/src/core/qgseditformconfig.cpp @@ -355,42 +355,6 @@ void QgsEditFormConfig::readXml( const QDomNode& node ) } } } - - - QDomElement widgetsElem = node.namedItem( QStringLiteral( "widgets" ) ).toElement(); - - QDomNodeList widgetConfigsElems = widgetsElem.childNodes(); - - for ( int i = 0; i < widgetConfigsElems.size(); ++i ) - { - const QDomElement wdgElem = widgetConfigsElems.at( i ).toElement(); - const QDomElement cfgElem = wdgElem.namedItem( QStringLiteral( "config" ) ).toElement(); - const QgsEditorWidgetConfig widgetConfig = parseEditorWidgetConfig( cfgElem ); - setWidgetConfig( wdgElem.attribute( QStringLiteral( "name" ) ), widgetConfig ); - } -} - -QgsEditorWidgetConfig QgsEditFormConfig::parseEditorWidgetConfig( const QDomElement& cfgElem ) -{ - QgsEditorWidgetConfig cfg; - //// TODO: MAKE THIS MORE GENERIC, SO INDIVIDUALL WIDGETS CAN NOT ONLY SAVE STRINGS - /// SEE QgsEditorWidgetFactory::writeConfig - for ( int j = 0; j < cfgElem.attributes().size(); ++j ) - { - const QDomAttr attr = cfgElem.attributes().item( j ).toAttr(); - cfg.insert( attr.name(), attr.value() ); - } - - const QDomNodeList optionElements = cfgElem.elementsByTagName( QStringLiteral( "option" ) ); - for ( int j = 0; j < optionElements.size(); ++j ) - { - const QDomElement option = optionElements.at( j ).toElement(); - const QString key = option.attribute( QStringLiteral( "key" ) ); - const QString value = option.attribute( QStringLiteral( "value" ) ); - cfg.insert( key, value ); - } - //// END TODO - return cfg; } void QgsEditFormConfig::writeXml( QDomNode& node ) const diff --git a/src/core/qgseditformconfig.h b/src/core/qgseditformconfig.h index 2490fffb867..77b572ac5d6 100644 --- a/src/core/qgseditformconfig.h +++ b/src/core/qgseditformconfig.h @@ -328,11 +328,6 @@ class CORE_EXPORT QgsEditFormConfig */ explicit QgsEditFormConfig(); - /** - * Parse the XML for the config of one editor widget. - */ - static QgsEditorWidgetConfig parseEditorWidgetConfig( const QDomElement& cfgElem ); - private: /** diff --git a/src/core/qgseditorwidgetsetup.h b/src/core/qgseditorwidgetsetup.h index 9e60b12b410..32837277f4e 100644 --- a/src/core/qgseditorwidgetsetup.h +++ b/src/core/qgseditorwidgetsetup.h @@ -30,7 +30,11 @@ class CORE_EXPORT QgsEditorWidgetSetup /** * Constructor */ - QgsEditorWidgetSetup( const QString& type, const QgsEditorWidgetConfig& config ) : mType( type ), mConfig( config ) {} + QgsEditorWidgetSetup( const QString& type, const QgsEditorWidgetConfig& config ) + : mType( type ) + , mConfig( config ) + {} + QgsEditorWidgetSetup() {} /** @@ -47,9 +51,10 @@ class CORE_EXPORT QgsEditorWidgetSetup * @return true if there is no widget configured. */ bool isNull() const { return mType.isEmpty(); } + private: QString mType; QgsEditorWidgetConfig mConfig; }; -#endif // QGSEDITORWIDGETSETUP_H \ No newline at end of file +#endif // QGSEDITORWIDGETSETUP_H diff --git a/src/core/qgsfield.cpp b/src/core/qgsfield.cpp index 5bba6e4905a..c60aa9dba24 100644 --- a/src/core/qgsfield.cpp +++ b/src/core/qgsfield.cpp @@ -292,7 +292,7 @@ void QgsField::setEditorWidgetSetup( const QgsEditorWidgetSetup& v ) d->editorWidgetSetup = v; } -const QgsEditorWidgetSetup& QgsField::editorWidgetSetup() const +QgsEditorWidgetSetup QgsField::editorWidgetSetup() const { return d->editorWidgetSetup; } diff --git a/src/core/qgsfield.h b/src/core/qgsfield.h index 4897b47090a..d6f8a741d76 100644 --- a/src/core/qgsfield.h +++ b/src/core/qgsfield.h @@ -269,7 +269,7 @@ class CORE_EXPORT QgsField * * @return the value */ - const QgsEditorWidgetSetup& editorWidgetSetup() const; + QgsEditorWidgetSetup editorWidgetSetup() const; private: diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index acedb787ac8..14730237fa7 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -82,6 +82,7 @@ #include "qgssimplifymethod.h" #include "qgsexpressioncontext.h" #include "qgsfeedback.h" +#include "qgsconfigurationmap.h" #include "diagram/qgsdiagram.h" @@ -1742,20 +1743,20 @@ bool QgsVectorLayer::writeXml( QDomNode & layer_node, } // bool QgsVectorLayer::writeXml -bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage ) +bool QgsVectorLayer::readSymbology( const QDomNode& layerNode, QString& errorMessage ) { if ( !mExpressionFieldBuffer ) mExpressionFieldBuffer = new QgsExpressionFieldBuffer(); - mExpressionFieldBuffer->readXml( node ); + mExpressionFieldBuffer->readXml( layerNode ); updateFields(); - readStyle( node, errorMessage ); + readStyle( layerNode, errorMessage ); - mDisplayExpression = node.namedItem( QStringLiteral( "previewExpression" ) ).toElement().text(); - mMapTipTemplate = node.namedItem( QStringLiteral( "mapTip" ) ).toElement().text(); + mDisplayExpression = layerNode.namedItem( QStringLiteral( "previewExpression" ) ).toElement().text(); + mMapTipTemplate = layerNode.namedItem( QStringLiteral( "mapTip" ) ).toElement().text(); - QString displayField = node.namedItem( QStringLiteral( "displayfield" ) ).toElement().text(); + QString displayField = layerNode.namedItem( QStringLiteral( "displayfield" ) ).toElement().text(); // Try to migrate pre QGIS 3.0 display field property if ( mFields.lookupField( displayField ) < 0 ) @@ -1771,9 +1772,9 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage } // process the attribute actions - mActions->readXml( node ); + mActions->readXml( layerNode ); - QDomNode annotationFormNode = node.namedItem( QStringLiteral( "annotationform" ) ); + QDomNode annotationFormNode = layerNode.namedItem( QStringLiteral( "annotationform" ) ); if ( !annotationFormNode.isNull() ) { QDomElement e = annotationFormNode.toElement(); @@ -1781,7 +1782,7 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage } mAttributeAliasMap.clear(); - QDomNode aliasesNode = node.namedItem( QStringLiteral( "aliases" ) ); + QDomNode aliasesNode = layerNode.namedItem( QStringLiteral( "aliases" ) ); if ( !aliasesNode.isNull() ) { QDomElement aliasElem; @@ -1811,7 +1812,7 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage //Attributes excluded from WMS and WFS mExcludeAttributesWMS.clear(); - QDomNode excludeWMSNode = node.namedItem( QStringLiteral( "excludeAttributesWMS" ) ); + QDomNode excludeWMSNode = layerNode.namedItem( QStringLiteral( "excludeAttributesWMS" ) ); if ( !excludeWMSNode.isNull() ) { QDomNodeList attributeNodeList = excludeWMSNode.toElement().elementsByTagName( QStringLiteral( "attribute" ) ); @@ -1822,7 +1823,7 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage } mExcludeAttributesWFS.clear(); - QDomNode excludeWFSNode = node.namedItem( QStringLiteral( "excludeAttributesWFS" ) ); + QDomNode excludeWFSNode = layerNode.namedItem( QStringLiteral( "excludeAttributesWFS" ) ); if ( !excludeWFSNode.isNull() ) { QDomNodeList attributeNodeList = excludeWFSNode.toElement().elementsByTagName( QStringLiteral( "attribute" ) ); @@ -1832,13 +1833,33 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage } } - mEditFormConfig.readXml( node ); + // Load editor widget configuration + QDomElement widgetsElem = layerNode.namedItem( QStringLiteral( "fieldConfiguration" ) ).toElement(); - mAttributeTableConfig.readXml( node ); + QDomNodeList fieldConfigurationElementList = widgetsElem.elementsByTagName( QStringLiteral( "field" ) ); - mConditionalStyles->readXml( node ); + for ( int i = 0; i < fieldConfigurationElementList.size(); ++i ) + { + const QDomElement fieldConfigElement = fieldConfigurationElementList.at( i ).toElement(); + const QDomElement fieldWidgetElement = fieldConfigElement.elementsByTagName( QStringLiteral( "editWidget" ) ).at( 0 ).toElement(); - readCustomProperties( node, QStringLiteral( "variable" ) ); + QString fieldName = fieldConfigElement.attribute( QStringLiteral( "name" ) ); + + const QString widgetType = fieldWidgetElement.attribute( QStringLiteral( "type" ) ); + const QDomElement cfgElem = fieldConfigElement.elementsByTagName( QStringLiteral( "config" ) ).at( 0 ).toElement(); + QgsConfigurationMap editWidgetConfiguration; + editWidgetConfiguration.fromXml( cfgElem ); + QgsEditorWidgetSetup setup = QgsEditorWidgetSetup( widgetType, editWidgetConfiguration.get() ); + mFieldWidgetSetups[fieldName] = setup; + } + + mEditFormConfig.readXml( layerNode ); + + mAttributeTableConfig.readXml( layerNode ); + + mConditionalStyles->readXml( layerNode ); + + readCustomProperties( layerNode, QStringLiteral( "variable" ) ); return true; } @@ -1956,19 +1977,14 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString& { ( void )writeStyle( node, doc, errorMessage ); -<<<<<<< HEAD - // FIXME - // edittypes are written to the layerNode - // by slot QgsEditorWidgetRegistry::writeMapLayer() - // triggered by signal QgsProject::writeMapLayer() - // still other editing settings are written here, - // although they are not part of symbology either -======= + QgsFields dataProviderFields = mDataProvider->fields(); + QDomElement fieldConfigurationElement = doc.createElement( QStringLiteral( "fieldConfiguration" ) ); int index = 0; Q_FOREACH ( const QgsField& field, mFields ) { + QDomElement fieldElement = doc.createElement( QStringLiteral( "field" ) ); fieldElement.setAttribute( QStringLiteral( "name" ), field.name() ); @@ -1980,7 +1996,6 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString& QDomElement editWidgetElement = doc.createElement( QStringLiteral( "editWidget" ) ); fieldElement.appendChild( editWidgetElement ); editWidgetElement.setAttribute( "type", field.editorWidgetSetup().type() ); - QDomElement editWidgetConfigElement = doc.createElement( QStringLiteral( "config" ) ); QgsConfigurationMap( widgetSetup.config() ).toXml( editWidgetConfigElement ); @@ -1989,7 +2004,6 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString& ++index; } ->>>>>>> dc0c72f... Fixup QDomElement afField = doc.createElement( QStringLiteral( "annotationform" ) ); QDomText afText = doc.createTextNode( QgsProject::instance()->writePath( mAnnotationForm ) ); @@ -3056,6 +3070,16 @@ void QgsVectorLayer::updateFields() mFields[ index ].setConstraints( constraints ); } + auto fieldWidgetIterator = mFieldWidgetSetups.constBegin(); + for ( ; fieldWidgetIterator != mFieldWidgetSetups.constEnd(); ++ fieldWidgetIterator ) + { + int index = mFields.indexOf( fieldWidgetIterator.key() ); + if ( index < 0 ) + continue; + + mFields[index].setEditorWidgetSetup( fieldWidgetIterator.value() ); + } + if ( oldFields != mFields ) { emit updatedFields(); diff --git a/src/core/qgsvectorlayer.h b/src/core/qgsvectorlayer.h index 3a43b9b5307..989b092225e 100644 --- a/src/core/qgsvectorlayer.h +++ b/src/core/qgsvectorlayer.h @@ -799,7 +799,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte * @param errorMessage reference to string that will be updated with any error messages * @return true in case of success. */ - bool readSymbology( const QDomNode& node, QString& errorMessage ) override; + bool readSymbology( const QDomNode& layerNode, QString& errorMessage ) override; /** Read the style for the current layer from the Dom node supplied. * @param node node that will contain the style definition for this layer. @@ -2016,6 +2016,8 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte //! Map which stores expression constraints for fields. Value is a pair of expression/description. QMap< QString, QPair< QString, QString > > mFieldConstraintExpressions; + QMap< QString, QgsEditorWidgetSetup > mFieldWidgetSetups; + //! Holds the configuration for the edit form QgsEditFormConfig mEditFormConfig; diff --git a/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp b/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp index 70ede892b9a..1fbf3e3f343 100644 --- a/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp +++ b/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp @@ -80,7 +80,7 @@ void QgsEditorWidgetRegistry::initEditors( QgsMapCanvas *mapCanvas, QgsMessageBa QgsEditorWidgetRegistry::QgsEditorWidgetRegistry() { - connect( QgsProject::instance(), SIGNAL( readMapLayer( QgsMapLayer*, const QDomElement& ) ), this, SLOT( readMapLayer( QgsMapLayer*, const QDomElement& ) ) ); + // connect( QgsProject::instance(), SIGNAL( readMapLayer( QgsMapLayer*, const QDomElement& ) ), this, SLOT( readMapLayer( QgsMapLayer*, const QDomElement& ) ) ); // connect( QgsProject::instance(), SIGNAL( writeMapLayer( QgsMapLayer*, QDomElement&, QDomDocument& ) ), this, SLOT( writeMapLayer( QgsMapLayer*, QDomElement&, QDomDocument& ) ) ); connect( QgsProject::instance(), SIGNAL( layerWillBeRemoved( QgsMapLayer* ) ), this, SLOT( mapLayerWillBeRemoved( QgsMapLayer* ) ) );