Skip to content

Commit bdf744e

Browse files
authoredJan 3, 2018
Merge pull request #5960 from 3nids/fix16657
fix date/time widget for field with time zones
2 parents cef2db9 + 69cfdc4 commit bdf744e

File tree

7 files changed

+130
-66
lines changed

7 files changed

+130
-66
lines changed
 

‎python/core/fieldformatter/qgsdatetimefieldformatter.sip

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ the field configuration.
2121
#include "qgsdatetimefieldformatter.h"
2222
%End
2323
public:
24-
static const QString DEFAULT_DATE_FORMAT;
25-
static const QString DEFAULT_TIME_FORMAT;
26-
static const QString DEFAULT_DATETIME_FORMAT;
24+
static const QString DATE_FORMAT;
25+
static const QString TIME_FORMAT;
26+
static const QString DATETIME_FORMAT;
27+
static const QString QT_ISO_FORMAT;
28+
static const QString DISPLAY_FOR_ISO_FORMAT;
2729

2830
QgsDateTimeFieldFormatter();
2931
%Docstring

‎src/core/fieldformatter/qgsdatetimefieldformatter.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@
1919
#include "qgsfield.h"
2020
#include "qgsvectorlayer.h"
2121

22-
const QString QgsDateTimeFieldFormatter::DEFAULT_DATE_FORMAT = QStringLiteral( "yyyy-MM-dd" );
23-
const QString QgsDateTimeFieldFormatter::DEFAULT_TIME_FORMAT = QStringLiteral( "HH:mm:ss" );
24-
const QString QgsDateTimeFieldFormatter::DEFAULT_DATETIME_FORMAT = QStringLiteral( "yyyy-MM-dd HH:mm:ss" );
22+
const QString QgsDateTimeFieldFormatter::DATE_FORMAT = QStringLiteral( "yyyy-MM-dd" );
23+
const QString QgsDateTimeFieldFormatter::TIME_FORMAT = QStringLiteral( "HH:mm:ss" );
24+
const QString QgsDateTimeFieldFormatter::DATETIME_FORMAT = QStringLiteral( "yyyy-MM-dd HH:mm:ss" );
25+
// we need to use Qt::ISODate rather than a string format definition in QDate::fromString
26+
const QString QgsDateTimeFieldFormatter::QT_ISO_FORMAT = QStringLiteral( "Qt ISO Date" );
27+
// but QDateTimeEdit::setDisplayFormat only accepts string formats, so use with time zone by default
28+
const QString QgsDateTimeFieldFormatter::DISPLAY_FOR_ISO_FORMAT = QStringLiteral( "yyyy-MM-dd HH:mm:ss+t" );
2529

2630

2731
QString QgsDateTimeFieldFormatter::id() const
@@ -37,15 +41,23 @@ QString QgsDateTimeFieldFormatter::representValue( QgsVectorLayer *layer, int fi
3741

3842
if ( value.isNull() )
3943
{
40-
QgsSettings settings;
4144
return QgsApplication::nullRepresentation();
4245
}
4346

4447
const QgsField field = layer->fields().at( fieldIndex );
45-
const QString displayFormat = config.value( QStringLiteral( "display_format" ), defaultFormat( field.type() ) ).toString();
48+
const bool fieldIsoFormat = config.value( QStringLiteral( "field_iso_format" ), false ).toBool();
4649
const QString fieldFormat = config.value( QStringLiteral( "field_format" ), defaultFormat( field.type() ) ).toString();
50+
const QString displayFormat = config.value( QStringLiteral( "display_format" ), defaultFormat( field.type() ) ).toString();
4751

48-
QDateTime date = QDateTime::fromString( value.toString(), fieldFormat );
52+
QDateTime date;
53+
if ( fieldIsoFormat )
54+
{
55+
date = QDateTime::fromString( value.toString(), Qt::ISODate );
56+
}
57+
else
58+
{
59+
date = QDateTime::fromString( value.toString(), fieldFormat );
60+
}
4961

5062
if ( date.isValid() )
5163
{
@@ -64,12 +76,12 @@ QString QgsDateTimeFieldFormatter::defaultFormat( QVariant::Type type )
6476
switch ( type )
6577
{
6678
case QVariant::DateTime:
67-
return QgsDateTimeFieldFormatter::DEFAULT_DATETIME_FORMAT;
79+
return QgsDateTimeFieldFormatter::DATETIME_FORMAT;
6880
break;
6981
case QVariant::Time:
70-
return QgsDateTimeFieldFormatter::DEFAULT_TIME_FORMAT;
82+
return QgsDateTimeFieldFormatter::TIME_FORMAT;
7183
break;
7284
default:
73-
return QgsDateTimeFieldFormatter::DEFAULT_DATE_FORMAT;
85+
return QgsDateTimeFieldFormatter::DATE_FORMAT;
7486
}
7587
}

‎src/core/fieldformatter/qgsdatetimefieldformatter.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
class CORE_EXPORT QgsDateTimeFieldFormatter : public QgsFieldFormatter
3131
{
3232
public:
33-
static const QString DEFAULT_DATE_FORMAT;
34-
static const QString DEFAULT_TIME_FORMAT;
35-
static const QString DEFAULT_DATETIME_FORMAT;
33+
static const QString DATE_FORMAT;
34+
static const QString TIME_FORMAT;
35+
static const QString DATETIME_FORMAT;
36+
static const QString QT_ISO_FORMAT;
37+
static const QString DISPLAY_FOR_ISO_FORMAT;
3638

3739
/**
3840
* Default constructor of field formatter for a date time field.

‎src/gui/editorwidgets/qgsdatetimeeditconfig.cpp

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ QgsDateTimeEditConfig::QgsDateTimeEditConfig( QgsVectorLayer *vl, int fieldIdx,
2323
{
2424
setupUi( this );
2525

26+
mFieldFormatComboBox->clear();
27+
mFieldFormatComboBox->addItem( tr( "Date" ), QgsDateTimeFieldFormatter::DATE_FORMAT );
28+
mFieldFormatComboBox->addItem( tr( "Time" ), QgsDateTimeFieldFormatter::TIME_FORMAT );
29+
mFieldFormatComboBox->addItem( tr( "Date time" ), QgsDateTimeFieldFormatter::DATETIME_FORMAT );
30+
mFieldFormatComboBox->addItem( tr( "ISO date time" ), QgsDateTimeFieldFormatter::QT_ISO_FORMAT );
31+
mFieldFormatComboBox->addItem( tr( "Custom" ), QString() );
32+
2633
mDemoDateTimeEdit->setDateTime( QDateTime::currentDateTime() );
2734

2835
connect( mDisplayFormatEdit, &QLineEdit::textChanged, this, &QgsDateTimeEditConfig::updateDemoWidget );
@@ -55,21 +62,16 @@ void QgsDateTimeEditConfig::updateDemoWidget()
5562

5663
void QgsDateTimeEditConfig::updateFieldFormat( int idx )
5764
{
58-
if ( idx == 0 )
59-
{
60-
mFieldFormatEdit->setText( QgsDateTimeFieldFormatter::DEFAULT_DATE_FORMAT );
61-
}
62-
else if ( idx == 1 )
63-
{
64-
mFieldFormatEdit->setText( QgsDateTimeFieldFormatter::DEFAULT_TIME_FORMAT );
65-
}
66-
else if ( idx == 2 )
65+
Q_UNUSED( idx );
66+
const QString format = mFieldFormatComboBox->currentData().toString();
67+
bool custom = format.isEmpty();
68+
if ( !custom )
6769
{
68-
mFieldFormatEdit->setText( QgsDateTimeFieldFormatter::DEFAULT_DATETIME_FORMAT );
70+
mFieldFormatEdit->setText( format );
6971
}
7072

71-
mFieldFormatEdit->setVisible( idx == 3 );
72-
mFieldHelpToolButton->setVisible( idx == 3 );
73+
mFieldFormatEdit->setEnabled( custom );
74+
mFieldHelpToolButton->setVisible( custom );
7375
if ( mFieldHelpToolButton->isHidden() && mDisplayHelpToolButton->isHidden() )
7476
{
7577
mHelpScrollArea->setVisible( false );
@@ -81,20 +83,29 @@ void QgsDateTimeEditConfig::updateDisplayFormat( const QString &fieldFormat )
8183
{
8284
if ( mDisplayFormatComboBox->currentIndex() == 0 )
8385
{
84-
mDisplayFormatEdit->setText( fieldFormat );
86+
// i.e. display format is default
87+
if ( mFieldFormatComboBox->currentData() == QgsDateTimeFieldFormatter::QT_ISO_FORMAT )
88+
{
89+
mDisplayFormatEdit->setText( QgsDateTimeFieldFormatter::DISPLAY_FOR_ISO_FORMAT );
90+
}
91+
else
92+
{
93+
mDisplayFormatEdit->setText( fieldFormat );
94+
}
8595
}
8696
}
8797

8898

8999
void QgsDateTimeEditConfig::displayFormatChanged( int idx )
90100
{
91-
mDisplayFormatEdit->setEnabled( idx == 1 );
92-
mDisplayHelpToolButton->setVisible( idx == 1 );
101+
const bool custom = idx == 1;
102+
mDisplayFormatEdit->setEnabled( custom );
103+
mDisplayHelpToolButton->setVisible( custom );
93104
if ( mFieldHelpToolButton->isHidden() && mDisplayHelpToolButton->isHidden() )
94105
{
95106
mHelpScrollArea->setVisible( false );
96107
}
97-
if ( idx == 0 )
108+
if ( !custom )
98109
{
99110
mDisplayFormatEdit->setText( mFieldFormatEdit->text() );
100111
}
@@ -112,6 +123,7 @@ QVariantMap QgsDateTimeEditConfig::config()
112123
{
113124
QVariantMap myConfig;
114125

126+
myConfig.insert( QStringLiteral( "field_iso_format" ), mFieldFormatEdit->text() == QgsDateTimeFieldFormatter::QT_ISO_FORMAT );
115127
myConfig.insert( QStringLiteral( "field_format" ), mFieldFormatEdit->text() );
116128
myConfig.insert( QStringLiteral( "display_format" ), mDisplayFormatEdit->text() );
117129
myConfig.insert( QStringLiteral( "calendar_popup" ), mCalendarPopupCheckBox->isChecked() );
@@ -126,14 +138,15 @@ void QgsDateTimeEditConfig::setConfig( const QVariantMap &config )
126138
const QString fieldFormat = config.value( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( fieldDef.type() ) ).toString();
127139
mFieldFormatEdit->setText( fieldFormat );
128140

129-
if ( fieldFormat == QgsDateTimeFieldFormatter::DEFAULT_DATE_FORMAT )
130-
mFieldFormatComboBox->setCurrentIndex( 0 );
131-
else if ( fieldFormat == QgsDateTimeFieldFormatter::DEFAULT_TIME_FORMAT )
132-
mFieldFormatComboBox->setCurrentIndex( 1 );
133-
else if ( fieldFormat == QgsDateTimeFieldFormatter::DEFAULT_DATETIME_FORMAT )
134-
mFieldFormatComboBox->setCurrentIndex( 2 );
141+
const int idx = mFieldFormatComboBox->findData( fieldFormat );
142+
if ( idx >= 0 )
143+
{
144+
mFieldFormatComboBox->setCurrentIndex( idx );
145+
}
135146
else
136-
mFieldFormatComboBox->setCurrentIndex( 3 );
147+
{
148+
mFieldFormatComboBox->setCurrentIndex( 4 );
149+
}
137150

138151
QString displayFormat = config.value( QStringLiteral( "display_format" ), QgsDateTimeFieldFormatter::defaultFormat( fieldDef.type() ) ).toString();
139152
mDisplayFormatEdit->setText( displayFormat );

‎src/gui/editorwidgets/qgsdatetimeeditwrapper.cpp

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,16 @@ void QgsDateTimeEditWrapper::showIndeterminateState()
114114

115115
void QgsDateTimeEditWrapper::dateTimeChanged( const QDateTime &dateTime )
116116
{
117+
const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
117118
const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
118-
emit valueChanged( dateTime.toString( fieldFormat ) );
119+
if ( fieldIsoFormat )
120+
{
121+
emit valueChanged( dateTime.toString( Qt::ISODate ) );
122+
}
123+
else
124+
{
125+
emit valueChanged( dateTime.toString( fieldFormat ) );
126+
}
119127
}
120128

121129
QVariant QgsDateTimeEditWrapper::value() const
@@ -135,15 +143,25 @@ QVariant QgsDateTimeEditWrapper::value() const
135143
}
136144
}
137145

146+
const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
138147
const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
139148

149+
QDateTime date;
140150
if ( mQgsDateTimeEdit )
141151
{
142-
return mQgsDateTimeEdit->dateTime().toString( fieldFormat );
152+
date = mQgsDateTimeEdit->dateTime();
143153
}
144154
else
145155
{
146-
return mQDateTimeEdit->dateTime().toString( fieldFormat );
156+
date = mQDateTimeEdit->dateTime();
157+
}
158+
if ( fieldIsoFormat )
159+
{
160+
return date.toString( Qt::ISODate );
161+
}
162+
else
163+
{
164+
return date.toString( fieldFormat );
147165
}
148166
}
149167

@@ -152,8 +170,25 @@ void QgsDateTimeEditWrapper::setValue( const QVariant &value )
152170
if ( !mQDateTimeEdit )
153171
return;
154172

173+
const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
155174
const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
156-
const QDateTime date = field().type() == QVariant::DateTime ? value.toDateTime() : QDateTime::fromString( value.toString(), fieldFormat );
175+
176+
QDateTime date;
177+
if ( field().type() == QVariant::DateTime )
178+
{
179+
date = value.toDateTime();
180+
}
181+
else
182+
{
183+
if ( fieldIsoFormat )
184+
{
185+
date = QDateTime::fromString( value.toString(), Qt::ISODate );
186+
}
187+
else
188+
{
189+
date = QDateTime::fromString( value.toString(), fieldFormat );
190+
}
191+
}
157192

158193
if ( mQgsDateTimeEdit )
159194
{

‎src/gui/editorwidgets/qgsdatetimesearchwidgetwrapper.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,14 @@ QVariant QgsDateTimeSearchWidgetWrapper::value() const
4747
return QDateTime();
4848

4949
const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( layer()->fields().at( mFieldIdx ).type() ) ).toString();
50-
return mDateTimeEdit->dateTime().toString( fieldFormat );
50+
if ( fieldFormat == QgsDateTimeFieldFormatter::QT_ISO_FORMAT )
51+
{
52+
return mDateTimeEdit->dateTime().toString( Qt::ISODate );
53+
}
54+
else
55+
{
56+
return mDateTimeEdit->dateTime().toString( fieldFormat );
57+
}
5158
}
5259

5360
QgsSearchWidgetWrapper::FilterFlags QgsDateTimeSearchWidgetWrapper::supportedFlags() const

‎src/ui/editorwidgets/qgsdatetimeeditconfig.ui

Lines changed: 16 additions & 23 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.