QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsdatetimesearchwidgetwrapper.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsdatetimesearchwidgetwrapper.cpp
3 ---------------------------------
4 Date : 2016-05-23
5 Copyright : (C) 2016 Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
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 "qgsfields.h"
20#include "qgsvectorlayer.h"
21#include "qgsdatetimeedit.h"
22#include "qcalendarwidget.h"
25
26#include <QSettings>
27
29 : QgsSearchWidgetWrapper( vl, fieldIdx, parent )
30
31{
32}
33
35{
36 return true;
37}
38
40{
41 return mExpression;
42}
43
45{
46 if ( ! mDateTimeEdit )
47 return QDateTime();
48
49 const bool fieldIsoFormat = config( QStringLiteral( "field_iso_format" ), false ).toBool();
50 const QString fieldFormat = config( QStringLiteral( "field_format" ), QgsDateTimeFieldFormatter::defaultFormat( layer()->fields().at( mFieldIdx ).type() ) ).toString();
51 if ( fieldIsoFormat )
52 {
53 return mDateTimeEdit->dateTime().toString( Qt::ISODate );
54 }
55 else
56 {
57 return mDateTimeEdit->dateTime().toString( fieldFormat );
58 }
59}
60
61QgsSearchWidgetWrapper::FilterFlags QgsDateTimeSearchWidgetWrapper::supportedFlags() const
62{
64}
65
66QgsSearchWidgetWrapper::FilterFlags QgsDateTimeSearchWidgetWrapper::defaultFlags() const
67{
68 return EqualTo;
69}
70
71QString QgsDateTimeSearchWidgetWrapper::createExpression( QgsSearchWidgetWrapper::FilterFlags flags ) const
72{
73 const QString fieldName = createFieldIdentifier();
74
75 //clear any unsupported flags
76 flags &= supportedFlags();
77 if ( flags & IsNull )
78 return fieldName + " IS NULL";
79 if ( flags & IsNotNull )
80 return fieldName + " IS NOT NULL";
81
82 const QVariant v = value();
83 if ( !v.isValid() )
84 return QString();
85
86 if ( flags & EqualTo )
87 return fieldName + "='" + v.toString() + '\'';
88 else if ( flags & NotEqualTo )
89 return fieldName + "<>'" + v.toString() + '\'';
90 else if ( flags & GreaterThan )
91 return fieldName + ">'" + v.toString() + '\'';
92 else if ( flags & LessThan )
93 return fieldName + "<'" + v.toString() + '\'';
94 else if ( flags & GreaterThanOrEqualTo )
95 return fieldName + ">='" + v.toString() + '\'';
96 else if ( flags & LessThanOrEqualTo )
97 return fieldName + "<='" + v.toString() + '\'';
98
99 return QString();
100}
101
103{
104 if ( mDateTimeEdit )
105 {
106 mDateTimeEdit->setEmpty();
107 }
108}
109
111{
112 if ( mDateTimeEdit )
113 {
114 mDateTimeEdit->setEnabled( enabled );
115 }
116}
117
119{
120 return true;
121}
122
123void QgsDateTimeSearchWidgetWrapper::setExpression( const QString &expression )
124{
125 QString exp = expression;
126 const QString fieldName = layer()->fields().at( mFieldIdx ).name();
127
128 const QString str = QStringLiteral( "%1 = '%3'" )
129 .arg( QgsExpression::quotedColumnRef( fieldName ),
130 exp.replace( '\'', QLatin1String( "''" ) )
131 );
133}
134
135void QgsDateTimeSearchWidgetWrapper::dateTimeChanged( const QDateTime &dt )
136{
137 if ( mDateTimeEdit )
138 {
139 const QString exp = value().toString();
140 setExpression( exp );
141 if ( dt.isValid() && !dt.isNull() )
142 emit valueChanged();
143 else
144 emit valueCleared();
146 }
147}
148
150{
151 QgsDateTimeEdit *widget = new QgsDateTimeEdit( parent );
152 widget->setEmpty();
153 return widget;
154}
155
157{
158 mDateTimeEdit = qobject_cast<QgsDateTimeEdit *>( editor );
159
160 if ( mDateTimeEdit )
161 {
162 mDateTimeEdit->setAllowNull( false );
163
164 const QString displayFormat = config( QStringLiteral( "display_format" ), QgsDateTimeFieldFormatter::defaultFormat( layer()->fields().at( mFieldIdx ).type() ) ).toString();
165 mDateTimeEdit->setDisplayFormat( displayFormat );
166
167 const bool calendar = config( QStringLiteral( "calendar_popup" ), false ).toBool();
168 mDateTimeEdit->setCalendarPopup( calendar );
169 if ( calendar && mDateTimeEdit->calendarWidget() )
170 {
171 // highlight today's date
172 QTextCharFormat todayFormat;
173 todayFormat.setBackground( QColor( 160, 180, 200 ) );
174 mDateTimeEdit->calendarWidget()->setDateTextFormat( QDate::currentDate(), todayFormat );
175 }
176
177 mDateTimeEdit->setEmpty();
178
179 connect( mDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this, &QgsDateTimeSearchWidgetWrapper::dateTimeChanged );
180 }
181}
182
183
The QgsDateTimeEdit class is a QDateTimeEdit with the capability of setting/reading null date/times.
void setAllowNull(bool allowNull)
Determines if the widget allows setting null date/time.
QDateTime dateTime() const
Returns the date time which can be a null date/time.
void setEmpty()
Resets the widget to show no value (ie, an "unknown" state).
static QString defaultFormat(QVariant::Type type)
Gets the default format in function of the type.
void setExpression(const QString &exp) override
QString expression() const override
Will be used to access the widget's value.
bool applyDirectly() override
If this is true, then this search widget should take effect directly when its expression changes.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
QgsSearchWidgetWrapper::FilterFlags supportedFlags() const override
Returns filter flags supported by the search widget.
QgsSearchWidgetWrapper::FilterFlags defaultFlags() const override
Returns the filter flags which should be set by default for the search widget.
QVariant value() const
Returns a variant representing the current state of the widget, respecting the editor widget's config...
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
QString createExpression(QgsSearchWidgetWrapper::FilterFlags flags) const override
QgsDateTimeSearchWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *parent=nullptr)
Constructor for QgsDateTimeSearchWidgetWrapper.
bool valid() const override
Returns true if the widget has been properly initialized.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
QString name
Definition: qgsfield.h:60
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Definition: qgsfields.cpp:163
Shows a search widget on a filter form.
@ IsNotBetween
Supports searching for values outside of a set range.
@ LessThan
Supports less than.
@ IsNull
Supports searching for null values.
@ GreaterThan
Supports greater than.
@ IsNotNull
Supports searching for non-null values.
@ EqualTo
Supports equal to.
@ Between
Supports searches between two values.
@ NotEqualTo
Supports not equal to.
void valueChanged()
Emitted when a user changes the value of the search widget.
void valueCleared()
Emitted when a user changes the value of the search widget back to an empty, default state.
void expressionChanged(const QString &exp)
Emitted whenever the expression changes.
QString createFieldIdentifier() const
Gets a field name or expression to use as field comparison.
Represents a vector layer which manages a vector based data sets.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
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 str(x)
Definition: qgis.cpp:37