Skip to content

Commit 4c3cf64

Browse files
committed
edit widgets: keep default values of new feature's attributes until they are added
(fixes #12391 & #12386 & #13857) (cherry picked from commit bfb8ab6)
1 parent ae24b08 commit 4c3cf64

File tree

8 files changed

+55
-15
lines changed

8 files changed

+55
-15
lines changed

python/gui/editorwidgets/core/qgseditorwidgetwrapper.sip

+9
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ class QgsEditorWidgetWrapper : QObject
6464
*/
6565
QgsField field();
6666

67+
/**
68+
* Access the default value of the field.
69+
*
70+
* @return the default value of the field
71+
*
72+
* @see layer()
73+
*/
74+
QVariant defaultValue();
75+
6776
/**
6877
* Will return a wrapper for a given widget
6978
* @param widget The widget which was created by a wrapper

python/gui/qgsfieldvalidator.sip

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class QgsFieldValidator : QValidator
66
%End
77

88
public:
9-
QgsFieldValidator( QObject *parent, const QgsField &field, QString dateFormat = "yyyy-MM-dd" );
9+
QgsFieldValidator( QObject *parent, const QgsField &field, QString defaultValue, QString dateFormat = "yyyy-MM-dd" );
1010
~QgsFieldValidator();
1111

1212
virtual State validate(QString & /In,Out/, int & /In,Out/) const = 0 /API=QString:2 - /;

src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "qgseditorwidgetwrapper.h"
1717
#include "qgsvectorlayer.h"
18+
#include "qgsvectordataprovider.h"
1819
#include "qgsfield.h"
1920

2021
#include <QWidget>
@@ -35,6 +36,11 @@ QgsField QgsEditorWidgetWrapper::field()
3536
return layer()->pendingFields()[mFieldIdx];
3637
}
3738

39+
QVariant QgsEditorWidgetWrapper::defaultValue()
40+
{
41+
return layer()->dataProvider()->defaultValue( mFieldIdx );
42+
}
43+
3844
QgsEditorWidgetWrapper* QgsEditorWidgetWrapper::fromWidget( QWidget* widget )
3945
{
4046
return qobject_cast<QgsEditorWidgetWrapper*>( widget->property( "EWV2Wrapper" ).value<QgsWidgetWrapper*>() );

src/gui/editorwidgets/core/qgseditorwidgetwrapper.h

+9
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
8181
*/
8282
QgsField field();
8383

84+
/**
85+
* Access the default value of the field.
86+
*
87+
* @return the default value of the field
88+
*
89+
* @see layer()
90+
*/
91+
QVariant defaultValue();
92+
8493
/**
8594
* Will return a wrapper for a given widget
8695
* @param widget The widget which was created by a wrapper

src/gui/editorwidgets/qgstexteditwrapper.cpp

+14-3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ QVariant QgsTextEditWrapper::value()
5959
v == QSettings().value( "qgis/nullValue", "NULL" ).toString() )
6060
return QVariant( field().type() );
6161

62+
if ( v == defaultValue().toString() )
63+
{
64+
return defaultValue();
65+
}
66+
6267
QVariant res( v );
6368
if ( field().convertCompatible( res ) )
6469
return res;
@@ -99,16 +104,22 @@ void QgsTextEditWrapper::initWidget( QWidget* editor )
99104

100105
if ( mLineEdit )
101106
{
102-
mLineEdit->setValidator( new QgsFieldValidator( mLineEdit, field() ) );
107+
mLineEdit->setValidator( new QgsFieldValidator( mLineEdit, field(), defaultValue().toString() ) );
108+
109+
QVariant defVal = defaultValue();
110+
if ( defVal.isNull() )
111+
{
112+
defVal = QSettings().value( "qgis/nullValue", "NULL" );
113+
}
103114

104115
QgsFilterLineEdit *fle = qobject_cast<QgsFilterLineEdit*>( mLineEdit );
105116
if ( field().type() == QVariant::Int || field().type() == QVariant::Double || field().type() == QVariant::LongLong || field().type() == QVariant::Date )
106117
{
107-
mLineEdit->setPlaceholderText( QSettings().value( "qgis/nullValue", "NULL" ).toString() );
118+
mLineEdit->setPlaceholderText( defVal.toString() );
108119
}
109120
else if ( fle )
110121
{
111-
fle->setNullValue( QSettings().value( "qgis/nullValue", "NULL" ).toString() );
122+
fle->setNullValue( defVal.toString() );
112123
}
113124

114125
connect( mLineEdit, SIGNAL( textChanged( QString ) ), this, SLOT( valueChanged( QString ) ) );

src/gui/qgsfieldvalidator.cpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@
2929
#include "qgslonglongvalidator.h"
3030
#include "qgsfield.h"
3131

32-
QgsFieldValidator::QgsFieldValidator( QObject *parent, const QgsField &field, QString dateFormat )
32+
QgsFieldValidator::QgsFieldValidator( QObject *parent, const QgsField &field, QString defaultValue, QString dateFormat )
3333
: QValidator( parent )
3434
, mField( field )
35+
, mDefaultValue( defaultValue )
3536
, mDateFormat( dateFormat )
3637
{
3738
switch ( mField.type() )
@@ -105,6 +106,9 @@ QValidator::State QgsFieldValidator::validate( QString &s, int &i ) const
105106
return Acceptable;
106107
}
107108

109+
if ( s == mDefaultValue )
110+
return Acceptable;
111+
108112
// delegate to the child validator if any
109113
if ( mValidator )
110114
{
@@ -115,10 +119,10 @@ QValidator::State QgsFieldValidator::validate( QString &s, int &i ) const
115119
{
116120
// allow to enter the NULL representation, which might be
117121
// longer than the actual field
118-
if ( mNullValue.size() > 0 &&
119-
s.size() > 0 &&
120-
s.size() < mNullValue.size() &&
121-
s == mNullValue.left( s.size() ) )
122+
if ( mNullValue.size() > 0 && s.size() > 0 && s.size() < mNullValue.size() && s == mNullValue.left( s.size() ) )
123+
return Intermediate;
124+
125+
if ( mDefaultValue.size() > 0 && s.size() > 0 && s.size() < mDefaultValue.size() && s == mDefaultValue.left( s.size() ) )
122126
return Intermediate;
123127

124128
if ( s == mNullValue )
@@ -146,7 +150,7 @@ void QgsFieldValidator::fixup( QString &s ) const
146150
{
147151
mValidator->fixup( s );
148152
}
149-
else if ( mField.type() == QVariant::String && mField.length() > 0 && s.size() > mField.length() )
153+
else if ( mField.type() == QVariant::String && mField.length() > 0 && s.size() > mField.length() && s != mDefaultValue )
150154
{
151155
// if the value is longer, this must be a partial NULL representation
152156
s = mNullValue;

src/gui/qgsfieldvalidator.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class GUI_EXPORT QgsFieldValidator : public QValidator
3131
Q_OBJECT
3232

3333
public:
34-
QgsFieldValidator( QObject *parent, const QgsField &field, QString dateFormat = "yyyy-MM-dd" );
34+
QgsFieldValidator( QObject *parent, const QgsField &field, QString defaultValue, QString dateFormat = "yyyy-MM-dd" );
3535
~QgsFieldValidator();
3636

3737
virtual State validate( QString &, int & ) const override;
@@ -46,6 +46,7 @@ class GUI_EXPORT QgsFieldValidator : public QValidator
4646
QValidator *mValidator;
4747
QgsField mField;
4848
QString mNullValue;
49+
QString mDefaultValue;
4950
QString mDateFormat;
5051
};
5152

src/providers/postgres/qgspostgresprovider.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -3407,10 +3407,10 @@ QGISEXTERN bool saveStyle( const QString& uri, const QString& qmlStyle, const QS
34073407
{
34083408
res = conn->PQexec( "CREATE TABLE layer_styles("
34093409
"id SERIAL PRIMARY KEY"
3410-
",f_table_catalog varchar(256)"
3411-
",f_table_schema varchar(256)"
3412-
",f_table_name varchar(256)"
3413-
",f_geometry_column varchar(256)"
3410+
",f_table_catalog varchar"
3411+
",f_table_schema varchar"
3412+
",f_table_name varchar"
3413+
",f_geometry_column varchar"
34143414
",styleName varchar(30)"
34153415
",styleQML xml"
34163416
",styleSLD xml"

0 commit comments

Comments
 (0)