Skip to content

Commit ff70d13

Browse files
committed
fix date/time widget does not handle time zones
issue #16657 manually picked from QGIS3 bdf744e
1 parent d4365a1 commit ff70d13

File tree

5 files changed

+94
-51
lines changed

5 files changed

+94
-51
lines changed

src/gui/editorwidgets/qgsdatetimeeditconfig.cpp

+36-23
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ QgsDateTimeEditConfig::QgsDateTimeEditConfig( QgsVectorLayer* vl, int fieldIdx,
2121
{
2222
setupUi( this );
2323

24+
mFieldFormatComboBox->clear();
25+
mFieldFormatComboBox->addItem( tr( "Date" ), QGSDATETIMEEDIT_DATEFORMAT );
26+
mFieldFormatComboBox->addItem( tr( "Time" ), QGSDATETIMEEDIT_TIMEFORMAT );
27+
mFieldFormatComboBox->addItem( tr( "Date time" ), QGSDATETIMEEDIT_DATETIMEFORMAT );
28+
mFieldFormatComboBox->addItem( tr( "ISO date time" ), QGSDATETIMEEDIT_ISODATETIMEFORMAT );
29+
mFieldFormatComboBox->addItem( tr( "Custom" ), QString() );
30+
2431
mDemoDateTimeEdit->setDateTime( QDateTime::currentDateTime() );
2532

2633
connect( mDisplayFormatEdit, SIGNAL( textChanged( QString ) ), this, SLOT( updateDemoWidget() ) );
@@ -53,46 +60,50 @@ void QgsDateTimeEditConfig::updateDemoWidget()
5360

5461
void QgsDateTimeEditConfig::updateFieldFormat( int idx )
5562
{
56-
if ( idx == 0 )
57-
{
58-
mFieldFormatEdit->setText( QGSDATETIMEEDIT_DATEFORMAT );
59-
}
60-
else if ( idx == 1 )
61-
{
62-
mFieldFormatEdit->setText( QGSDATETIMEEDIT_TIMEFORMAT );
63-
}
64-
else if ( idx == 2 )
63+
const QString format = mFieldFormatComboBox->itemData( idx ).toString();
64+
bool custom = format.isEmpty();
65+
if ( !custom )
6566
{
66-
mFieldFormatEdit->setText( QGSDATETIMEEDIT_DATETIMEFORMAT );
67+
mFieldFormatEdit->setText( format );
6768
}
6869

69-
mFieldFormatEdit->setVisible( idx == 3 );
70-
mFieldHelpToolButton->setVisible( idx == 3 );
70+
mFieldFormatEdit->setEnabled( custom );
71+
mFieldHelpToolButton->setVisible( custom );
7172
if ( mFieldHelpToolButton->isHidden() && mDisplayHelpToolButton->isHidden() )
7273
{
7374
mHelpScrollArea->setVisible( false );
7475
}
7576
}
7677

7778

79+
7880
void QgsDateTimeEditConfig::updateDisplayFormat( const QString& fieldFormat )
7981
{
8082
if ( mDisplayFormatComboBox->currentIndex() == 0 )
8183
{
82-
mDisplayFormatEdit->setText( fieldFormat );
84+
// i.e. display format is default
85+
if ( mFieldFormatComboBox->itemData( mFieldFormatComboBox->currentIndex() ) == QGSDATETIMEEDIT_ISODATETIMEFORMAT )
86+
{
87+
mDisplayFormatEdit->setText( QGSDATETIMEEDIT_ISODISPLAYFORMAT );
88+
}
89+
else
90+
{
91+
mDisplayFormatEdit->setText( fieldFormat );
92+
}
8393
}
8494
}
8595

8696

8797
void QgsDateTimeEditConfig::displayFormatChanged( int idx )
8898
{
89-
mDisplayFormatEdit->setEnabled( idx == 1 );
90-
mDisplayHelpToolButton->setVisible( idx == 1 );
99+
const bool custom = idx == 1;
100+
mDisplayFormatEdit->setEnabled( custom );
101+
mDisplayHelpToolButton->setVisible( custom );
91102
if ( mFieldHelpToolButton->isHidden() && mDisplayHelpToolButton->isHidden() )
92103
{
93104
mHelpScrollArea->setVisible( false );
94105
}
95-
if ( idx == 0 )
106+
if ( !custom )
96107
{
97108
mDisplayFormatEdit->setText( mFieldFormatEdit->text() );
98109
}
@@ -110,6 +121,7 @@ QgsEditorWidgetConfig QgsDateTimeEditConfig::config()
110121
{
111122
QgsEditorWidgetConfig myConfig;
112123

124+
myConfig.insert( "field_iso_format", mFieldFormatEdit->text() == QGSDATETIMEEDIT_ISODATETIMEFORMAT );
113125
myConfig.insert( "field_format", mFieldFormatEdit->text() );
114126
myConfig.insert( "display_format", mDisplayFormatEdit->text() );
115127
myConfig.insert( "calendar_popup", mCalendarPopupCheckBox->isChecked() );
@@ -126,14 +138,15 @@ void QgsDateTimeEditConfig::setConfig( const QgsEditorWidgetConfig &config )
126138
const QString fieldFormat = config[ "field_format" ].toString();
127139
mFieldFormatEdit->setText( fieldFormat );
128140

129-
if ( fieldFormat == QGSDATETIMEEDIT_DATEFORMAT )
130-
mFieldFormatComboBox->setCurrentIndex( 0 );
131-
else if ( fieldFormat == QGSDATETIMEEDIT_TIMEFORMAT )
132-
mFieldFormatComboBox->setCurrentIndex( 1 );
133-
else if ( fieldFormat == QGSDATETIMEEDIT_DATETIMEFORMAT )
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

139152
if ( config.contains( "display_format" ) )

src/gui/editorwidgets/qgsdatetimeeditfactory.h

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
#define QGSDATETIMEEDIT_DATEFORMAT "yyyy-MM-dd"
2222
#define QGSDATETIMEEDIT_TIMEFORMAT "HH:mm:ss"
2323
#define QGSDATETIMEEDIT_DATETIMEFORMAT "yyyy-MM-dd HH:mm:ss"
24+
#define QGSDATETIMEEDIT_ISODATETIMEFORMAT "Qt ISO Date"
25+
#define QGSDATETIMEEDIT_ISODISPLAYFORMAT "yyyy-MM-dd HH:mm:ss+t"
26+
2427

2528
/** \ingroup gui
2629
* \class QgsDateTimeEditFactory

src/gui/editorwidgets/qgsdatetimeeditwrapper.cpp

+40-5
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,16 @@ void QgsDateTimeEditWrapper::showIndeterminateState()
113113

114114
void QgsDateTimeEditWrapper::dateTimeChanged( const QDateTime& dateTime )
115115
{
116-
const QString fieldFormat = config( "field_format", QGSDATETIMEEDIT_DATEFORMAT ).toString();
117-
emit valueChanged( dateTime.toString( fieldFormat ) );
116+
const bool fieldIsoFormat = config( "field_iso_format" , false ).toBool();
117+
const QString fieldFormat = config( "field_format" , QGSDATETIMEEDIT_DATEFORMAT ).toString();
118+
if ( fieldIsoFormat )
119+
{
120+
emit valueChanged( dateTime.toString( Qt::ISODate ) );
121+
}
122+
else
123+
{
124+
emit valueChanged( dateTime.toString( fieldFormat ) );
125+
}
118126
}
119127

120128
QVariant QgsDateTimeEditWrapper::value() const
@@ -134,15 +142,25 @@ QVariant QgsDateTimeEditWrapper::value() const
134142
}
135143
}
136144

145+
const bool fieldIsoFormat = config( "field_iso_format", false ).toBool();
137146
const QString fieldFormat = config( "field_format", QGSDATETIMEEDIT_DATEFORMAT ).toString();
138147

148+
QDateTime date;
139149
if ( mQgsDateTimeEdit )
140150
{
141-
return mQgsDateTimeEdit->dateTime().toString( fieldFormat );
151+
date = mQgsDateTimeEdit->dateTime();
142152
}
143153
else
144154
{
145-
return mQDateTimeEdit->dateTime().toString( fieldFormat );
155+
date = mQDateTimeEdit->dateTime();
156+
}
157+
if ( fieldIsoFormat )
158+
{
159+
return date.toString( Qt::ISODate );
160+
}
161+
else
162+
{
163+
return date.toString( fieldFormat );
146164
}
147165
}
148166

@@ -151,8 +169,25 @@ void QgsDateTimeEditWrapper::setValue( const QVariant &value )
151169
if ( !mQDateTimeEdit )
152170
return;
153171

172+
const bool fieldIsoFormat = config( "field_iso_format", false ).toBool();
154173
const QString fieldFormat = config( "field_format", QGSDATETIMEEDIT_DATEFORMAT ).toString();
155-
const QDateTime date = field().type() == QVariant::DateTime ? value.toDateTime() : QDateTime::fromString( value.toString(), fieldFormat );
174+
175+
QDateTime date;
176+
if ( field().type() == QVariant::DateTime )
177+
{
178+
date = value.toDateTime();
179+
}
180+
else
181+
{
182+
if ( fieldIsoFormat )
183+
{
184+
date = QDateTime::fromString( value.toString(), Qt::ISODate );
185+
}
186+
else
187+
{
188+
date = QDateTime::fromString( value.toString(), fieldFormat );
189+
}
190+
}
156191

157192
if ( mQgsDateTimeEdit )
158193
{

src/gui/editorwidgets/qgsdatetimesearchwidgetwrapper.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,17 @@ QVariant QgsDateTimeSearchWidgetWrapper::value() const
4545
if ( ! mDateTimeEdit )
4646
return QDateTime();
4747

48+
const bool fieldIsoFormat = config( "field_iso_format", false ).toBool();
4849
const QString fieldFormat = config( "field_format", QGSDATETIMEEDIT_DATEFORMAT ).toString();
49-
return mDateTimeEdit->dateTime().toString( fieldFormat );
50+
51+
if ( fieldIsoFormat )
52+
{
53+
return mDateTimeEdit->dateTime().toString( Qt::ISODate );
54+
}
55+
else
56+
{
57+
return mDateTimeEdit->dateTime().toString( fieldFormat );
58+
}
5059
}
5160

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

src/ui/editorwidgets/qgsdatetimeeditconfig.ui

+5-22
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
<rect>
2525
<x>0</x>
2626
<y>0</y>
27-
<width>468</width>
28-
<height>1033</height>
27+
<width>478</width>
28+
<height>971</height>
2929
</rect>
3030
</property>
3131
<layout class="QGridLayout" name="gridLayout_5">
@@ -80,26 +80,6 @@
8080
<height>0</height>
8181
</size>
8282
</property>
83-
<item>
84-
<property name="text">
85-
<string>Date</string>
86-
</property>
87-
</item>
88-
<item>
89-
<property name="text">
90-
<string>Time</string>
91-
</property>
92-
</item>
93-
<item>
94-
<property name="text">
95-
<string>Date &amp; time</string>
96-
</property>
97-
</item>
98-
<item>
99-
<property name="text">
100-
<string>Custom format</string>
101-
</property>
102-
</item>
10383
</widget>
10484
</item>
10585
<item row="0" column="1">
@@ -250,6 +230,9 @@
250230
</widget>
251231
<resources>
252232
<include location="../../../images/images.qrc"/>
233+
<include location="../../../images/images.qrc"/>
234+
<include location="../../../images/images.qrc"/>
235+
<include location="../../../images/images.qrc"/>
253236
</resources>
254237
<connections/>
255238
</ui>

0 commit comments

Comments
 (0)