From 174d112da889e2301306bc298bfe9c4c1fc6c9a5 Mon Sep 17 00:00:00 2001 From: "Juergen E. Fischer" Date: Thu, 30 Jun 2016 21:52:16 +0200 Subject: [PATCH] * initialize pasted feature with default values (fixes #8800) * show default values of new features in attribute table and identify results --- src/app/qgisapp.cpp | 14 ++++++++++++-- src/app/qgsidentifyresultsdialog.cpp | 7 ++++++- .../editorwidgets/core/qgseditorwidgetfactory.cpp | 7 ++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 10fbb549aead..5ca58d2d8089 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -7379,16 +7379,26 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer ) QgsAttributes srcAttr = featureIt->attributes(); QgsAttributes dstAttr( dstAttrCount ); + // pre-initialized with default values + for ( int dst = 0; dst < dstAttr.count(); ++dst ) + { + QVariant defVal( pasteVectorLayer->dataProvider()->defaultValue( dst ) ); + if( !defVal.isNull() ) + { + dstAttr[ dst ] = defVal; + } + } + for ( int src = 0; src < srcAttr.count(); ++src ) { int dst = remap.value( src, -1 ); if ( dst < 0 ) continue; - // use default value for primary key fields if it's NOT NULL + // don't overwrite default value for primary key fields if it's NOT NULL + // or for spatialite layers if ( pkAttrList.contains( dst ) ) { - dstAttr[ dst ] = pasteVectorLayer->dataProvider()->defaultValue( dst ); if ( !dstAttr.at( dst ).isNull() ) continue; else if ( pasteVectorLayer->providerType() == "spatialite" ) diff --git a/src/app/qgsidentifyresultsdialog.cpp b/src/app/qgsidentifyresultsdialog.cpp index 291395c57466..9b24011bf3fa 100644 --- a/src/app/qgsidentifyresultsdialog.cpp +++ b/src/app/qgsidentifyresultsdialog.cpp @@ -34,6 +34,7 @@ #include "qgsproject.h" #include "qgsrasterlayer.h" #include "qgsvectorlayer.h" +#include "qgsvectordataprovider.h" #include "qgswebview.h" #include "qgswebframe.h" @@ -470,7 +471,11 @@ void QgsIdentifyResultsDialog::addFeature( QgsVectorLayer *vlayer, const QgsFeat if ( i >= fields.count() ) continue; - QString value = fields.at( i ).displayString( attrs.at( i ) ); + QString defVal; + if ( fields.fieldOrigin( i ) == QgsFields::OriginProvider && vlayer->dataProvider() ) + defVal = vlayer->dataProvider()->defaultValue( fields.fieldOriginIndex( i ) ).toString(); + + QString value = defVal == attrs.at( i ) ? defVal : fields.at( i ).displayString( attrs.at( i ) ); QTreeWidgetItem *attrItem = new QTreeWidgetItem( QStringList() << QString::number( i ) << value ); attrItem->setData( 0, Qt::DisplayRole, vlayer->attributeDisplayName( i ) ); diff --git a/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp b/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp index cf2c064ac702..a57afa33b3bb 100644 --- a/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp +++ b/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp @@ -17,6 +17,7 @@ #include "qgsdefaultsearchwidgetwrapper.h" #include "qgssearchwidgetwrapper.h" #include "qgsfield.h" +#include "qgsvectordataprovider.h" #include @@ -67,7 +68,11 @@ QString QgsEditorWidgetFactory::representValue( QgsVectorLayer* vl, int fieldIdx Q_UNUSED( cache ) Q_UNUSED( value ) - return vl->fields().at( fieldIdx ).displayString( value ); + QString defVal; + if ( vl->fields().fieldOrigin( fieldIdx ) == QgsFields::OriginProvider && vl->dataProvider() ) + defVal = vl->dataProvider()->defaultValue( vl->fields().fieldOriginIndex( fieldIdx ) ).toString(); + + return value == defVal ? defVal : vl->fields().at( fieldIdx ).displayString( value ); } Qt::AlignmentFlag QgsEditorWidgetFactory::alignmentFlag( QgsVectorLayer* vl, int fieldIdx, const QgsEditorWidgetConfig& config ) const