QGIS API Documentation  3.17.0-Master (a035f434f4)
qgsvectorlayertemporalpropertieswidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsvectorlayertemporalpropertieswidget.cpp
3  ------------------------------
4  begin : May 2020
5  copyright : (C) 2020 by Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
19 #include "qgsgui.h"
20 #include "qgsproject.h"
21 #include "qgsprojecttimesettings.h"
23 #include "qgsvectorlayer.h"
25 #include "qgsstringutils.h"
27 
29  : QWidget( parent )
30  , mLayer( layer )
31 {
32  Q_ASSERT( mLayer );
33  setupUi( this );
34 
35  mModeComboBox->addItem( tr( "Fixed Time Range" ), QgsVectorLayerTemporalProperties::ModeFixedTemporalRange );
36  mModeComboBox->addItem( tr( "Single Field with Date/Time" ), QgsVectorLayerTemporalProperties::ModeFeatureDateTimeInstantFromField );
37  mModeComboBox->addItem( tr( "Separate Fields for Start and End Date/Time" ), QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndEndFromFields );
38  mModeComboBox->addItem( tr( "Separate Fields for Start and Event Duration" ), QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndDurationFromFields );
39  mModeComboBox->addItem( tr( "Start and End Date/Time from Expressions" ), QgsVectorLayerTemporalProperties::ModeFeatureDateTimeStartAndEndFromExpressions );
40  mModeComboBox->addItem( tr( "Redraw Layer Only" ), QgsVectorLayerTemporalProperties::ModeRedrawLayerOnly );
41 
42  connect( mModeComboBox, qgis::overload<int>::of( &QComboBox::currentIndexChanged ), mStackedWidget, &QStackedWidget::setCurrentIndex );
43 
44  mStartTemporalDateTimeEdit->setDisplayFormat( "yyyy-MM-dd HH:mm:ss" );
45  mEndTemporalDateTimeEdit->setDisplayFormat( "yyyy-MM-dd HH:mm:ss" );
46 
47  mSingleFieldComboBox->setLayer( layer );
48  mStartFieldComboBox->setLayer( layer );
49  mEndFieldComboBox->setLayer( layer );
50  mDurationStartFieldComboBox->setLayer( layer );
51  mDurationFieldComboBox->setLayer( layer );
52  mSingleFieldComboBox->setFilters( QgsFieldProxyModel::DateTime | QgsFieldProxyModel::Date );
53  mStartFieldComboBox->setFilters( QgsFieldProxyModel::DateTime | QgsFieldProxyModel::Date );
54  mStartFieldComboBox->setAllowEmptyFieldName( true );
55  mEndFieldComboBox->setFilters( QgsFieldProxyModel::DateTime | QgsFieldProxyModel::Date );
56  mEndFieldComboBox->setAllowEmptyFieldName( true );
57  mDurationStartFieldComboBox->setFilters( QgsFieldProxyModel::DateTime | QgsFieldProxyModel::Date );
58  mDurationFieldComboBox->setFilters( QgsFieldProxyModel::Numeric );
59 
60  mFixedDurationSpinBox->setMinimum( 0 );
61  mFixedDurationSpinBox->setClearValue( 0 );
62 
64  {
75  } )
76  {
79  mDurationUnitsComboBox->addItem( title, u );
80  mFixedDurationUnitsComboBox->addItem( title, u );
81  }
82 
83  mFixedDurationUnitsComboBox->setEnabled( !mAccumulateCheckBox->isChecked() );
84  mFixedDurationSpinBox->setEnabled( !mAccumulateCheckBox->isChecked() );
85  connect( mAccumulateCheckBox, &QCheckBox::toggled, this, [ = ]( bool checked )
86  {
87  mFixedDurationUnitsComboBox->setEnabled( !checked );
88  mFixedDurationSpinBox->setEnabled( !checked );
89  } );
90 
91  mStartExpressionWidget->setAllowEmptyFieldName( true );
92  mEndExpressionWidget->setAllowEmptyFieldName( true );
93  mStartExpressionWidget->setLayer( layer );
94  mEndExpressionWidget->setLayer( layer );
95  mStartExpressionWidget->registerExpressionContextGenerator( this );
96  mEndExpressionWidget->registerExpressionContextGenerator( this );
97 
98  syncToLayer();
99 }
100 
102 {
103  QgsVectorLayerTemporalProperties *properties = qobject_cast< QgsVectorLayerTemporalProperties * >( mLayer->temporalProperties() );
104 
105  properties->setIsActive( mTemporalGroupBox->isChecked() );
106  properties->setMode( static_cast< QgsVectorLayerTemporalProperties::TemporalMode >( mModeComboBox->currentData().toInt() ) );
107 
108  QgsDateTimeRange normalRange = QgsDateTimeRange( mStartTemporalDateTimeEdit->dateTime(),
109  mEndTemporalDateTimeEdit->dateTime() );
110 
111  properties->setFixedTemporalRange( normalRange );
112 
113  switch ( properties->mode() )
114  {
119  properties->setStartField( mSingleFieldComboBox->currentField() );
120  properties->setDurationUnits( static_cast< QgsUnitTypes::TemporalUnit >( mFixedDurationUnitsComboBox->currentData().toInt() ) );
121  break;
122 
124  properties->setStartField( mStartFieldComboBox->currentField() );
125  properties->setDurationUnits( static_cast< QgsUnitTypes::TemporalUnit >( mFixedDurationUnitsComboBox->currentData().toInt() ) );
126  break;
127 
129  properties->setStartField( mDurationStartFieldComboBox->currentField() );
130  properties->setDurationUnits( static_cast< QgsUnitTypes::TemporalUnit >( mDurationUnitsComboBox->currentData().toInt() ) );
131  break;
132  }
133 
134  properties->setEndField( mEndFieldComboBox->currentField() );
135  properties->setDurationField( mDurationFieldComboBox->currentField() );
136  properties->setFixedDuration( mFixedDurationSpinBox->value() );
137  properties->setAccumulateFeatures( mAccumulateCheckBox->isChecked() );
138  properties->setStartExpression( mStartExpressionWidget->currentField() );
139  properties->setEndExpression( mEndExpressionWidget->currentField() );
140 }
141 
143 {
144  QgsExpressionContext context;
146  return context;
147 }
148 
150 {
151  const QgsVectorLayerTemporalProperties *properties = qobject_cast< QgsVectorLayerTemporalProperties * >( mLayer->temporalProperties() );
152  mTemporalGroupBox->setChecked( properties->isActive() );
153 
154  mModeComboBox->setCurrentIndex( mModeComboBox->findData( properties->mode() ) );
155  mStackedWidget->setCurrentIndex( static_cast< int >( properties->mode() ) );
156 
157  mStartTemporalDateTimeEdit->setDateTime( properties->fixedTemporalRange().begin() );
158  mEndTemporalDateTimeEdit->setDateTime( properties->fixedTemporalRange().end() );
159 
160  mFixedDurationSpinBox->setValue( properties->fixedDuration() );
161 
162  if ( !properties->startField().isEmpty() )
163  {
164  mSingleFieldComboBox->setField( properties->startField() );
165  mStartFieldComboBox->setField( properties->startField() );
166  mDurationStartFieldComboBox->setField( properties->startField() );
167  }
168  if ( !properties->endField().isEmpty() )
169  {
170  mEndFieldComboBox->setField( properties->endField() );
171  }
172  mDurationFieldComboBox->setField( properties->durationField() );
173  mDurationUnitsComboBox->setCurrentIndex( mDurationUnitsComboBox->findData( properties->durationUnits() ) );
174  mFixedDurationUnitsComboBox->setCurrentIndex( mDurationUnitsComboBox->findData( properties->durationUnits() ) );
175 
176  mAccumulateCheckBox->setChecked( properties->accumulateFeatures() );
177 
178  mStartExpressionWidget->setField( properties->startExpression() );
179  mEndExpressionWidget->setField( properties->endExpression() );
180 }
void setStartExpression(const QString &expression)
Sets the expression to use for the start time for the feature&#39;s time spans.
double fixedDuration() const
Returns the fixed duration length, which contains the duration of the event.
static Q_INVOKABLE QString toString(QgsUnitTypes::DistanceUnit unit)
Returns a translated string representing a distance unit.
Implementation of map layer temporal properties for vector layers.
bool isActive() const
Returns true if the temporal property is active.
Mode when features have separate fields for start and end times.
Dialog titles should be title case.
Definition: qgsgui.h:191
QString endExpression() const
Returns the expression for the end time for the feature&#39;s time spans.
void syncToLayer()
Updates the widget state to match the current layer state.
Simple title case conversion - does not fully grammatically parse the text and uses simple rules only...
Mode when temporal properties have fixed start and end datetimes.
bool accumulateFeatures() const
Returns true if features will be accumulated over time (i.e.
void saveTemporalProperties()
Save widget temporal properties inputs.
Mode when features have a datetime instant taken from a single field.
QgsVectorLayerTemporalPropertiesWidget(QWidget *parent=nullptr, QgsVectorLayer *layer=nullptr)
Constructor for QgsVectorLayerTemporalPropertiesWidget.
void setFixedTemporalRange(const QgsDateTimeRange &range)
Sets a temporal range to apply to the whole layer.
void setEndField(const QString &field)
Sets the name of the end datetime field, which contains the end time for the feature&#39;s time spans...
void setDurationField(const QString &field)
Sets the name of the duration field, which contains the duration of the event.
QString endField() const
Returns the name of the end datetime field, which contains the end time for the feature&#39;s time spans...
QString durationField() const
Returns the name of the duration field, which contains the duration of the event. ...
static QString capitalize(const QString &string, Capitalization capitalization)
Converts a string by applying capitalization rules to the string.
Date or datetime fields.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsMapLayerTemporalProperties * temporalProperties() override
Returns temporal properties associated with the vector layer.
Mode when features have a field for start time and a field for event duration.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer&#39;s project and layer.
void setAccumulateFeatures(bool accumulate)
Sets whether features will be accumulated over time (i.e.
void setMode(TemporalMode mode)
Sets the temporal properties mode.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
static QgsGui::HigFlags higFlags()
Returns the platform&#39;s HIG flags.
Definition: qgsgui.cpp:163
Redraw the layer when temporal range changes, but don&#39;t apply any filtering. Useful when symbology or...
TemporalMode mode() const
Returns the temporal properties mode.
void setDurationUnits(QgsUnitTypes::TemporalUnit units)
Sets the units of the event&#39;s duration.
QString startField() const
Returns the name of the start datetime field, which contains the start time for the feature&#39;s time sp...
const QgsDateTimeRange & fixedTemporalRange() const
Returns the fixed temporal range for the layer.
TemporalUnit
Temporal units.
Definition: qgsunittypes.h:149
void setStartField(const QString &field)
Sets the name of the start datetime field, which contains the start time for the feature&#39;s time spans...
void appendScopes(const QList< QgsExpressionContextScope *> &scopes)
Appends a list of scopes to the end of the context.
void setFixedDuration(double duration)
Sets the fixed event duration, which contains the duration of the event.
Represents a vector layer which manages a vector based data sets.
void setIsActive(bool active)
Sets whether the temporal property is active.
QgsUnitTypes::TemporalUnit durationUnits() const
Returns the units of the event&#39;s duration.
QString startExpression() const
Returns the expression for the start time for the feature&#39;s time spans.
void setEndExpression(const QString &endExpression)
Sets the expression to use for the end time for the feature&#39;s time spans.