QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgsdatetimeeditwrapper.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsdatetimeeditwrapper.cpp
3 --------------------------------------
4 Date : 03.2014
5 Copyright : (C) 2014 Denis Rouzaud
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgsapplication.h"
19#include "qgsdatetimeedit.h"
23#include "qgslogger.h"
24#include "qgsmessagelog.h"
25
26#include <QCalendarWidget>
27#include <QDateEdit>
28#include <QDateTimeEdit>
29#include <QString>
30#include <QTextCharFormat>
31#include <QTimeEdit>
32
33#include "moc_qgsdatetimeeditwrapper.cpp"
34
35using namespace Qt::StringLiterals;
36
38 : QgsEditorWidgetWrapper( layer, fieldIdx, editor, parent )
39
40{
41}
42
43QWidget *QgsDateTimeEditWrapper::createWidget( QWidget *parent )
44{
45 QgsDateTimeEdit *widget = new QgsDateTimeEdit( parent );
46 widget->setDateTime( QDateTime::currentDateTime() );
47 return widget;
48}
49
51{
52 QgsDateTimeEdit *qgsEditor = dynamic_cast<QgsDateTimeEdit *>( editor );
53 if ( qgsEditor )
54 {
55 mQgsDateTimeEdit = qgsEditor;
56 }
57 // assign the Qt editor also if the QGIS editor has been previously assigned
58 // this avoids testing each time which widget to use
59 // the QGIS editor must be used for non-virtual methods (dateTime, setDateTime)
60 QDateTimeEdit *qtEditor = dynamic_cast<QDateTimeEdit *>( editor );
61 if ( qtEditor )
62 {
63 mQDateTimeEdit = qtEditor;
64 }
65
66 if ( !mQDateTimeEdit )
67 {
68 QgsDebugError( u"Date/time edit widget could not be initialized because provided widget is not a QDateTimeEdit."_s );
69 QgsMessageLog::logMessage( tr( "Date/time edit widget could not be initialized because provided widget is not a QDateTimeEdit." ), tr( "UI forms" ), Qgis::MessageLevel::Warning );
70 return;
71 }
72
73 const QString displayFormat = config( u"display_format"_s, QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
74 mQDateTimeEdit->setDisplayFormat( displayFormat );
75
76 const bool calendar = config( u"calendar_popup"_s, true ).toBool();
77 if ( calendar != mQDateTimeEdit->calendarPopup() )
78 {
79 mQDateTimeEdit->setCalendarPopup( calendar );
80 }
81 if ( calendar && mQDateTimeEdit->calendarWidget() )
82 {
83 // highlight today's date
84 QTextCharFormat todayFormat;
85 todayFormat.setBackground( QColor( 160, 180, 200 ) );
86 mQDateTimeEdit->calendarWidget()->setDateTextFormat( QDate::currentDate(), todayFormat );
87 }
88
89 const bool allowNull = config( u"allow_null"_s, true ).toBool();
90 if ( mQgsDateTimeEdit )
91 {
92 mQgsDateTimeEdit->setAllowNull( allowNull );
93 }
94 else
95 {
96 QgsMessageLog::logMessage( tr( "The usual date/time widget QDateTimeEdit cannot be configured to allow NULL values. "
97 "For that the QGIS custom widget QgsDateTimeEdit needs to be used." ),
98 tr( "field widgets" ) );
99 }
100
101 if ( mQgsDateTimeEdit )
102 {
103 connect( mQgsDateTimeEdit, &QgsDateTimeEdit::valueChanged, this, &QgsDateTimeEditWrapper::dateTimeChanged );
104 }
105 else
106 {
107 connect( mQDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this, &QgsDateTimeEditWrapper::dateTimeChanged );
108 }
109}
110
112{
113 return mQgsDateTimeEdit || mQDateTimeEdit;
114}
115
117{
118 if ( mQgsDateTimeEdit )
119 mQgsDateTimeEdit->setEmpty();
120}
121
122void QgsDateTimeEditWrapper::dateTimeChanged( const QDateTime &dateTime )
123{
124 switch ( field().type() )
125 {
126 case QMetaType::Type::QDateTime:
128 emit valueChanged( dateTime );
130 emit valuesChanged( dateTime );
131 break;
132 case QMetaType::Type::QDate:
134 emit valueChanged( dateTime.date() );
136 emit valuesChanged( dateTime.date() );
137 break;
138 case QMetaType::Type::QTime:
140 emit valueChanged( dateTime.time() );
142 emit valuesChanged( dateTime.time() );
143 break;
144 default:
145 if ( !dateTime.isValid() || dateTime.isNull() )
146 {
151 }
152 else
153 {
154 const bool fieldIsoFormat = config( u"field_iso_format"_s, false ).toBool();
155 const QString fieldFormat = config( u"field_format"_s, QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
156 if ( fieldIsoFormat )
157 {
159 emit valueChanged( dateTime.toString( Qt::ISODate ) );
161 emit valuesChanged( dateTime.toString( Qt::ISODate ) );
162 }
163 else
164 {
166 emit valueChanged( dateTime.toString( fieldFormat ) );
168 emit valuesChanged( dateTime.toString( fieldFormat ) );
169 }
170 }
171 break;
172 }
173}
174
176{
177 if ( !mQDateTimeEdit )
178 return QgsVariantUtils::createNullVariant( field().type() );
179
180 QDateTime dateTime;
181 if ( mQgsDateTimeEdit )
182 {
183 dateTime = mQgsDateTimeEdit->dateTime();
184 }
185 else
186 {
187 dateTime = mQDateTimeEdit->dateTime();
188 }
189
190 if ( dateTime.isNull() )
191 return QgsVariantUtils::createNullVariant( field().type() );
192
193 switch ( field().type() )
194 {
195 case QMetaType::Type::QDateTime:
196 return dateTime;
197 case QMetaType::Type::QDate:
198 return dateTime.date();
199 case QMetaType::Type::QTime:
200 return dateTime.time();
201 default:
202 const bool fieldIsoFormat = config( u"field_iso_format"_s, false ).toBool();
203 const QString fieldFormat = config( u"field_format"_s, QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
204 if ( fieldIsoFormat )
205 {
206 return dateTime.toString( Qt::ISODate );
207 }
208 else
209 {
210 return dateTime.toString( fieldFormat );
211 }
212 }
213#ifndef _MSC_VER // avoid warnings
214 return QVariant(); // avoid warnings
215#endif
216}
217
218void QgsDateTimeEditWrapper::updateValues( const QVariant &value, const QVariantList & )
219{
220 if ( !mQDateTimeEdit )
221 return;
222
223 QDateTime dateTime;
224
225 switch ( field().type() )
226 {
227 case QMetaType::Type::QDateTime:
228 dateTime = value.toDateTime();
229 break;
230 case QMetaType::Type::QDate:
231 dateTime.setDate( value.toDate() );
232 dateTime.setTime( QTime( 0, 0, 0 ) );
233 break;
234 case QMetaType::Type::QTime:
235 dateTime.setDate( QDate::currentDate() );
236 dateTime.setTime( value.toTime() );
237 break;
238 default:
239 // Field type is not a date/time but we might already have a date/time variant
240 // value coming from a default: no need for string parsing in that case
241 switch ( value.userType() )
242 {
243 case QMetaType::Type::QDateTime:
244 {
245 dateTime = value.toDateTime();
246 break;
247 }
248 case QMetaType::Type::QDate:
249 {
250 dateTime.setDate( value.toDate() );
251 dateTime.setTime( QTime( 0, 0, 0 ) );
252 break;
253 }
254 case QMetaType::Type::QTime:
255 {
256 dateTime.setDate( QDate::currentDate() );
257 dateTime.setTime( value.toTime() );
258 break;
259 }
260 default:
261 {
262 const bool fieldIsoFormat = config( u"field_iso_format"_s, false ).toBool();
263 const QString fieldFormat = config( u"field_format"_s, QgsDateTimeFieldFormatter::defaultFormat( field().type() ) ).toString();
264 if ( fieldIsoFormat )
265 {
266 dateTime = QDateTime::fromString( value.toString(), Qt::ISODate );
267 }
268 else
269 {
270 dateTime = QDateTime::fromString( value.toString(), fieldFormat );
271 }
272 break;
273 }
274 }
275 break;
276 }
277
278 if ( mQgsDateTimeEdit )
279 {
280 // Convert to UTC if the format string includes a Z
281 if ( mQgsDateTimeEdit->displayFormat().indexOf( "Z" ) > 0 )
282 {
283 dateTime = dateTime.toUTC();
284 }
285
286 mQgsDateTimeEdit->setDateTime( dateTime );
287 }
288 else
289 {
290 mQDateTimeEdit->setDateTime( dateTime );
291 }
292}
293
295{
296 if ( !mQDateTimeEdit )
297 return;
298
299 mQDateTimeEdit->setReadOnly( !enabled );
300 mQDateTimeEdit->setFrame( enabled );
301}
@ Warning
Warning message.
Definition qgis.h:161
bool valid() const override
Returns true if the widget has been properly initialized.
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
QgsDateTimeEditWrapper(QgsVectorLayer *layer, int fieldIdx, QWidget *editor, QWidget *parent=nullptr)
Constructor for QgsDateTimeEditWrapper.
QVariant value() const override
Will be used to access the widget's value.
void showIndeterminateState() override
Sets the widget to display in an indeterminate "mixed value" state.
void setEnabled(bool enabled) override
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
A QDateTimeEdit with the capability of setting/reading null date/times.
void setEmpty()
Resets the widget to show no value (ie, an "unknown" state).
void valueChanged(const QDateTime &date)
Signal emitted whenever the value changes.
static QString defaultFormat(QMetaType::Type type)
Gets the default format in function of the type.
Q_DECL_DEPRECATED void valueChanged(const QVariant &value)
Emit this signal, whenever the value changed.
int fieldIdx() const
Access the field index.
QgsEditorWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *editor=nullptr, QWidget *parent=nullptr)
Create a new widget wrapper.
void valuesChanged(const QVariant &value, const QVariantList &additionalFieldValues=QVariantList())
Emit this signal, whenever the value changed.
QgsField field() const
Access the field.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
static QVariant createNullVariant(QMetaType::Type metaType)
Helper method to properly create a null QVariant from a metaType Returns the created QVariant.
Represents a vector layer which manages a vector based dataset.
QWidget * widget()
Access the widget managed by this wrapper.
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.
QVariantMap config() const
Returns the whole config.
#define Q_NOWARN_DEPRECATED_POP
Definition qgis.h:7451
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:7450
#define QgsDebugError(str)
Definition qgslogger.h:59