19#include "moc_qgstemporalnavigationobject.cpp" 
   27  mNewFrameTimer = 
new QTimer( 
this );
 
   29  connect( mNewFrameTimer, &QTimer::timeout,
 
   30           this, &QgsTemporalNavigationObject::timerTimeout );
 
 
   33void QgsTemporalNavigationObject::timerTimeout()
 
   35  switch ( mPlayBackMode )
 
   42          mCurrentFrameNumber = -1; 
 
   50      if ( mCurrentFrameNumber <= 0 )
 
   67  return mTotalMovieFrames;
 
 
   72  if ( frames == mTotalMovieFrames )
 
   75  mTotalMovieFrames = frames;
 
 
   83  return mLoopAnimation;
 
 
   88  mLoopAnimation = loopAnimation;
 
 
   93  auto scope = std::make_unique< QgsExpressionContextScope >( QStringLiteral( 
"temporal" ) );
 
   94  scope->setVariable( QStringLiteral( 
"frame_rate" ), mFramesPerSecond, 
true );
 
   95  scope->setVariable( QStringLiteral( 
"frame_number" ), mCurrentFrameNumber, 
true );
 
   96  scope->setVariable( QStringLiteral( 
"frame_duration" ), mFrameDuration, 
true );
 
   97  scope->setVariable( QStringLiteral( 
"frame_timestep" ), mFrameDuration.
originalDuration(), 
true );
 
   98  scope->setVariable( QStringLiteral( 
"frame_timestep_unit" ), 
static_cast< int >( mFrameDuration.
originalUnit() ), 
true );
 
  100  scope->setVariable( QStringLiteral( 
"animation_start_time" ), mTemporalExtents.
begin(), 
true );
 
  101  scope->setVariable( QStringLiteral( 
"animation_end_time" ), mTemporalExtents.
end(), 
true );
 
  102  scope->setVariable( QStringLiteral( 
"animation_interval" ), 
QgsInterval( mTemporalExtents.
end() - mTemporalExtents.
begin() ), 
true );
 
  103  scope->setVariable( QStringLiteral( 
"total_frame_count" ), 
totalFrameCount() );
 
  105  scope->addHiddenVariable( QStringLiteral( 
"frame_timestep_unit" ) );
 
  107  return scope.release();
 
 
  112  const QDateTime start = mTemporalExtents.
begin();
 
  117  const long long nextFrame = frame + 1;
 
  123    if ( mAllRanges.empty() )
 
  126    return frame < mAllRanges.size() ? mAllRanges.at( frame ) : mAllRanges.constLast();
 
  134  QDateTime frameStart = begin;
 
  136  if ( mCumulativeTemporalRange )
 
 
  144  if ( mNavigationMode == mode )
 
  147  mNavigationMode = mode;
 
  150  if ( !mBlockUpdateTemporalRangeSignal )
 
  152    switch ( mNavigationMode )
 
 
  179  switch ( mNavigationMode )
 
  191      if ( !mBlockUpdateTemporalRangeSignal )
 
 
  203  return mTemporalExtents;
 
 
  218  if ( mCurrentFrameNumber != frameNumber )
 
  220    mCurrentFrameNumber = std::max( 0LL, std::min( frameNumber, 
totalFrameCount() - 1 ) );
 
  223    if ( !mBlockUpdateTemporalRangeSignal )
 
 
  230  return mCurrentFrameNumber;
 
 
  255  return mFrameDuration;
 
 
  260  if ( framesPerSeconds > 0 )
 
  262    mFramesPerSecond = framesPerSeconds;
 
  263    mNewFrameTimer->setInterval( 
static_cast< int >( ( 1.0 / mFramesPerSecond ) * 1000 ) );
 
 
  269  return mFramesPerSecond;
 
 
  274  if ( mCumulativeTemporalRange == state )
 
  277  mCumulativeTemporalRange = state;
 
 
  287  return mCumulativeTemporalRange;
 
 
  292  mNewFrameTimer->start( 
static_cast< int >( ( 1.0 / mFramesPerSecond ) * 1000 ) );
 
 
  297  mNewFrameTimer->stop();
 
 
  349    return mTotalMovieFrames;
 
  353    return mAllRanges.count();
 
  357    const QgsInterval totalAnimationLength = mTemporalExtents.
end() - mTemporalExtents.
begin();
 
  358    return static_cast< long long >( std::ceil( totalAnimationLength.
seconds() / mFrameDuration.
seconds() ) );
 
 
  364  if ( mode != mPlayBackMode )
 
  366    mPlayBackMode = mode;
 
 
  373  return mPlayBackMode;
 
 
  378  long long bestFrame = 0;
 
  383      if ( range.contains( frameStart ) )
 
  385      else if ( range.begin() > frameStart )
 
  387        return std::max( 0LL, bestFrame - 1 );
 
  390    return mAllRanges.count() - 1;
 
  396    long long roughFrameStart = 0;
 
  404      if ( mTemporalExtents.
contains( frameStart ) )
 
  406        roughFrameStart = 
static_cast< long long >( std::floor( 
QgsInterval( frameStart - mTemporalExtents.
begin() ).
seconds() / mFrameDuration.
seconds() ) );
 
  408      roughFrameEnd = roughFrameStart + 100; 
 
  410    for ( 
long long i = roughFrameStart; i < roughFrameEnd; ++i )
 
 
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.
 
@ IrregularStep
Special 'irregular step' time unit, used for temporal data which uses irregular, non-real-world unit ...
 
AnimationState
Animation states.
 
@ Forward
Animation is playing forward.
 
@ Reverse
Animation is playing in reverse.
 
@ Idle
Animation is paused.
 
Single scope for storing variables and functions for use within a QgsExpressionContext.
 
A representation of the interval between two datetime values.
 
double originalDuration() const
Returns the original interval duration.
 
double seconds() const
Returns the interval duration in seconds.
 
Qgis::TemporalUnit originalUnit() const
Returns the original interval temporal unit.
 
A controller base class for temporal objects, contains a signal for notifying updates of the objects ...
 
void updateTemporalRange(const QgsDateTimeRange &range)
Signals that a temporal range has changed and needs to be updated in all connected objects.
 
void stateChanged(Qgis::AnimationState state)
Emitted whenever the animation state changes.
 
bool isLooping() const
Returns true if the animation should loop after hitting the end or start frame.
 
long long totalMovieFrames() const
Returns the total number of frames for the movie.
 
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.
 
long long findBestFrameNumberForFrameStart(const QDateTime &frameStart) const
Returns the best suited frame number for the specified datetime, based on the start of the correspond...
 
void navigationModeChanged(Qgis::TemporalNavigationMode mode)
Emitted whenever the navigation mode changes.
 
void setNavigationMode(const Qgis::TemporalNavigationMode mode)
Sets the temporal navigation mode.
 
QgsExpressionContextScope * createExpressionContextScope() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
 
void playForward()
Starts the animation playing in a forward direction up till the end of all frames.
 
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.
 
Qgis::AnimationState animationState() const
Returns the current animation state.
 
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 setFramesPerSecond(double rate)
Sets the animation frame rate, in frames per second.
 
QgsDateTimeRange temporalExtents() const
Returns the navigation temporal extents, which dictate the earliest and latest date time possible in ...
 
bool temporalRangeCumulative() const
Returns the animation temporal range cumulative settings.
 
void next()
Advances to the next frame.
 
void totalMovieFramesChanged(long long frames)
Emitted whenever the total number of frames in the movie is changed.
 
void setTotalMovieFrames(long long frames)
Sets the total number of frames for the movie.
 
QgsDateTimeRange dateTimeRangeForFrameNumber(long long frame) const
Calculates the temporal range associated with a particular animation 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.
 
QList< QgsDateTimeRange > availableTemporalRanges() const
Returns the list of all available temporal ranges which have data available.
 
void play()
Starts playing the temporal navigation from its current frame, using the direction specified by anima...
 
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.
 
QgsTemporalNavigationObject(QObject *parent=nullptr)
Constructor for QgsTemporalNavigationObject, with the specified parent object.
 
void setAnimationState(Qgis::AnimationState state)
Sets the current animation state.
 
QgsInterval frameDuration() const
Returns the current set frame duration, which dictates the temporal length of each frame in the anima...
 
T begin() const
Returns the beginning of the range.
 
bool contains(const QgsTemporalRange< T > &other) const
Returns true if this range contains another range.
 
T end() const
Returns the upper bound of the range.
 
bool overlaps(const QgsTemporalRange< T > &other) const
Returns true if this range overlaps another range.
 
static QDateTime calculateFrameTime(const QDateTime &start, const long long frame, const QgsInterval &interval)
Calculates the frame time for an animation.
 
static Q_INVOKABLE QString toString(Qgis::DistanceUnit unit)
Returns a translated string representing a distance unit.
 
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.