32 #include <QRegularExpression>
41 mStartDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
42 mEndDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
43 mFixedRangeStartDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
44 mFixedRangeEndDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
46 connect( mForwardButton, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::togglePlayForward );
47 connect( mBackButton, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::togglePlayBackward );
48 connect( mStopButton, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::togglePause );
53 connect( mLoopingCheckBox, &QCheckBox::toggled,
this, [ = ](
bool state ) { mNavigationObject->
setLooping( state ); } );
55 setWidgetStateFromNavigationMode( mNavigationObject->
navigationMode() );
60 if ( mBlockFrameDurationUpdates )
63 mBlockFrameDurationUpdates++;
64 updateTimeStepInputs( timeStep );
65 mBlockFrameDurationUpdates--;
67 connect( mNavigationOff, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationOff_clicked );
68 connect( mNavigationFixedRange, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationFixedRange_clicked );
69 connect( mNavigationAnimated, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationAnimated_clicked );
78 connect( mStartDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::startEndDateTime_changed );
79 connect( mEndDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::startEndDateTime_changed );
80 connect( mFixedRangeStartDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed );
81 connect( mFixedRangeEndDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed );
82 connect( mStepSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ),
this, &QgsTemporalControllerWidget::updateFrameDuration );
83 connect( mTimeStepsComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, &QgsTemporalControllerWidget::updateFrameDuration );
84 connect( mSlider, &QSlider::valueChanged,
this, &QgsTemporalControllerWidget::timeSlider_valueChanged );
86 mStepSpinBox->setClearValue( 1 );
90 connect( mSettings, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::settings_clicked );
94 mRangeMenu.reset(
new QMenu(
this ) );
96 mRangeSetToAllLayersAction =
new QAction( tr(
"Set to Full Range" ), mRangeMenu.get() );
98 connect( mRangeSetToAllLayersAction, &QAction::triggered,
this, &QgsTemporalControllerWidget::mRangeSetToAllLayersAction_triggered );
99 mRangeMenu->addAction( mRangeSetToAllLayersAction );
101 mRangeSetToProjectAction =
new QAction( tr(
"Set to Preset Project Range" ), mRangeMenu.get() );
102 connect( mRangeSetToProjectAction, &QAction::triggered,
this, &QgsTemporalControllerWidget::mRangeSetToProjectAction_triggered );
103 mRangeMenu->addAction( mRangeSetToProjectAction );
105 mRangeMenu->addSeparator();
107 mRangeLayersSubMenu.reset(
new QMenu( tr(
"Set to Single Layer's Range" ), mRangeMenu.get() ) );
108 mRangeLayersSubMenu->setEnabled(
false );
109 mRangeMenu->addMenu( mRangeLayersSubMenu.get() );
110 connect( mRangeMenu.get(), &QMenu::aboutToShow,
this, &QgsTemporalControllerWidget::aboutToShowRangeMenu );
112 mSetRangeButton->setPopupMode( QToolButton::MenuButtonPopup );
113 mSetRangeButton->setMenu( mRangeMenu.get() );
114 mSetRangeButton->setDefaultAction( mRangeSetToAllLayersAction );
115 mFixedRangeSetRangeButton->setPopupMode( QToolButton::MenuButtonPopup );
116 mFixedRangeSetRangeButton->setMenu( mRangeMenu.get() );
117 mFixedRangeSetRangeButton->setDefaultAction( mRangeSetToAllLayersAction );
121 QgsDateTimeRange range;
126 if ( range.begin().isValid() && range.end().isValid() )
128 whileBlocking( mStartDateTime )->setDateTime( range.begin() );
130 whileBlocking( mFixedRangeStartDateTime )->setDateTime( range.begin() );
131 whileBlocking( mFixedRangeEndDateTime )->setDateTime( range.end() );
156 mStepSpinBox->setDecimals( 3 );
158 mStepSpinBox->setMinimum( 0.001 );
159 mStepSpinBox->setMaximum( std::numeric_limits<int>::max() );
160 mStepSpinBox->setSingleStep( 1 );
161 mStepSpinBox->setValue( 1 );
163 mForwardButton->setToolTip( tr(
"Play" ) );
164 mBackButton->setToolTip( tr(
"Reverse" ) );
165 mNextButton->setToolTip( tr(
"Go to next frame" ) );
166 mPreviousButton->setToolTip( tr(
"Go to previous frame" ) );
167 mStopButton->setToolTip( tr(
"Pause" ) );
168 mRewindButton->setToolTip( tr(
"Rewind to start" ) );
169 mFastForwardButton->setToolTip( tr(
"Fast forward to end" ) );
171 updateFrameDuration();
185 if ( mSlider->hasFocus() && e->key() == Qt::Key_Space )
189 QWidget::keyPressEvent( e );
192 void QgsTemporalControllerWidget::aboutToShowRangeMenu()
194 QgsDateTimeRange projectRange;
197 mRangeSetToProjectAction->setEnabled( projectRange.begin().isValid() && projectRange.end().isValid() );
199 mRangeLayersSubMenu->clear();
200 for (
int i = 0; i < mMapLayerModel->
rowCount(); ++i )
202 const QModelIndex index = mMapLayerModel->
index( i, 0 );
207 const QIcon icon = qvariant_cast<QIcon>( mMapLayerModel->
data( index, Qt::DecorationRole ) );
208 const QString text = mMapLayerModel->
data( index, Qt::DisplayRole ).toString();
210 if ( range.begin().isValid() && range.end().isValid() )
212 QAction *action =
new QAction( icon, text, mRangeLayersSubMenu.get() );
213 connect( action, &QAction::triggered,
this, [ = ]
216 saveRangeToProject();
218 mRangeLayersSubMenu->addAction( action );
221 mRangeLayersSubMenu->setEnabled( !mRangeLayersSubMenu->actions().isEmpty() );
224 void QgsTemporalControllerWidget::togglePlayForward()
226 mPlayingForward =
true;
230 mStopButton->setChecked(
false );
231 mBackButton->setChecked(
false );
232 mForwardButton->setChecked(
true );
237 mBackButton->setChecked(
true );
238 mForwardButton->setChecked(
false );
239 mNavigationObject->
pause();
243 void QgsTemporalControllerWidget::togglePlayBackward()
245 mPlayingForward =
false;
249 mStopButton->setChecked(
false );
250 mBackButton->setChecked(
true );
251 mForwardButton->setChecked(
false );
256 mBackButton->setChecked(
true );
257 mBackButton->setChecked(
false );
258 mNavigationObject->
pause();
262 void QgsTemporalControllerWidget::togglePause()
266 mStopButton->setChecked(
true );
267 mBackButton->setChecked(
false );
268 mForwardButton->setChecked(
false );
269 mNavigationObject->
pause();
273 mBackButton->setChecked( mPlayingForward ?
false :
true );
274 mForwardButton->setChecked( mPlayingForward ?
false :
true );
275 if ( mPlayingForward )
286 void QgsTemporalControllerWidget::updateTemporalExtent()
290 const QDateTime start = mStartDateTime->dateTime();
291 const QDateTime end = mEndDateTime->dateTime();
292 const bool isTimeInstant = start == end;
293 const QgsDateTimeRange temporalExtent = QgsDateTimeRange( start, end,
300 void QgsTemporalControllerWidget::updateFrameDuration()
302 if ( mBlockSettingUpdates )
310 if ( !mBlockFrameDurationUpdates )
322 mStepSpinBox->setEnabled(
false );
323 mStepSpinBox->setValue( 1 );
324 mSlider->setTickInterval( 1 );
325 mSlider->setTickPosition( QSlider::TicksBothSides );
329 mStepSpinBox->setEnabled(
true );
330 mSlider->setTickInterval( 0 );
331 mSlider->setTickPosition( QSlider::NoTicks );
335 void QgsTemporalControllerWidget::setWidgetStateFromProject()
337 mBlockSettingUpdates++;
340 mBlockSettingUpdates--;
344 QStringLiteral(
"/NavigationMode" ), 0, &ok ) );
348 setWidgetStateFromNavigationMode( mode );
356 const QString startString =
QgsProject::instance()->
readEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/StartDateTime" ) );
357 const QString endString =
QgsProject::instance()->
readEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/EndDateTime" ) );
358 if ( !startString.isEmpty() && !endString.isEmpty() )
360 whileBlocking( mStartDateTime )->setDateTime( QDateTime::fromString( startString, Qt::ISODateWithMs ) );
361 whileBlocking( mEndDateTime )->setDateTime( QDateTime::fromString( endString, Qt::ISODateWithMs ) );
362 whileBlocking( mFixedRangeStartDateTime )->setDateTime( QDateTime::fromString( startString, Qt::ISODateWithMs ) );
363 whileBlocking( mFixedRangeEndDateTime )->setDateTime( QDateTime::fromString( endString, Qt::ISODateWithMs ) );
367 setDatesToProjectTime();
369 updateTemporalExtent();
370 updateFrameDuration();
376 void QgsTemporalControllerWidget::mNavigationOff_clicked()
385 void QgsTemporalControllerWidget::mNavigationFixedRange_clicked()
394 void QgsTemporalControllerWidget::mNavigationAnimated_clicked()
412 mNavigationModeStackedWidget->setCurrentIndex( 0 );
415 mNavigationModeStackedWidget->setCurrentIndex( 1 );
418 mNavigationModeStackedWidget->setCurrentIndex( 2 );
423 void QgsTemporalControllerWidget::onLayersAdded(
const QList<QgsMapLayer *> &layers )
425 if ( !mHasTemporalLayersLoaded )
429 if ( layer->temporalProperties() )
431 mHasTemporalLayersLoaded |= layer->temporalProperties()->isActive();
433 if ( !mHasTemporalLayersLoaded )
437 if ( layer->isValid() && layer->temporalProperties()->isActive() && !mHasTemporalLayersLoaded )
439 mHasTemporalLayersLoaded = true;
440 firstTemporalLayerLoaded( layer );
441 mNavigationObject->setAvailableTemporalRanges( QgsTemporalUtils::usedTemporalRangesForProject( QgsProject::instance() ) );
446 firstTemporalLayerLoaded( layer );
454 void QgsTemporalControllerWidget::firstTemporalLayerLoaded(
QgsMapLayer *layer )
456 setDatesToProjectTime();
458 if (
QgsMeshLayer *meshLayer = qobject_cast<QgsMeshLayer *>( layer ) )
460 mBlockFrameDurationUpdates++;
461 setTimeStep( meshLayer->firstValidTimeStep() );
462 mBlockFrameDurationUpdates--;
463 updateFrameDuration();
465 else if (
QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer ) )
467 if ( rasterLayer->dataProvider() && rasterLayer->dataProvider()->temporalCapabilities() )
469 mBlockFrameDurationUpdates++;
470 setTimeStep( rasterLayer->dataProvider()->temporalCapabilities()->defaultInterval() );
471 mBlockFrameDurationUpdates--;
472 updateFrameDuration();
477 void QgsTemporalControllerWidget::onProjectCleared()
479 mHasTemporalLayersLoaded =
false;
486 const QTime startOfCurrentHour = QTime( QTime::currentTime().hour(), 0, 0 );
487 const QDateTime end = QDateTime( QDate::currentDate(), startOfCurrentHour, Qt::UTC );
488 const QDateTime start = end.addSecs( -24 * 60 * 60 );
492 whileBlocking( mFixedRangeStartDateTime )->setDateTime( start );
495 updateTemporalExtent();
497 mStepSpinBox->setValue( 1 );
500 void QgsTemporalControllerWidget::updateSlider(
const QgsDateTimeRange &range )
503 updateRangeLabel( range );
506 void QgsTemporalControllerWidget::updateRangeLabel(
const QgsDateTimeRange &range )
508 QString timeFrameFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss" );
511 timeFrameFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss.zzz" );
515 mCurrentRangeLabel->setText( tr(
"Current frame: %1 ≤ <i>t</i> < %2" ).arg(
516 range.begin().toString( timeFrameFormat ),
517 range.end().toString( timeFrameFormat ) ) );
520 mCurrentRangeLabel->setText( tr(
"Range: %1 ≤ <i>t</i> < %2" ).arg(
521 range.begin().toString( timeFrameFormat ),
522 range.end().toString( timeFrameFormat ) ) );
525 mCurrentRangeLabel->setText( tr(
"Temporal navigation disabled" ) );
532 return mNavigationObject;
535 void QgsTemporalControllerWidget::settings_clicked()
537 QgsTemporalMapSettingsWidget *settingsWidget =
new QgsTemporalMapSettingsWidget(
this );
538 settingsWidget->setFrameRateValue( mNavigationObject->
framesPerSecond() );
541 connect( settingsWidget, &QgsTemporalMapSettingsWidget::frameRateChanged,
this, [ = ](
double rate )
548 connect( settingsWidget, &QgsTemporalMapSettingsWidget::temporalRangeCumulativeChanged,
this, [ = ](
bool state )
557 void QgsTemporalControllerWidget::timeSlider_valueChanged(
int value )
562 void QgsTemporalControllerWidget::startEndDateTime_changed()
564 whileBlocking( mFixedRangeStartDateTime )->setDateTime( mStartDateTime->dateTime() );
565 whileBlocking( mFixedRangeEndDateTime )->setDateTime( mEndDateTime->dateTime() );
567 updateTemporalExtent();
568 saveRangeToProject();
571 void QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed()
573 whileBlocking( mStartDateTime )->setDateTime( mFixedRangeStartDateTime->dateTime() );
574 whileBlocking( mEndDateTime )->setDateTime( mFixedRangeEndDateTime->dateTime() );
576 updateTemporalExtent();
577 saveRangeToProject();
580 void QgsTemporalControllerWidget::mRangeSetToAllLayersAction_triggered()
582 setDatesToAllLayers();
583 saveRangeToProject();
586 void QgsTemporalControllerWidget::setTimeStep(
const QgsInterval &timeStep )
591 int selectedUnit = -1;
592 double selectedValue = std::numeric_limits<double>::max();
598 int stringSize = std::numeric_limits<int>::max();
599 const int precision = mStepSpinBox->decimals();
600 for (
int i = 0; i < mTimeStepsComboBox->count(); ++i )
604 QString
string = QString::number( value,
'f',
precision );
606 const thread_local QRegularExpression trailingZeroRegEx = QRegularExpression( QStringLiteral(
"0+$" ) );
608 string.remove( trailingZeroRegEx );
610 const thread_local QRegularExpression trailingPointRegEx = QRegularExpression( QStringLiteral(
"[.]+$" ) );
612 string.remove( trailingPointRegEx );
615 &&
string.size() <= stringSize
616 && value < selectedValue )
619 selectedValue = value;
620 stringSize =
string.size();
622 else if (
string !=
'0'
624 &&
string.size() < stringSize )
627 selectedValue = value ;
628 stringSize =
string.size();
634 selectedUnit = mTimeStepsComboBox->findData(
static_cast< int >( timeStep.
originalUnit() ) );
638 if ( selectedUnit >= 0 )
640 mStepSpinBox->setValue( selectedValue );
641 mTimeStepsComboBox->setCurrentIndex( selectedUnit );
644 updateFrameDuration();
647 void QgsTemporalControllerWidget::updateTimeStepInputs(
const QgsInterval &timeStep )
652 QString timeDisplayFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss" );
655 timeDisplayFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss.zzz" );
657 updateTemporalExtent();
659 mStartDateTime->setDisplayFormat( timeDisplayFormat );
660 mEndDateTime->setDisplayFormat( timeDisplayFormat );
661 mFixedRangeStartDateTime->setDisplayFormat( timeDisplayFormat );
662 mFixedRangeEndDateTime->setDisplayFormat( timeDisplayFormat );
665 if ( timeStep ==
QgsInterval( mStepSpinBox->value(),
672 mTimeStepsComboBox->setCurrentIndex( timeStep.
originalUnit() );
675 updateFrameDuration();
678 void QgsTemporalControllerWidget::mRangeSetToProjectAction_triggered()
680 setDatesToProjectTime();
681 saveRangeToProject();
684 void QgsTemporalControllerWidget::setDates(
const QgsDateTimeRange &range )
686 if ( range.begin().isValid() && range.end().isValid() )
688 whileBlocking( mStartDateTime )->setDateTime( range.begin() );
690 whileBlocking( mFixedRangeStartDateTime )->setDateTime( range.begin() );
691 whileBlocking( mFixedRangeEndDateTime )->setDateTime( range.end() );
692 updateTemporalExtent();
696 void QgsTemporalControllerWidget::setDatesToAllLayers()
698 QgsDateTimeRange range;
705 void QgsTemporalControllerWidget::setDatesToProjectTime()
707 QgsDateTimeRange range;
714 if ( !range.begin().isValid() || !range.end().isValid() )
724 void QgsTemporalControllerWidget::saveRangeToProject()
727 QStringLiteral(
"/StartDateTime" ), mStartDateTime->dateTime().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODateWithMs ) );
729 QStringLiteral(
"/EndDateTime" ), mEndDateTime->dateTime().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODateWithMs ) );
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
A representation of the interval between two datetime values.
double originalDuration() const
Returns the original interval duration.
bool isValid() const
Returns true if the interval is valid.
double seconds() const
Returns the interval duration in seconds.
QgsUnitTypes::TemporalUnit originalUnit() const
Returns the original interval temporal unit.
The QgsMapLayerModel class is a model to display layers in widgets.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
@ LayerRole
Stores pointer to the map layer itself.
virtual QgsDateTimeRange calculateTemporalExtent(QgsMapLayer *layer) const
Attempts to calculate the overall temporal extent for the specified layer, using the settings defined...
Base class for all map layer types.
void dataSourceChanged()
Emitted whenever the layer's data source has been changed.
virtual QgsMapLayerTemporalProperties * temporalProperties()
Returns the layer's temporal properties.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsDateTimeRange temporalRange() const
Returns the project's temporal range, which indicates the earliest and latest datetime ranges associa...
void setTimeStepUnit(QgsUnitTypes::TemporalUnit unit)
Sets the project's time step (length of one animation frame) unit, which is used as the default value...
void setFramesPerSecond(double rate)
Sets the project's default animation frame rate, in frames per second.
QgsUnitTypes::TemporalUnit timeStepUnit() const
Returns the project's time step (length of one animation frame) unit, which is used as the default va...
void setIsTemporalRangeCumulative(bool state)
Sets the project's temporal range as cumulative in animation settings.
void setTimeStep(double step)
Sets the project's time step (length of one animation frame), which is used as the default value when...
int readNumEntry(const QString &scope, const QString &key, int def=0, bool *ok=nullptr) const
Reads an integer from the specified scope and key.
static QgsProject * instance()
Returns the QgsProject singleton instance.
void cleared()
Emitted when the project is cleared (and additionally when an open project is cleared just before a n...
QString readEntry(const QString &scope, const QString &key, const QString &def=QString(), bool *ok=nullptr) const
Reads a string from the specified scope and key.
void readProject(const QDomDocument &)
Emitted when a project is being read.
bool writeEntry(const QString &scope, const QString &key, bool value)
Write a boolean value to the project file.
void layersAdded(const QList< QgsMapLayer * > &layers)
Emitted when one or more layers were added to the registry.
const QgsProjectTimeSettings * timeSettings() const
Returns the project's time settings, which contains the project's temporal range and other time based...
Represents a raster layer.
void updateTemporalRange(const QgsDateTimeRange &range)
Signals that a temporal range has changed and needs to be updated in all connected objects.
Implements a temporal controller based on a frame by frame navigation and animation.
void previous()
Jumps back to the previous frame.
double framesPerSecond() const
Returns the animation frame rate, in frames per second.
void setAvailableTemporalRanges(const QList< QgsDateTimeRange > &ranges)
Sets the list of all available temporal ranges which have data available.
void setFrameDuration(const QgsInterval &duration)
Sets the frame duration, which dictates the temporal length of each frame in the animation.
void playForward()
Starts the animation playing in a forward direction up till the end of all frames.
NavigationMode
Represents the current temporal navigation mode.
@ NavigationOff
Temporal navigation is disabled.
@ FixedRange
Temporal navigation relies on a fixed datetime range.
@ Animated
Temporal navigation relies on frames within a datetime range.
long long currentFrameNumber() const
Returns the current frame number.
void rewindToStart()
Rewinds the temporal navigation to start of the temporal extent.
void pause()
Pauses the temporal navigation.
void setCurrentFrameNumber(long long frame)
Sets the current animation frame number.
long long totalFrameCount() const
Returns the total number of frames for the navigation.
void skipToEnd()
Skips the temporal navigation to end of the temporal extent.
void temporalFrameDurationChanged(const QgsInterval &interval)
Emitted whenever the frameDuration interval of the controller changes.
void navigationModeChanged(NavigationMode mode)
Emitted whenever the navigation mode changes.
void setFramesPerSecond(double rate)
Sets the animation frame rate, in frames per second.
void stateChanged(AnimationState state)
Emitted whenever the animation state changes.
AnimationState
Represents the current animation state.
@ Forward
Animation is playing forward.
@ Reverse
Animation is playing in reverse.
@ Idle
Animation is paused.
bool temporalRangeCumulative() const
Returns the animation temporal range cumulative settings.
void next()
Advances to the next frame.
void setTemporalExtents(const QgsDateTimeRange &extents)
Sets the navigation temporal extents, which dictate the earliest and latest date time possible in the...
void setTemporalRangeCumulative(bool state)
Sets the animation temporal range as cumulative.
void setLooping(bool loop)
Sets whether the animation should loop after hitting the end or start frame.
void playBackward()
Starts the animation playing in a reverse direction until the beginning of the time range.
void temporalExtentsChanged(const QgsDateTimeRange &extent)
Emitted whenever the temporalExtent extent changes.
void setNavigationMode(const NavigationMode mode)
Sets the temporal navigation mode.
AnimationState animationState() const
Returns the current animation state.
NavigationMode navigationMode() const
Returns the current temporal navigation mode.
bool isActive() const
Returns true if the temporal property is active.
static QgsDateTimeRange calculateTemporalRangeForProject(QgsProject *project)
Calculates the temporal range for a project.
static QList< QgsDateTimeRange > usedTemporalRangesForProject(QgsProject *project)
Calculates all temporal ranges which are in use for a project.
static Q_INVOKABLE QString toString(QgsUnitTypes::DistanceUnit unit)
Returns a translated string representing a distance unit.
static Q_INVOKABLE double fromUnitToUnitFactor(QgsUnitTypes::DistanceUnit fromUnit, QgsUnitTypes::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
TemporalUnit
Temporal units.
@ TemporalUnknownUnit
Unknown time unit.
@ TemporalMilliseconds
Milliseconds.
@ TemporalIrregularStep
Special "irregular step" time unit, used for temporal data which uses irregular, non-real-world unit ...
@ TemporalDecades
Decades.
@ TemporalCenturies
Centuries.
@ TemporalSeconds
Seconds.
@ TemporalMinutes
Minutes.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.