3333#include < QCompleter>
3434#include < QHBoxLayout>
3535#include < QPlainTextEdit>
36+ #include < QDial>
37+ #include < QCalendarWidget>
38+ #include < QDialogButtonBox>
3639
3740void QgsAttributeEditor::selectFileName ( void )
3841{
@@ -55,6 +58,42 @@ void QgsAttributeEditor::selectFileName( void )
5558 le->setText ( fileName );
5659}
5760
61+ void QgsAttributeEditor::selectDate ( void )
62+ {
63+ QPushButton *pb = qobject_cast<QPushButton *>( sender () );
64+ if ( !pb )
65+ return ;
66+
67+ QWidget *hbox = qobject_cast<QWidget *>( pb->parent () );
68+ if ( !hbox )
69+ return ;
70+
71+ QLineEdit *le = hbox->findChild <QLineEdit *>();
72+ if ( !le )
73+ return ;
74+
75+ QDialog *dlg = new QDialog ();
76+ dlg->setWindowTitle ( tr ( " Select a date" ) );
77+ QVBoxLayout *vl = new QVBoxLayout ( dlg );
78+
79+ QCalendarWidget *cw = new QCalendarWidget ( dlg );
80+ cw->setSelectedDate ( QDate::fromString ( le->text (), Qt::ISODate ) );
81+ vl->addWidget ( cw );
82+
83+ QDialogButtonBox *buttonBox = new QDialogButtonBox ( dlg );
84+ buttonBox->addButton ( QDialogButtonBox::Ok );
85+ buttonBox->addButton ( QDialogButtonBox::Cancel );
86+ vl->addWidget ( buttonBox );
87+
88+ connect ( buttonBox, SIGNAL ( accepted () ), dlg, SLOT ( accept () ) );
89+ connect ( buttonBox, SIGNAL ( rejected () ), dlg, SLOT ( reject () ) );
90+
91+ if ( dlg->exec () == QDialog::Accepted )
92+ {
93+ le->setText ( cw->selectedDate ().toString ( Qt::ISODate ) );
94+ }
95+ }
96+
5897QComboBox *QgsAttributeEditor::comboBox ( QWidget *editor, QWidget *parent )
5998{
6099 QComboBox *cb = NULL ;
@@ -180,6 +219,8 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
180219 }
181220 break ;
182221
222+
223+ case QgsVectorLayer::DialRange:
183224 case QgsVectorLayer::SliderRange:
184225 case QgsVectorLayer::EditRange:
185226 {
@@ -208,12 +249,20 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
208249 }
209250 else
210251 {
211- QSlider *sl = NULL ;
252+ QAbstractSlider *sl = NULL ;
212253
213254 if ( editor )
214- sl = qobject_cast<QSlider*>( editor );
255+ {
256+ sl = qobject_cast<QAbstractSlider*>( editor );
257+ }
258+ else if ( editType == QgsVectorLayer::DialRange )
259+ {
260+ sl = new QDial ( parent );
261+ }
215262 else
263+ {
216264 sl = new QSlider ( Qt::Horizontal, parent );
265+ }
217266
218267 if ( sl )
219268 {
@@ -335,6 +384,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
335384 break ;
336385
337386 case QgsVectorLayer::FileName:
387+ case QgsVectorLayer::Calendar:
338388 {
339389 QPushButton *pb = NULL ;
340390 QLineEdit *le = qobject_cast<QLineEdit *>( editor );
@@ -365,18 +415,17 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
365415 }
366416
367417 if ( pb )
368- connect ( pb, SIGNAL ( clicked () ), new QgsAttributeEditor ( pb ), SLOT ( selectFileName () ) );
418+ {
419+ if ( editType == QgsVectorLayer::FileName )
420+ connect ( pb, SIGNAL ( clicked () ), new QgsAttributeEditor ( pb ), SLOT ( selectFileName () ) );
421+ if ( editType == QgsVectorLayer::Calendar )
422+ connect ( pb, SIGNAL ( clicked () ), new QgsAttributeEditor ( pb ), SLOT ( selectDate () ) );
423+ }
369424 }
370425 break ;
371426
372427 case QgsVectorLayer::Immutable:
373428 return NULL ;
374-
375- }
376-
377- if ( editType == QgsVectorLayer::Immutable )
378- {
379- myWidget->setEnabled ( false );
380429 }
381430
382431 setValue ( myWidget, vl, idx, value );
@@ -448,7 +497,7 @@ bool QgsAttributeEditor::retrieveValue( QWidget *widget, QgsVectorLayer *vl, int
448497 text = QString::number ( sb->value () );
449498 }
450499
451- QSlider *slider = qobject_cast<QSlider *>( widget );
500+ QAbstractSlider *slider = qobject_cast<QAbstractSlider *>( widget );
452501 if ( slider )
453502 {
454503 text = QString::number ( slider->value () );
@@ -467,6 +516,12 @@ bool QgsAttributeEditor::retrieveValue( QWidget *widget, QgsVectorLayer *vl, int
467516 text = ckb->isChecked () ? states.first : states.second ;
468517 }
469518
519+ QCalendarWidget *cw = qobject_cast<QCalendarWidget *>( widget );
520+ if ( cw )
521+ {
522+ text = cw->selectedDate ().toString ();
523+ }
524+
470525 le = widget->findChild <QLineEdit *>();
471526 if ( le )
472527 {
@@ -505,6 +560,20 @@ bool QgsAttributeEditor::retrieveValue( QWidget *widget, QgsVectorLayer *vl, int
505560 }
506561 }
507562 break ;
563+ case QVariant::Date:
564+ {
565+ QDate myDateValue = QDate::fromString ( text, Qt::ISODate );
566+ if ( myDateValue.isValid () && !text.isEmpty () )
567+ {
568+ value = myDateValue;
569+ modified = true ;
570+ }
571+ else if ( modified )
572+ {
573+ value = QVariant ( theField.type () );
574+ }
575+ }
576+ break ;
508577 default : // string
509578 modified = true ;
510579 value = QVariant ( text );
@@ -542,6 +611,7 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx,
542611 }
543612 break ;
544613
614+ case QgsVectorLayer::DialRange:
545615 case QgsVectorLayer::SliderRange:
546616 case QgsVectorLayer::EditRange:
547617 {
@@ -556,7 +626,7 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx,
556626 }
557627 else
558628 {
559- QSlider *sl = qobject_cast<QSlider *>( editor );
629+ QAbstractSlider *sl = qobject_cast<QAbstractSlider *>( editor );
560630 if ( sl == NULL )
561631 return false ;
562632 sl->setValue ( value.toInt () );
@@ -615,6 +685,7 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx,
615685 break ;
616686
617687 case QgsVectorLayer::FileName:
688+ case QgsVectorLayer::Calendar:
618689 {
619690 QLineEdit *le = editor->findChild <QLineEdit *>();
620691 if ( le == NULL )
0 commit comments