Skip to content

Commit 2c4ac08

Browse files
committedMar 13, 2013
[FEATURE] attribute editing extension
- allow resetting of fields to NULL by button - use user defined date formats in forms, identify results and attribute table - add support for date type in postgres provider
1 parent 93e0259 commit 2c4ac08

16 files changed

+207
-41
lines changed
 

‎python/gui/qgsfieldvalidator.sip

Lines changed: 1 addition & 1 deletion
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 );
9+
QgsFieldValidator( QObject *parent, const QgsField &field, QString dateFormat = "yyyy-MM-dd" );
1010
~QgsFieldValidator();
1111

1212
virtual State validate( QString &, int & ) const;

‎src/app/qgsattributetypedialog.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ QgsVectorLayer::ValueRelationData QgsAttributeTypeDialog::valueRelationData()
7979
return mValueRelationData;
8080
}
8181

82+
QString QgsAttributeTypeDialog::dateFormat()
83+
{
84+
return mDateFormat;
85+
}
86+
8287
QMap<QString, QVariant> &QgsAttributeTypeDialog::valueMap()
8388
{
8489
return mValueMap;
@@ -89,7 +94,7 @@ bool QgsAttributeTypeDialog::fieldEditable()
8994
return isFieldEditableCheckBox->isChecked();
9095
}
9196

92-
void QgsAttributeTypeDialog::setFieldEditable(bool editable)
97+
void QgsAttributeTypeDialog::setFieldEditable( bool editable )
9398
{
9499
isFieldEditableCheckBox->setChecked( editable );
95100
}
@@ -338,6 +343,11 @@ void QgsAttributeTypeDialog::setValueRelation( QgsVectorLayer::ValueRelationData
338343
mValueRelationData = valueRelation;
339344
}
340345

346+
void QgsAttributeTypeDialog::setDateFormat( QString dateFormat )
347+
{
348+
mDateFormat = dateFormat;
349+
}
350+
341351
void QgsAttributeTypeDialog::setIndex( int index, QgsVectorLayer::EditType editType )
342352
{
343353
mIndex = index;
@@ -446,6 +456,7 @@ void QgsAttributeTypeDialog::setIndex( int index, QgsVectorLayer::EditType editT
446456
maximumDoubleSpinBox->setValue( mRangeData.mMax.toDouble() );
447457
stepDoubleSpinBox->setValue( mRangeData.mStep.toDouble() );
448458
}
459+
449460
if ( editType == QgsVectorLayer::EditRange )
450461
{
451462
rangeWidget->setCurrentIndex( 0 );
@@ -475,6 +486,10 @@ void QgsAttributeTypeDialog::setIndex( int index, QgsVectorLayer::EditType editT
475486
valueRelationFilterExpression->setText( mValueRelationData.mFilterExpression );
476487
break;
477488

489+
case QgsVectorLayer::Calendar:
490+
leDateFormat->setText( mDateFormat );
491+
break;
492+
478493
case QgsVectorLayer::LineEdit:
479494
case QgsVectorLayer::UniqueValues:
480495
case QgsVectorLayer::Classification:
@@ -484,13 +499,11 @@ void QgsAttributeTypeDialog::setIndex( int index, QgsVectorLayer::EditType editT
484499
case QgsVectorLayer::Immutable:
485500
case QgsVectorLayer::Hidden:
486501
case QgsVectorLayer::TextEdit:
487-
case QgsVectorLayer::Calendar:
488502
case QgsVectorLayer::UuidGenerator:
489503
break;
490504
}
491505
}
492506

493-
494507
void QgsAttributeTypeDialog::setPage( int index )
495508
{
496509
selectionListWidget->setCurrentRow( index );
@@ -639,6 +652,7 @@ void QgsAttributeTypeDialog::accept()
639652
break;
640653
case 11:
641654
mEditType = QgsVectorLayer::Calendar;
655+
mDateFormat = leDateFormat->text();
642656
break;
643657
case 12:
644658
mEditType = QgsVectorLayer::ValueRelation;

‎src/app/qgsattributetypedialog.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ class QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttributeTypeDialog
8282
*/
8383
void setValueRelation( QgsVectorLayer::ValueRelationData valueRelationData );
8484

85+
/**
86+
* Setter to date format
87+
* @param dateFormat date format
88+
*/
89+
void setDateFormat( QString dateFormat );
90+
8591
/**
8692
* Setter for checkbox for editable state of field
8793
* @param bool editable
@@ -111,6 +117,11 @@ class QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttributeTypeDialog
111117
*/
112118
QgsVectorLayer::ValueRelationData valueRelationData();
113119

120+
/**
121+
* Getter for date format
122+
*/
123+
QString dateFormat();
124+
114125
/**
115126
* Getter for checkbox for editable state of field
116127
*/
@@ -181,6 +192,7 @@ class QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttributeTypeDialog
181192
QgsVectorLayer::RangeData mRangeData;
182193
QgsVectorLayer::ValueRelationData mValueRelationData;
183194
QgsVectorLayer::EditType mEditType;
195+
QString mDateFormat;
184196
};
185197

186198
#endif

‎src/app/qgsfieldsproperties.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,8 @@ void QgsFieldsProperties::attributeTypeDialog()
487487
QPair<QString, QString> checkStates = mCheckedStates.value( index, mLayer->checkedState( index ) );
488488
attributeTypeDialog.setCheckedState( checkStates.first, checkStates.second );
489489

490+
attributeTypeDialog.setDateFormat( mLayer->dateFormat( index ) );
491+
490492
attributeTypeDialog.setIndex( index, mEditTypeMap.value( index, mLayer->editType( index ) ) );
491493

492494
attributeTypeDialog.setFieldEditable( mLayer->fieldEditable( index ) );
@@ -517,6 +519,9 @@ void QgsFieldsProperties::attributeTypeDialog()
517519
case QgsVectorLayer::ValueRelation:
518520
mValueRelationData.insert( index, attributeTypeDialog.valueRelationData() );
519521
break;
522+
case QgsVectorLayer::Calendar:
523+
mDateFormat.insert( index, attributeTypeDialog.dateFormat() );
524+
break;
520525
case QgsVectorLayer::LineEdit:
521526
case QgsVectorLayer::TextEdit:
522527
case QgsVectorLayer::UniqueValues:
@@ -526,7 +531,6 @@ void QgsFieldsProperties::attributeTypeDialog()
526531
case QgsVectorLayer::Enumeration:
527532
case QgsVectorLayer::Immutable:
528533
case QgsVectorLayer::Hidden:
529-
case QgsVectorLayer::Calendar:
530534
case QgsVectorLayer::UuidGenerator:
531535
break;
532536
}
@@ -820,7 +824,7 @@ void QgsFieldsProperties::apply()
820824
QgsVectorLayer::EditType editType = editTypeFromButtonText( pb->text() );
821825
mLayer->setEditType( idx, editType );
822826

823-
mLayer->setFieldEditable( idx, mFieldEditables.value( idx, true ));
827+
mLayer->setFieldEditable( idx, mFieldEditables.value( idx, true ) );
824828

825829
switch ( editType )
826830
{
@@ -856,6 +860,13 @@ void QgsFieldsProperties::apply()
856860
}
857861
break;
858862

863+
case QgsVectorLayer::Calendar:
864+
if ( mDateFormat.contains( idx ) )
865+
{
866+
mLayer->dateFormat( idx ) = mDateFormat[idx];
867+
}
868+
break;
869+
859870
case QgsVectorLayer::LineEdit:
860871
case QgsVectorLayer::UniqueValues:
861872
case QgsVectorLayer::UniqueValuesEditable:
@@ -865,7 +876,6 @@ void QgsFieldsProperties::apply()
865876
case QgsVectorLayer::Immutable:
866877
case QgsVectorLayer::Hidden:
867878
case QgsVectorLayer::TextEdit:
868-
case QgsVectorLayer::Calendar:
869879
case QgsVectorLayer::UuidGenerator:
870880
break;
871881
}

‎src/app/qgsfieldsproperties.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ class QgsFieldsProperties : public QWidget, private Ui_QgsFieldsPropertiesBase
130130
QMap<int, QPair<QString, QString> > mCheckedStates;
131131
QMap<int, QgsVectorLayer::EditType> mEditTypeMap;
132132
QMap<int, QPushButton*> mButtonMap;
133+
QMap<int, QString> mDateFormat;
133134

134135
enum attrColumns
135136
{

‎src/app/qgsidentifyresultsdialog.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,11 @@ void QgsIdentifyResultsDialog::addFeature( QgsVectorLayer *vlayer, const QgsFeat
361361
value = vlayer->valueMap( i ).key( value.toString(), QString( "(%1)" ).arg( value.toString() ) );
362362
break;
363363

364+
case QgsVectorLayer::Calendar:
365+
if ( value.canConvert( QVariant::Date ) )
366+
value = value.toDate().toString( vlayer->dateFormat( i ) );
367+
break;
368+
364369
default:
365370
break;
366371
}

‎src/core/qgsvectorlayer.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2678,13 +2678,16 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
26782678
}
26792679
break;
26802680

2681+
case Calendar:
2682+
mDateFormats[ name ] = editTypeElement.attribute( "dateFormat" );
2683+
break;
2684+
26812685
case Classification:
26822686
case FileName:
26832687
case Immutable:
26842688
case Hidden:
26852689
case LineEdit:
26862690
case TextEdit:
2687-
case Calendar:
26882691
case Enumeration:
26892692
case UniqueValues:
26902693
case UniqueValuesEditable:
@@ -2988,14 +2991,17 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
29882991
}
29892992
break;
29902993

2994+
case Calendar:
2995+
editTypeElement.setAttribute( "dateFormat", mDateFormats[ it.key()] );
2996+
break;
2997+
29912998
case LineEdit:
29922999
case UniqueValues:
29933000
case UniqueValuesEditable:
29943001
case Classification:
29953002
case FileName:
29963003
case Hidden:
29973004
case TextEdit:
2998-
case Calendar:
29993005
case Enumeration:
30003006
case Immutable:
30013007
case UuidGenerator:
@@ -3898,6 +3904,18 @@ QgsVectorLayer::RangeData &QgsVectorLayer::range( int idx )
38983904
return mRanges[fieldName];
38993905
}
39003906

3907+
QString &QgsVectorLayer::dateFormat( int idx )
3908+
{
3909+
const QgsFields &fields = pendingFields();
3910+
3911+
QString fieldName = fields[idx].name();
3912+
3913+
if ( !mDateFormats.contains( fieldName ) )
3914+
mDateFormats[fieldName] = "yyyy-MM-dd";
3915+
3916+
return mDateFormats[fieldName];
3917+
}
3918+
39013919
bool QgsVectorLayer::fieldEditable( int idx )
39023920
{
39033921
const QgsFields &fields = pendingFields();

‎src/core/qgsvectorlayer.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,11 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
767767
**/
768768
ValueRelationData &valueRelation( int idx );
769769

770+
/**access date format
771+
* @note added in 1.9
772+
*/
773+
QString &dateFormat( int idx );
774+
770775
/**is edit widget editable
771776
* @note added in 1.9
772777
**/
@@ -1074,6 +1079,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
10741079
QMap< QString, RangeData > mRanges;
10751080
QMap< QString, QPair<QString, QString> > mCheckedStates;
10761081
QMap< QString, ValueRelationData > mValueRelations;
1082+
QMap< QString, QString> mDateFormats;
10771083

10781084
/** Defines the default layout to use for the attribute editor (Drag and drop, UI File, Generated) */
10791085
EditorLayout mEditorLayout;

‎src/gui/attributetable/qgsattributetablemodel.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -643,11 +643,20 @@ QVariant QgsAttributeTableModel::data( const QModelIndex &index, int role ) cons
643643
}
644644
}
645645

646-
if ( role == Qt::DisplayRole && mValueMaps.contains( fieldId ) )
646+
if ( role == Qt::DisplayRole )
647647
{
648-
return mValueMaps[ fieldId ]->key( val.toString(), QString( "(%1)" ).arg( val.toString() ) );
648+
if ( mValueMaps.contains( fieldId ) )
649+
{
650+
return mValueMaps[ fieldId ]->key( val.toString(), QString( "(%1)" ).arg( val.toString() ) );
651+
}
652+
653+
if ( mLayer->editType( fieldId ) == QgsVectorLayer::Calendar && val.canConvert( QVariant::Date ) )
654+
{
655+
return val.toDate().toString( mLayer->dateFormat( fieldId ) );
656+
}
649657
}
650658

659+
651660
return val.toString();
652661
}
653662

‎src/gui/qgsattributeeditor.cpp

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <qgsmaplayerregistry.h>
2727
#include <qgslogger.h>
2828
#include <qgsexpression.h>
29+
#include <qgsfilterlineedit.h>
2930

3031
#include <QScrollArea>
3132
#include <QPushButton>
@@ -87,8 +88,12 @@ void QgsAttributeEditor::selectDate()
8788
dlg->setWindowTitle( tr( "Select a date" ) );
8889
QVBoxLayout *vl = new QVBoxLayout( dlg );
8990

91+
const QgsFieldValidator *v = dynamic_cast<const QgsFieldValidator *>( le->validator() );
92+
QString dateFormat = v ? v->dateFormat() : "yyyy-MM-dd";
93+
9094
QCalendarWidget *cw = new QCalendarWidget( dlg );
91-
cw->setSelectedDate( QDate::fromString( le->text(), Qt::ISODate ) );
95+
QString prevValue = le->text();
96+
cw->setSelectedDate( QDate::fromString( prevValue, dateFormat ) );
9297
vl->addWidget( cw );
9398

9499
QDialogButtonBox *buttonBox = new QDialogButtonBox( dlg );
@@ -101,7 +106,9 @@ void QgsAttributeEditor::selectDate()
101106

102107
if ( dlg->exec() == QDialog::Accepted )
103108
{
104-
le->setText( cw->selectedDate().toString( Qt::ISODate ) );
109+
QString newValue = cw->selectedDate().toString( dateFormat );
110+
le->setText( newValue );
111+
le->setModified( newValue != prevValue );
105112
}
106113
}
107114

@@ -483,7 +490,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
483490
}
484491
else
485492
{
486-
le = new QLineEdit( parent );
493+
le = new QgsFilterLineEdit( parent );
487494
}
488495

489496
if ( le )
@@ -507,7 +514,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
507514
le->setReadOnly( true );
508515
}
509516

510-
le->setValidator( new QgsFieldValidator( le, field ) );
517+
le->setValidator( new QgsFieldValidator( le, field, vl->dateFormat( idx ) ) );
511518

512519
myWidget = le;
513520
}
@@ -526,13 +533,13 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
526533
if ( cb )
527534
{
528535
if ( cb->isEditable() )
529-
cb->setValidator( new QgsFieldValidator( cb, field ) );
536+
cb->setValidator( new QgsFieldValidator( cb, field, vl->dateFormat( idx ) ) );
530537
myWidget = cb;
531538
}
532539

533540
if ( myWidget )
534541
{
535-
if (editType == QgsVectorLayer::Immutable)
542+
if ( editType == QgsVectorLayer::Immutable )
536543
myWidget->setDisabled( true );
537544

538545
QgsStringRelay* relay = NULL;
@@ -611,7 +618,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
611618
}
612619
else
613620
{
614-
le = new QLineEdit();
621+
le = new QgsFilterLineEdit();
615622

616623
pb = new QPushButton( tr( "..." ) );
617624

@@ -625,6 +632,9 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
625632
myWidget->setLayout( hbl );
626633
}
627634

635+
if ( le )
636+
le->setValidator( new QgsFieldValidator( le, field, vl->dateFormat( idx ) ) );
637+
628638
if ( pb )
629639
{
630640
if ( editType == QgsVectorLayer::FileName )
@@ -783,7 +793,7 @@ bool QgsAttributeEditor::retrieveValue( QWidget *widget, QgsVectorLayer *vl, int
783793
QCalendarWidget *cw = qobject_cast<QCalendarWidget *>( widget );
784794
if ( cw )
785795
{
786-
text = cw->selectedDate().toString( Qt::ISODate );
796+
text = cw->selectedDate().toString( vl->dateFormat( idx ) );
787797
}
788798

789799
le = widget->findChild<QLineEdit *>();
@@ -792,6 +802,11 @@ bool QgsAttributeEditor::retrieveValue( QWidget *widget, QgsVectorLayer *vl, int
792802
if ( !cw && !gb && le )
793803
{
794804
text = le->text();
805+
modified = le->isModified();
806+
if ( text == nullValue )
807+
{
808+
text = QString::null;
809+
}
795810
}
796811

797812
switch ( theField.type() )
@@ -842,7 +857,7 @@ bool QgsAttributeEditor::retrieveValue( QWidget *widget, QgsVectorLayer *vl, int
842857
break;
843858
case QVariant::Date:
844859
{
845-
QDate myDateValue = QDate::fromString( text, Qt::ISODate );
860+
QDate myDateValue = QDate::fromString( text, vl->dateFormat( idx ) );
846861
if ( myDateValue.isValid() && !text.isEmpty() )
847862
{
848863
value = myDateValue;
@@ -856,7 +871,10 @@ bool QgsAttributeEditor::retrieveValue( QWidget *widget, QgsVectorLayer *vl, int
856871
break;
857872
default: //string
858873
modified = true;
859-
value = QVariant( text );
874+
if ( text.isNull() )
875+
value = QVariant();
876+
else
877+
value = QVariant( text );
860878
break;
861879
}
862880

@@ -957,19 +975,25 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx,
957975
case QgsVectorLayer::UniqueValuesEditable:
958976
case QgsVectorLayer::Immutable:
959977
case QgsVectorLayer::UuidGenerator:
960-
default:
978+
case QgsVectorLayer::TextEdit:
961979
{
980+
QgsFilterLineEdit *fle = qobject_cast<QgsFilterLineEdit *>( editor );
962981
QLineEdit *le = qobject_cast<QLineEdit *>( editor );
963982
QComboBox *cb = qobject_cast<QComboBox *>( editor );
964983
QTextEdit *te = qobject_cast<QTextEdit *>( editor );
965984
QPlainTextEdit *pte = qobject_cast<QPlainTextEdit *>( editor );
966985
if ( !le && ! cb && !te && !pte )
967986
return false;
968987

988+
if ( fle && !( myFieldType == QVariant::Int || myFieldType == QVariant::Double || myFieldType == QVariant::LongLong || myFieldType == QVariant::Date ) )
989+
{
990+
fle->setNullValue( nullValue );
991+
}
992+
969993
QString text;
970994
if ( value.isNull() )
971995
{
972-
if ( myFieldType == QVariant::Int || myFieldType == QVariant::Double || myFieldType == QVariant::LongLong )
996+
if ( myFieldType == QVariant::Int || myFieldType == QVariant::Double || myFieldType == QVariant::LongLong || myFieldType == QVariant::Date )
973997
text = "";
974998
else if ( editType == QgsVectorLayer::UuidGenerator )
975999
text = QUuid::createUuid().toString();
@@ -1002,18 +1026,47 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx,
10021026
break;
10031027
}
10041028

1005-
QLineEdit* le = qobject_cast<QLineEdit*>( editor );
1029+
QgsFilterLineEdit *fle = qobject_cast<QgsFilterLineEdit*>( editor );
1030+
QLineEdit *le = qobject_cast<QLineEdit*>( editor );
10061031
if ( !le )
10071032
{
10081033
le = editor->findChild<QLineEdit *>();
1034+
fle = qobject_cast<QgsFilterLineEdit *>( le );
10091035
}
10101036
if ( !le )
10111037
{
10121038
return false;
10131039
}
1014-
le->setText( value.toString() );
1040+
1041+
if ( fle && !( myFieldType == QVariant::Int || myFieldType == QVariant::Double || myFieldType == QVariant::LongLong || myFieldType == QVariant::Date ) )
1042+
{
1043+
fle->setNullValue( nullValue );
1044+
}
1045+
1046+
QString text;
1047+
if ( value.isNull() )
1048+
{
1049+
if ( myFieldType == QVariant::Int || myFieldType == QVariant::Double || myFieldType == QVariant::LongLong || myFieldType == QVariant::Date )
1050+
text = "";
1051+
else
1052+
text = nullValue;
1053+
}
1054+
else if ( editType == QgsVectorLayer::Calendar && value.canConvert( QVariant::Date ) )
1055+
{
1056+
text = value.toDate().toString( vl->dateFormat( idx ) );
1057+
}
1058+
else
1059+
{
1060+
text = value.toString();
1061+
}
1062+
1063+
1064+
le->setText( text );
10151065
}
10161066
break;
1067+
1068+
case QgsVectorLayer::Hidden:
1069+
break;
10171070
}
10181071

10191072
return true;
@@ -1030,7 +1083,6 @@ QWidget* QgsAttributeEditor::createWidgetFromDef( const QgsAttributeEditorElemen
10301083
const QgsAttributeEditorField* fieldDef = dynamic_cast<const QgsAttributeEditorField*>( widgetDef );
10311084
newWidget = createAttributeEditor( parent, 0, vl, fieldDef->idx(), attrs.value( fieldDef->idx(), QVariant() ), proxyWidgets );
10321085

1033-
10341086
if ( vl->editType( fieldDef->idx() ) != QgsVectorLayer::Immutable )
10351087
{
10361088
newWidget->setEnabled( newWidget->isEnabled() && vl->isEditable() );

‎src/gui/qgsfieldvalidator.cpp

Lines changed: 3 additions & 2 deletions
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 )
32+
QgsFieldValidator::QgsFieldValidator( QObject *parent, const QgsField &field, QString dateFormat )
3333
: QValidator( parent )
3434
, mField( field )
35+
, mDateFormat( dateFormat )
3536
{
3637
switch ( mField.type() )
3738
{
@@ -128,7 +129,7 @@ QValidator::State QgsFieldValidator::validate( QString &s, int &i ) const
128129
}
129130
else if ( mField.type() == QVariant::Date )
130131
{
131-
return QDate::fromString( s ).isValid() ? Acceptable : Intermediate;
132+
return QDate::fromString( s, mDateFormat ).isValid() ? Acceptable : Intermediate;
132133
}
133134
else
134135
{

‎src/gui/qgsfieldvalidator.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,22 @@ class GUI_EXPORT QgsFieldValidator : public QValidator
3131
Q_OBJECT
3232

3333
public:
34-
QgsFieldValidator( QObject *parent, const QgsField &field );
34+
QgsFieldValidator( QObject *parent, const QgsField &field, QString dateFormat );
3535
~QgsFieldValidator();
3636

3737
virtual State validate( QString &, int & ) const;
3838
virtual void fixup( QString & ) const;
3939

40+
QString dateFormat() const { return mDateFormat; }
41+
4042
private:
4143
// Disables copy constructing
4244
Q_DISABLE_COPY( QgsFieldValidator )
4345

4446
QValidator *mValidator;
4547
QgsField mField;
4648
QString mNullValue;
49+
QString mDateFormat;
4750
};
4851

4952
#endif // QGSFIELDVALIDATOR_H

‎src/gui/qgsfilterlineedit.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
#include <QToolButton>
2222
#include <QStyle>
2323

24-
QgsFilterLineEdit::QgsFilterLineEdit( QWidget* parent ) : QLineEdit( parent )
24+
QgsFilterLineEdit::QgsFilterLineEdit( QWidget* parent, QString nullValue )
25+
: QLineEdit( parent )
26+
, mNullValue( nullValue )
2527
{
2628
btnClear = new QToolButton( this );
2729
btnClear->setIcon( QgsApplication::getThemeIcon( "/mIconClear.png" ) );
@@ -51,7 +53,13 @@ void QgsFilterLineEdit::resizeEvent( QResizeEvent * )
5153
( rect().bottom() + 1 - sz.height() ) / 2 );
5254
}
5355

56+
void QgsFilterLineEdit::clear()
57+
{
58+
setText( mNullValue );
59+
setModified( true );
60+
}
61+
5462
void QgsFilterLineEdit::toggleClearButton( const QString &text )
5563
{
56-
btnClear->setVisible( !text.isEmpty() );
64+
btnClear->setVisible( !isReadOnly() && text != mNullValue );
5765
}

‎src/gui/qgsfilterlineedit.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ class GUI_EXPORT QgsFilterLineEdit : public QLineEdit
2929
{
3030
Q_OBJECT
3131
public:
32-
QgsFilterLineEdit( QWidget* parent = 0 );
32+
QgsFilterLineEdit( QWidget* parent = 0, QString nullValue = QString::null );
33+
34+
void setNullValue( QString nullValue ) { mNullValue = nullValue; }
3335

3436
signals:
3537
void cleared();
@@ -38,9 +40,11 @@ class GUI_EXPORT QgsFilterLineEdit : public QLineEdit
3840
void resizeEvent( QResizeEvent * );
3941

4042
private slots:
43+
void clear();
4144
void toggleClearButton( const QString &text );
4245

4346
private:
47+
QString mNullValue;
4448
QToolButton *btnClear;
4549
};
4650

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,9 @@ QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
168168
<< QgsVectorDataProvider::NativeType( tr( "Text, fixed length (char)" ), "char", QVariant::String, 1, 255 )
169169
<< QgsVectorDataProvider::NativeType( tr( "Text, limited variable length (varchar)" ), "varchar", QVariant::String, 1, 255 )
170170
<< QgsVectorDataProvider::NativeType( tr( "Text, unlimited length (text)" ), "text", QVariant::String )
171+
172+
// date type
173+
<< QgsVectorDataProvider::NativeType( tr( "Date" ), "date", QVariant::Date )
171174
;
172175

173176
QString key;
@@ -708,6 +711,11 @@ bool QgsPostgresProvider::loadFields()
708711
fieldSize = -1;
709712
}
710713
}
714+
else if ( fieldTypeName == "date" )
715+
{
716+
fieldType = QVariant::Date;
717+
fieldSize = -1;
718+
}
711719
else if ( fieldTypeName == "text" ||
712720
fieldTypeName == "bpchar" ||
713721
fieldTypeName == "bool" ||
@@ -2777,6 +2785,11 @@ bool QgsPostgresProvider::convertField( QgsField &field )
27772785
fieldPrec = 0;
27782786
break;
27792787

2788+
case QVariant::Date:
2789+
fieldType = "numeric";
2790+
fieldSize = -1;
2791+
break;
2792+
27802793
case QVariant::Double:
27812794
if ( fieldSize > 18 )
27822795
{

‎src/ui/qgsattributetypeedit.ui

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -504,15 +504,8 @@
504504
</layout>
505505
</widget>
506506
<widget class="QWidget" name="calendarPage">
507-
<layout class="QVBoxLayout" name="verticalLayout_6">
508-
<item>
509-
<widget class="QLabel" name="label_4">
510-
<property name="text">
511-
<string>A calendar widget to enter a date.</string>
512-
</property>
513-
</widget>
514-
</item>
515-
<item>
507+
<layout class="QGridLayout" name="gridLayout_5">
508+
<item row="3" column="1">
516509
<spacer name="verticalSpacer_9">
517510
<property name="orientation">
518511
<enum>Qt::Vertical</enum>
@@ -525,6 +518,23 @@
525518
</property>
526519
</spacer>
527520
</item>
521+
<item row="2" column="0">
522+
<widget class="QLabel" name="label_10">
523+
<property name="text">
524+
<string>Date format</string>
525+
</property>
526+
</widget>
527+
</item>
528+
<item row="0" column="0" colspan="2">
529+
<widget class="QLabel" name="label_4">
530+
<property name="text">
531+
<string>A calendar widget to enter a date.</string>
532+
</property>
533+
</widget>
534+
</item>
535+
<item row="2" column="1">
536+
<widget class="QLineEdit" name="leDateFormat"/>
537+
</item>
528538
</layout>
529539
</widget>
530540
<widget class="QWidget" name="valueRelationPage">

0 commit comments

Comments
 (0)
Please sign in to comment.