35#include <QRegularExpression>
37#include "moc_qgstemporalcontrollerwidget.cpp"
46 mStartDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
47 mEndDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
48 mFixedRangeStartDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
49 mFixedRangeEndDateTime->setDateTimeRange( QDateTime( QDate( 1, 1, 1 ), QTime( 0, 0, 0 ) ), mStartDateTime->maximumDateTime() );
55 mNavigationObject->rewindToStart();
59 mNavigationObject->previous();
63 mNavigationObject->playBackward();
67 mNavigationObject->pause();
71 mNavigationObject->playForward();
75 mNavigationObject->next();
79 mNavigationObject->skipToEnd();
86 connect( mAnimationLoopingCheckBox, &QCheckBox::toggled,
this, [
this](
bool state ) { mNavigationObject->setLooping( state ); mMovieLoopingCheckBox->setChecked( state ); } );
87 connect( mMovieLoopingCheckBox, &QCheckBox::toggled,
this, [
this](
bool state ) { mNavigationObject->setLooping( state ); mAnimationLoopingCheckBox->setChecked( state ); } );
89 setWidgetStateFromNavigationMode( mNavigationObject->navigationMode() );
93 if ( mBlockFrameDurationUpdates )
96 mBlockFrameDurationUpdates++;
97 updateTimeStepInputs( timeStep );
98 mBlockFrameDurationUpdates--;
100 connect( mNavigationOff, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationOff_clicked );
101 connect( mNavigationFixedRange, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationFixedRange_clicked );
102 connect( mNavigationAnimated, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationAnimated_clicked );
103 connect( mNavigationMovie, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::mNavigationMovie_clicked );
106 mAnimationController->setState( state );
107 mMovieController->setState( state );
110 connect( mStartDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::startEndDateTime_changed );
111 connect( mEndDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::startEndDateTime_changed );
112 connect( mFixedRangeStartDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed );
113 connect( mFixedRangeEndDateTime, &QDateTimeEdit::dateTimeChanged,
this, &QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed );
114 connect( mStepSpinBox, qOverload<double>( &QDoubleSpinBox::valueChanged ),
this, &QgsTemporalControllerWidget::updateFrameDuration );
115 connect( mTimeStepsComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, &QgsTemporalControllerWidget::updateFrameDuration );
116 connect( mAnimationSlider, &QSlider::valueChanged,
this, &QgsTemporalControllerWidget::timeSlider_valueChanged );
117 connect( mMovieSlider, &QSlider::valueChanged,
this, &QgsTemporalControllerWidget::timeSlider_valueChanged );
119 connect( mTotalFramesSpinBox, qOverload<int>( &QSpinBox::valueChanged ),
this, [
this](
int frames ) {
120 mNavigationObject->setTotalMovieFrames( frames );
123 mStepSpinBox->setClearValue( 1 );
128 connect( mSettings, &QPushButton::clicked,
this, &QgsTemporalControllerWidget::settings_clicked );
132 mRangeMenu = std::make_unique<QMenu>(
this );
134 mRangeSetToAllLayersAction =
new QAction( tr(
"Set to Full Range" ), mRangeMenu.get() );
136 connect( mRangeSetToAllLayersAction, &QAction::triggered,
this, &QgsTemporalControllerWidget::mRangeSetToAllLayersAction_triggered );
137 mRangeMenu->addAction( mRangeSetToAllLayersAction );
139 mRangeSetToProjectAction =
new QAction( tr(
"Set to Preset Project Range" ), mRangeMenu.get() );
140 connect( mRangeSetToProjectAction, &QAction::triggered,
this, &QgsTemporalControllerWidget::mRangeSetToProjectAction_triggered );
141 mRangeMenu->addAction( mRangeSetToProjectAction );
143 mRangeMenu->addSeparator();
145 mRangeLayersSubMenu = std::make_unique<QMenu>( tr(
"Set to Single Layer's Range" ), mRangeMenu.get() );
146 mRangeLayersSubMenu->setEnabled(
false );
147 mRangeMenu->addMenu( mRangeLayersSubMenu.get() );
148 connect( mRangeMenu.get(), &QMenu::aboutToShow,
this, &QgsTemporalControllerWidget::aboutToShowRangeMenu );
150 mSetRangeButton->setPopupMode( QToolButton::MenuButtonPopup );
151 mSetRangeButton->setMenu( mRangeMenu.get() );
152 mSetRangeButton->setDefaultAction( mRangeSetToAllLayersAction );
153 mFixedRangeSetRangeButton->setPopupMode( QToolButton::MenuButtonPopup );
154 mFixedRangeSetRangeButton->setMenu( mRangeMenu.get() );
155 mFixedRangeSetRangeButton->setDefaultAction( mRangeSetToAllLayersAction );
165 if ( range.
begin().isValid() && range.
end().isValid() )
195 mStepSpinBox->setDecimals( 3 );
197 mStepSpinBox->setMinimum( 0.001 );
198 mStepSpinBox->setMaximum( std::numeric_limits<int>::max() );
199 mStepSpinBox->setSingleStep( 1 );
200 mStepSpinBox->setValue( 1 );
202 updateFrameDuration();
216 if ( ( mAnimationSlider->hasFocus() || mMovieSlider->hasFocus() ) && e->key() == Qt::Key_Space )
218 mAnimationController->togglePause();
224void QgsTemporalControllerWidget::aboutToShowRangeMenu()
229 mRangeSetToProjectAction->setEnabled( projectRange.
begin().isValid() && projectRange.
end().isValid() );
231 mRangeLayersSubMenu->clear();
232 for (
int i = 0; i < mMapLayerModel->
rowCount(); ++i )
234 const QModelIndex index = mMapLayerModel->
index( i, 0 );
239 const QIcon icon = qvariant_cast<QIcon>( mMapLayerModel->
data( index, Qt::DecorationRole ) );
240 const QString text = mMapLayerModel->
data( index, Qt::DisplayRole ).toString();
242 if ( range.
begin().isValid() && range.
end().isValid() )
244 QAction *action =
new QAction( icon, text, mRangeLayersSubMenu.get() );
245 connect( action, &QAction::triggered,
this, [
this, range] {
247 saveRangeToProject();
249 mRangeLayersSubMenu->addAction( action );
252 mRangeLayersSubMenu->setEnabled( !mRangeLayersSubMenu->actions().isEmpty() );
255void QgsTemporalControllerWidget::updateTemporalExtent()
259 const QDateTime start = mStartDateTime->dateTime();
260 const QDateTime end = mEndDateTime->dateTime();
261 const bool isTimeInstant = start == end;
263 mNavigationObject->setTemporalExtents( temporalExtent );
264 mAnimationSlider->setRange( 0, mNavigationObject->totalFrameCount() - 1 );
265 mAnimationSlider->setValue( mNavigationObject->currentFrameNumber() );
266 mMovieSlider->setRange( 0, mNavigationObject->totalFrameCount() - 1 );
267 mMovieSlider->setValue( mNavigationObject->currentFrameNumber() );
270void QgsTemporalControllerWidget::updateFrameDuration()
272 if ( mBlockSettingUpdates )
280 if ( !mBlockFrameDurationUpdates )
282 mNavigationObject->setFrameDuration(
285 mAnimationSlider->setValue( mNavigationObject->currentFrameNumber() );
287 mAnimationSlider->setRange( 0, mNavigationObject->totalFrameCount() - 1 );
288 mAnimationSlider->setValue( mNavigationObject->currentFrameNumber() );
289 mMovieSlider->setRange( 0, mNavigationObject->totalFrameCount() - 1 );
290 mMovieSlider->setValue( mNavigationObject->currentFrameNumber() );
294 mStepSpinBox->setEnabled(
false );
295 mStepSpinBox->setValue( 1 );
296 mAnimationSlider->setTickInterval( 1 );
297 mAnimationSlider->setTickPosition( QSlider::TicksBothSides );
301 mStepSpinBox->setEnabled(
true );
302 mAnimationSlider->setTickInterval( 0 );
303 mAnimationSlider->setTickPosition( QSlider::NoTicks );
307void QgsTemporalControllerWidget::setWidgetStateFromProject()
309 mBlockSettingUpdates++;
312 mBlockSettingUpdates--;
318 mNavigationObject->setNavigationMode( mode );
319 setWidgetStateFromNavigationMode( mode );
327 mNavigationObject->setTotalMovieFrames(
QgsProject::instance()->timeSettings()->totalMovieFrames() );
330 const QString startString =
QgsProject::instance()->
readEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/StartDateTime" ) );
331 const QString endString =
QgsProject::instance()->
readEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/EndDateTime" ) );
332 if ( !startString.isEmpty() && !endString.isEmpty() )
334 whileBlocking( mStartDateTime )->setDateTime( QDateTime::fromString( startString, Qt::ISODateWithMs ) );
335 whileBlocking( mEndDateTime )->setDateTime( QDateTime::fromString( endString, Qt::ISODateWithMs ) );
336 whileBlocking( mFixedRangeStartDateTime )->setDateTime( QDateTime::fromString( startString, Qt::ISODateWithMs ) );
337 whileBlocking( mFixedRangeEndDateTime )->setDateTime( QDateTime::fromString( endString, Qt::ISODateWithMs ) );
341 setDatesToProjectTime(
false );
343 updateTemporalExtent();
344 updateFrameDuration();
346 mNavigationObject->setFramesPerSecond(
QgsProject::instance()->timeSettings()->framesPerSecond() );
347 mNavigationObject->setTemporalRangeCumulative(
QgsProject::instance()->timeSettings()->isTemporalRangeCumulative() );
350void QgsTemporalControllerWidget::mNavigationOff_clicked()
358void QgsTemporalControllerWidget::mNavigationFixedRange_clicked()
366void QgsTemporalControllerWidget::mNavigationAnimated_clicked()
374void QgsTemporalControllerWidget::mNavigationMovie_clicked()
392 mNavigationModeStackedWidget->setCurrentIndex( 0 );
395 mNavigationModeStackedWidget->setCurrentIndex( 1 );
398 mNavigationModeStackedWidget->setCurrentIndex( 2 );
401 mNavigationModeStackedWidget->setCurrentIndex( 3 );
406void QgsTemporalControllerWidget::onLayersAdded(
const QList<QgsMapLayer *> &layers )
408 if ( !mHasTemporalLayersLoaded )
410 for ( QgsMapLayer *layer : layers )
412 if ( layer->temporalProperties() )
414 mHasTemporalLayersLoaded |= layer->temporalProperties()->isActive();
416 if ( !mHasTemporalLayersLoaded )
419 if ( layer->isValid() && layer->temporalProperties()->isActive() && !mHasTemporalLayersLoaded )
421 mHasTemporalLayersLoaded =
true;
422 firstTemporalLayerLoaded( layer );
428 firstTemporalLayerLoaded( layer );
436void QgsTemporalControllerWidget::firstTemporalLayerLoaded(
QgsMapLayer *layer )
438 setDatesToProjectTime(
true );
440 if ( QgsMeshLayer *meshLayer = qobject_cast<QgsMeshLayer *>( layer ) )
442 mBlockFrameDurationUpdates++;
443 setTimeStep( meshLayer->firstValidTimeStep() );
444 mBlockFrameDurationUpdates--;
445 updateFrameDuration();
447 else if ( QgsRasterLayer *rasterLayer = qobject_cast<QgsRasterLayer *>( layer ) )
449 if ( rasterLayer->dataProvider() && rasterLayer->dataProvider()->temporalCapabilities() )
451 mBlockFrameDurationUpdates++;
452 setTimeStep( rasterLayer->dataProvider()->temporalCapabilities()->defaultInterval() );
453 mBlockFrameDurationUpdates--;
454 updateFrameDuration();
459void QgsTemporalControllerWidget::onProjectCleared()
461 mHasTemporalLayersLoaded =
false;
468 const QTime startOfCurrentHour = QTime( QTime::currentTime().hour(), 0, 0 );
469 const QDateTime end = QDateTime( QDate::currentDate(), startOfCurrentHour, Qt::UTC );
470 const QDateTime start = end.addSecs( -24 * 60 * 60 );
474 whileBlocking( mFixedRangeStartDateTime )->setDateTime( start );
477 updateTemporalExtent();
479 mStepSpinBox->setValue( 1 );
482void QgsTemporalControllerWidget::updateSlider(
const QgsDateTimeRange &range )
484 whileBlocking( mAnimationSlider )->setValue( mNavigationObject->currentFrameNumber() );
485 whileBlocking( mMovieSlider )->setValue( mNavigationObject->currentFrameNumber() );
486 updateRangeLabel( range );
489void QgsTemporalControllerWidget::totalMovieFramesChanged(
long long frames )
492 mTotalFramesSpinBox->setValue( frames );
493 mCurrentRangeLabel->setText( tr(
"Current frame: %1/%2" ).arg( mNavigationObject->currentFrameNumber() ).arg( frames ) );
496void QgsTemporalControllerWidget::updateRangeLabel(
const QgsDateTimeRange &range )
498 QString timeFrameFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss" );
501 timeFrameFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss.zzz" );
502 switch ( mNavigationObject->navigationMode() )
505 mCurrentRangeLabel->setText( tr(
"Current frame: %1 ≤ <i>t</i> < %2" ).arg( range.
begin().toString( timeFrameFormat ), range.
end().toString( timeFrameFormat ) ) );
508 mCurrentRangeLabel->setText( tr(
"Range: %1 ≤ <i>t</i> < %2" ).arg( range.
begin().toString( timeFrameFormat ), range.
end().toString( timeFrameFormat ) ) );
511 mCurrentRangeLabel->setText( tr(
"Temporal navigation disabled" ) );
514 mCurrentRangeLabel->setText( tr(
"Current frame: %1/%2" ).arg( mNavigationObject->currentFrameNumber() ).arg( mNavigationObject->totalMovieFrames() ) );
521 return mNavigationObject;
524void QgsTemporalControllerWidget::settings_clicked()
526 QgsTemporalMapSettingsWidget *settingsWidget =
new QgsTemporalMapSettingsWidget(
this );
527 settingsWidget->setFrameRateValue( mNavigationObject->
framesPerSecond() );
530 connect( settingsWidget, &QgsTemporalMapSettingsWidget::frameRateChanged,
this, [
this](
double rate ) {
536 connect( settingsWidget, &QgsTemporalMapSettingsWidget::temporalRangeCumulativeChanged,
this, [
this](
bool state ) {
539 mNavigationObject->setTemporalRangeCumulative( state );
544void QgsTemporalControllerWidget::timeSlider_valueChanged(
int value )
546 mNavigationObject->setCurrentFrameNumber( value );
549void QgsTemporalControllerWidget::startEndDateTime_changed()
551 whileBlocking( mFixedRangeStartDateTime )->setDateTime( mStartDateTime->dateTime() );
552 whileBlocking( mFixedRangeEndDateTime )->setDateTime( mEndDateTime->dateTime() );
554 updateTemporalExtent();
555 saveRangeToProject();
558void QgsTemporalControllerWidget::fixedRangeStartEndDateTime_changed()
560 whileBlocking( mStartDateTime )->setDateTime( mFixedRangeStartDateTime->dateTime() );
561 whileBlocking( mEndDateTime )->setDateTime( mFixedRangeEndDateTime->dateTime() );
563 updateTemporalExtent();
564 saveRangeToProject();
567void QgsTemporalControllerWidget::mRangeSetToAllLayersAction_triggered()
569 setDatesToAllLayers();
570 saveRangeToProject();
573void QgsTemporalControllerWidget::setTimeStep(
const QgsInterval &timeStep )
578 int selectedUnit = -1;
579 double selectedValue = std::numeric_limits<double>::max();
585 int stringSize = std::numeric_limits<int>::max();
586 const int precision = mStepSpinBox->decimals();
587 for (
int i = 0; i < mTimeStepsComboBox->count(); ++i )
591 QString
string = QString::number( value,
'f', precision );
593 const thread_local QRegularExpression trailingZeroRegEx = QRegularExpression( QStringLiteral(
"0+$" ) );
595 string.remove( trailingZeroRegEx );
597 const thread_local QRegularExpression trailingPointRegEx = QRegularExpression( QStringLiteral(
"[.]+$" ) );
599 string.remove( trailingPointRegEx );
602 &&
string.size() <= stringSize
603 && value < selectedValue )
606 selectedValue = value;
607 stringSize =
string.size();
609 else if (
string !=
'0'
610 &&
string.size() < precision + 2
611 &&
string.size() < stringSize )
614 selectedValue = value;
615 stringSize =
string.size();
621 selectedUnit = mTimeStepsComboBox->findData(
static_cast<int>( timeStep.
originalUnit() ) );
625 if ( selectedUnit >= 0 )
627 mStepSpinBox->setValue( selectedValue );
628 mTimeStepsComboBox->setCurrentIndex( selectedUnit );
631 updateFrameDuration();
634void QgsTemporalControllerWidget::updateTimeStepInputs(
const QgsInterval &timeStep )
639 QString timeDisplayFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss" );
642 timeDisplayFormat = QStringLiteral(
"yyyy-MM-dd HH:mm:ss.zzz" );
644 updateTemporalExtent();
646 mStartDateTime->setDisplayFormat( timeDisplayFormat );
647 mEndDateTime->setDisplayFormat( timeDisplayFormat );
648 mFixedRangeStartDateTime->setDisplayFormat( timeDisplayFormat );
649 mFixedRangeEndDateTime->setDisplayFormat( timeDisplayFormat );
652 if ( timeStep == QgsInterval( mStepSpinBox->value(),
static_cast<Qgis::TemporalUnit>( mTimeStepsComboBox->currentData().toInt() ) ) )
658 mTimeStepsComboBox->setCurrentIndex( mTimeStepsComboBox->findData(
static_cast<int>( timeStep.
originalUnit() ) ) );
661 updateFrameDuration();
664void QgsTemporalControllerWidget::mRangeSetToProjectAction_triggered()
666 setDatesToProjectTime(
false );
667 saveRangeToProject();
672 if ( range.
begin().isValid() && range.
end().isValid() )
678 updateTemporalExtent();
682void QgsTemporalControllerWidget::setDatesToAllLayers()
691void QgsTemporalControllerWidget::setDatesToProjectTime(
bool tryLastStoredRange )
695 if ( tryLastStoredRange )
697 const QString startString =
QgsProject::instance()->
readEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/StartDateTime" ) );
698 const QString endString =
QgsProject::instance()->
readEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/EndDateTime" ) );
699 if ( !startString.isEmpty() && !endString.isEmpty() )
701 range =
QgsDateTimeRange( QDateTime::fromString( startString, Qt::ISODateWithMs ), QDateTime::fromString( endString, Qt::ISODateWithMs ) );
710 if ( !range.
begin().isValid() || !range.
end().isValid() )
720void QgsTemporalControllerWidget::saveRangeToProject()
722 QgsProject::instance()->
writeEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/StartDateTime" ), mStartDateTime->dateTime().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODateWithMs ) );
723 QgsProject::instance()->
writeEntry( QStringLiteral(
"TemporalControllerWidget" ), QStringLiteral(
"/EndDateTime" ), mEndDateTime->dateTime().toTimeSpec( Qt::OffsetFromUTC ).toString( Qt::ISODateWithMs ) );
TemporalNavigationMode
Temporal navigation modes.
@ Animated
Temporal navigation relies on frames within a datetime range.
@ Movie
Movie mode – behaves like a video player, with a fixed frame duration and no temporal range.
@ FixedRange
Temporal navigation relies on a fixed datetime range.
@ Disabled
Temporal navigation is disabled.
PlaybackOperation
Media playback operations.
@ PlayReverse
Play in reverse.
@ PlayForward
Play forward.
@ SkipToStart
Jump to start of playback.
@ PreviousFrame
Step to previous frame.
@ SkipToEnd
Jump to end of playback.
@ NextFrame
Step to next frame.
TemporalUnit
Temporal units.
@ IrregularStep
Special 'irregular step' time unit, used for temporal data which uses irregular, non-real-world unit ...
@ Milliseconds
Milliseconds.
@ Unknown
Unknown time unit.
AnimationState
Animation states.
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.
Qgis::TemporalUnit originalUnit() const
Returns the original interval temporal unit.
A model for display of map 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
@ Layer
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.
QgsDateTimeRange temporalRange() const
Returns the project's temporal range, which indicates the earliest and latest datetime ranges associa...
void setTotalMovieFrames(long long frames)
Sets the total number of frames for the movie.
void setFramesPerSecond(double rate)
Sets the project's default animation frame rate, in frames per second.
Qgis::TemporalUnit timeStepUnit() const
Returns the project's time step (length of one animation frame) unit, which is used as the default va...
void setTimeStepUnit(Qgis::TemporalUnit unit)
Sets the project's time step (length of one animation frame) unit, which is used as the default value...
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.
bool writeEntry(const QString &scope, const QString &key, bool value)
Write a boolean value to the project file.
void readProject(const QDomDocument &document)
Emitted when a project is being read.
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...
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 stateChanged(Qgis::AnimationState state)
Emitted whenever the animation state changes.
double framesPerSecond() const
Returns the animation frame rate, in frames per second.
void navigationModeChanged(Qgis::TemporalNavigationMode mode)
Emitted whenever the navigation mode changes.
void temporalFrameDurationChanged(const QgsInterval &interval)
Emitted whenever the frameDuration interval of the controller changes.
void setFramesPerSecond(double rate)
Sets the animation frame rate, in frames per second.
bool temporalRangeCumulative() const
Returns the animation temporal range cumulative settings.
void totalMovieFramesChanged(long long frames)
Emitted whenever the total number of frames in the movie is changed.
void temporalExtentsChanged(const QgsDateTimeRange &extent)
Emitted whenever the temporalExtent extent changes.
bool isActive() const
Returns true if the temporal property is active.
T begin() const
Returns the beginning of the range.
T end() const
Returns the upper bound of the range.
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(Qgis::DistanceUnit unit)
Returns a translated string representing a distance unit.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.