diff --git a/src/app/qgsattributedialog.cpp b/src/app/qgsattributedialog.cpp index e1c123fadb71..6851539a0a17 100644 --- a/src/app/qgsattributedialog.cpp +++ b/src/app/qgsattributedialog.cpp @@ -204,7 +204,7 @@ QgsAttributeDialog::QgsAttributeDialog( QgsVectorLayer *vl, QgsFeature *thepFeat if ( vl->editType( fldIdx ) != QgsVectorLayer::Immutable ) { - myWidget->setEnabled( vl->isEditable() ); + myWidget->setEnabled( vl->isEditable() && vl->fieldEditable(fldIdx) ); } mypInnerLayout->addWidget( myWidget, index, 1 ); @@ -239,7 +239,7 @@ QgsAttributeDialog::QgsAttributeDialog( QgsVectorLayer *vl, QgsFeature *thepFeat if ( vl->editType( fldIdx ) != QgsVectorLayer::Immutable ) { - ( *itw )->setEnabled(( *itw )->isEnabled() && vl->isEditable() ); + ( *itw )->setEnabled( (*itw)->isEnabled() && vl->isEditable() && vl->fieldEditable( fldIdx ) ); } } } diff --git a/src/app/qgsattributetypedialog.cpp b/src/app/qgsattributetypedialog.cpp index 34e36a01aedf..701b1a942206 100644 --- a/src/app/qgsattributetypedialog.cpp +++ b/src/app/qgsattributetypedialog.cpp @@ -84,6 +84,16 @@ QMap &QgsAttributeTypeDialog::valueMap() return mValueMap; } +bool QgsAttributeTypeDialog::fieldEditable() +{ + return isFieldEditableCheckBox->isChecked(); +} + +void QgsAttributeTypeDialog::setFieldEditable(bool editable) +{ + isFieldEditableCheckBox->setChecked( editable ); +} + QPair QgsAttributeTypeDialog::checkedState() { return QPair( leCheckedState->text(), leUncheckedState->text() ); @@ -538,6 +548,8 @@ void QgsAttributeTypeDialog::setStackPage( int index ) void QgsAttributeTypeDialog::accept() { //store data to output variables + mFieldEditable = isFieldEditableCheckBox->isChecked(); + switch ( selectionListWidget->currentRow() ) { default: diff --git a/src/app/qgsattributetypedialog.h b/src/app/qgsattributetypedialog.h index beb9aaf75337..42b17c89105a 100644 --- a/src/app/qgsattributetypedialog.h +++ b/src/app/qgsattributetypedialog.h @@ -82,6 +82,12 @@ class QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttributeTypeDialog */ void setValueRelation( QgsVectorLayer::ValueRelationData valueRelationData ); + /** + * Setter for checkbox for editable state of field + * @param bool editable + */ + void setFieldEditable( bool editable ); + /** * Getter for checked state after editing * @return string representing the checked @@ -105,6 +111,11 @@ class QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttributeTypeDialog */ QgsVectorLayer::ValueRelationData valueRelationData(); + /** + * Getter for checkbox for editable state of field + */ + bool fieldEditable(); + private slots: /** * Slot to handle change of index in combobox to select correct page @@ -160,6 +171,7 @@ class QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttributeTypeDialog */ void updateMap( const QMap &map ); + bool mFieldEditable; QMap mValueMap; diff --git a/src/app/qgsfieldsproperties.cpp b/src/app/qgsfieldsproperties.cpp index c9f6bd6ab19b..c11b2ef6c995 100644 --- a/src/app/qgsfieldsproperties.cpp +++ b/src/app/qgsfieldsproperties.cpp @@ -489,13 +489,17 @@ void QgsFieldsProperties::attributeTypeDialog() attributeTypeDialog.setIndex( index, mEditTypeMap.value( index, mLayer->editType( index ) ) ); + attributeTypeDialog.setFieldEditable( mLayer->fieldEditable( index ) ); + if ( !attributeTypeDialog.exec() ) return; QgsVectorLayer::EditType editType = attributeTypeDialog.editType(); - mEditTypeMap.insert( index, editType ); + bool isFieldEditable = attributeTypeDialog.fieldEditable(); + mFieldEditables.insert( index, isFieldEditable ); + QString buttonText; switch ( editType ) { @@ -816,6 +820,8 @@ void QgsFieldsProperties::apply() QgsVectorLayer::EditType editType = editTypeFromButtonText( pb->text() ); mLayer->setEditType( idx, editType ); + mLayer->setFieldEditable( idx, mFieldEditables.value( idx, true )); + switch ( editType ) { case QgsVectorLayer::ValueMap: diff --git a/src/app/qgsfieldsproperties.h b/src/app/qgsfieldsproperties.h index 8ada6de05d29..4869a2070d65 100644 --- a/src/app/qgsfieldsproperties.h +++ b/src/app/qgsfieldsproperties.h @@ -123,6 +123,7 @@ class QgsFieldsProperties : public QWidget, private Ui_QgsFieldsPropertiesBase QgsAttributesTree* mAttributesTree; QgsAttributesList* mAttributesList; + QMap mFieldEditables; QMap mValueRelationData; QMap > mValueMaps; QMap mRanges; diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index bb09818d5d8b..1332bc6e822b 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -2618,6 +2618,9 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage EditType editType = ( EditType ) editTypeElement.attribute( "type" ).toInt(); mEditTypes.insert( name, editType ); + int editable = editTypeElement.attribute( "editable" , "1" ).toInt(); + mFieldEditables.insert( name, editable == 1); + switch ( editType ) { case ValueMap: @@ -2933,6 +2936,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString& QDomElement editTypeElement = doc.createElement( "edittype" ); editTypeElement.setAttribute( "name", it.key() ); editTypeElement.setAttribute( "type", it.value() ); + editTypeElement.setAttribute( "editable", mFieldEditables[ it.key()]?1:0 ); switch (( EditType ) it.value() ) { @@ -3895,6 +3899,22 @@ QgsVectorLayer::RangeData &QgsVectorLayer::range( int idx ) return mRanges[fieldName]; } +bool QgsVectorLayer::fieldEditable( int idx ) +{ + const QgsFields &fields = pendingFields(); + if ( idx >= 0 && idx < fields.count() && mEditTypes.contains( fields[idx].name() ) ) + return mFieldEditables[ fields[idx].name() ]; + else + return false; +} + +void QgsVectorLayer::setFieldEditable( int idx, bool editable ) +{ + const QgsFields &fields = pendingFields(); + if ( idx >= 0 && idx < fields.count() && mEditTypes.contains( fields[idx].name() ) ) + mFieldEditables[ fields[idx].name() ] = editable; +} + void QgsVectorLayer::addOverlay( QgsVectorOverlay* overlay ) { mOverlays.push_back( overlay ); diff --git a/src/core/qgsvectorlayer.h b/src/core/qgsvectorlayer.h index bd8870498dae..523c1a9d07eb 100644 --- a/src/core/qgsvectorlayer.h +++ b/src/core/qgsvectorlayer.h @@ -767,6 +767,17 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer **/ ValueRelationData &valueRelation( int idx ); + /**is edit widget editable + * @note added in 1.9 + **/ + bool fieldEditable( int idx ); + + /**set edit widget editable + * @note added in 1.9 + **/ + void setFieldEditable( int idx, bool editable ); + + /**Adds a new overlay to this class. QgsVectorLayer takes ownership of the object @note this method was added in version 1.1 */ @@ -1058,6 +1069,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer QStringList mCommitErrors; QMap< QString, EditType > mEditTypes; + QMap< QString, bool> mFieldEditables; QMap< QString, QMap > mValueMaps; QMap< QString, RangeData > mRanges; QMap< QString, QPair > mCheckedStates; diff --git a/src/ui/qgsattributetypeedit.ui b/src/ui/qgsattributetypeedit.ui index 7de2d26a2f4f..cac84967c07a 100644 --- a/src/ui/qgsattributetypeedit.ui +++ b/src/ui/qgsattributetypeedit.ui @@ -6,8 +6,8 @@ 0 0 - 615 - 421 + 620 + 418 @@ -23,7 +23,7 @@ - 12 + 0 @@ -753,6 +753,16 @@ + + + + Editable + + + true + + +