QGIS API Documentation  3.4.15-Madeira (e83d02e274)
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"
19 #include "qgsdatetimeeditfactory.h"
20 #include "qgsvectorlayer.h"
21 #include "qgsdatetimeedit.h"
22 #include "qcalendarwidget.h"
23 #include "qgsdatetimeeditconfig.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 
61 QgsSearchWidgetWrapper::FilterFlags QgsDateTimeSearchWidgetWrapper::supportedFlags() const
62 {
64 }
65 
66 QgsSearchWidgetWrapper::FilterFlags QgsDateTimeSearchWidgetWrapper::defaultFlags() const
67 {
68  return EqualTo;
69 }
70 
71 QString QgsDateTimeSearchWidgetWrapper::createExpression( QgsSearchWidgetWrapper::FilterFlags flags ) const
72 {
73  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  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 
124 {
125  QString exp = expression;
126  QString fieldName = layer()->fields().at( mFieldIdx ).name();
127 
128  QString str = QStringLiteral( "%1 = '%3'" )
129  .arg( QgsExpression::quotedColumnRef( fieldName ),
130  exp.replace( '\'', QLatin1String( "''" ) )
131  );
132  mExpression = str;
133 }
134 
135 void QgsDateTimeSearchWidgetWrapper::dateTimeChanged( const QDateTime &dt )
136 {
137  if ( mDateTimeEdit )
138  {
139  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 
Shows a search widget on a filter form.
QDateTime dateTime() const
dateTime returns the date time which can eventually be a null date/time
QVariantMap config() const
Returns the whole config.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
QString name
Definition: qgsfield.h:57
Supports searching for non-null values.
Supports searching for values outside of a set range.
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
Definition: qgsfields.cpp:163
Supports searching for null values.
QVariant value() const
Returns a variant representing the current state of the widget, respecting the editor widget&#39;s config...
static QString defaultFormat(QVariant::Type type)
Gets the default format in function of the type.
bool valid() const override
Returns true if the widget has been properly initialized.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
void valueChanged()
Emitted when a user changes the value of the search widget.
void expressionChanged(const QString &exp)
Emitted whenever the expression changes.
void setExpression(const QString &exp) override
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.
QString createFieldIdentifier() const
Gets a field name or expression to use as field comparison.
QString expression() const override
Will be used to access the widget&#39;s value.
void valueCleared()
Emitted when a user changes the value of the search widget back to an empty, default state...
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.
void setEmpty()
Resets the widget to show no value (ie, an "unknown" state).
void setAllowNull(bool allowNull)
Determines if the widget allows setting null date/time.
QWidget * widget()
Access the widget managed by this wrapper.
QString createExpression(QgsSearchWidgetWrapper::FilterFlags flags) const override
QgsDateTimeSearchWidgetWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *parent=nullptr)
Constructor for QgsDateTimeSearchWidgetWrapper.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
Represents a vector layer which manages a vector based data sets.
bool applyDirectly() override
If this is true, then this search widget should take effect directly when its expression changes...
The QgsDateTimeEdit class is a QDateTimeEdit with the capability of setting/reading null date/times...
Supports searches between two values.