Timeline pause

This commit is contained in:
Dan Paulat 2023-05-27 01:17:19 -05:00
parent 41b9e25ea8
commit ba1de683fa
6 changed files with 79 additions and 36 deletions

View file

@ -42,6 +42,7 @@ public:
TimelineManager* self_;
void Pause();
void Play();
void SelectTime(std::chrono::system_clock::time_point selectedTime = {});
void Step(Direction direction);
@ -55,6 +56,7 @@ public:
std::chrono::minutes loopTime_ {30};
double loopSpeed_ {1.0};
types::AnimationState animationState_ {types::AnimationState::Pause};
boost::asio::steady_timer animationTimer_ {scwx::util::io_context()};
std::mutex animationTimerMutex_ {};
@ -145,6 +147,8 @@ void TimelineManager::AnimationStepBegin()
{
logger_->debug("AnimationStepBegin");
p->Pause();
if (p->viewType_ == types::MapTime::Live ||
p->pinnedTime_ == std::chrono::system_clock::time_point {})
{
@ -162,25 +166,29 @@ void TimelineManager::AnimationStepBack()
{
logger_->debug("AnimationStepBack");
p->Pause();
p->Step(Direction::Back);
}
void TimelineManager::AnimationPlay()
void TimelineManager::AnimationPlayPause()
{
logger_->debug("AnimationPlay");
p->Play();
}
void TimelineManager::AnimationPause()
{
logger_->debug("AnimationPause");
if (p->animationState_ == types::AnimationState::Pause)
{
logger_->debug("AnimationPlay");
p->Play();
}
else
{
logger_->debug("AnimationPause");
p->Pause();
}
}
void TimelineManager::AnimationStepNext()
{
logger_->debug("AnimationStepNext");
p->Pause();
p->Step(Direction::Next);
}
@ -188,6 +196,8 @@ void TimelineManager::AnimationStepEnd()
{
logger_->debug("AnimationStepEnd");
p->Pause();
if (p->viewType_ == types::MapTime::Live)
{
// If the selected view type is live, select the current products
@ -200,10 +210,29 @@ void TimelineManager::AnimationStepEnd()
}
}
void TimelineManager::Impl::Pause()
{
// Cancel animation
std::unique_lock animationTimerLock {animationTimerMutex_};
animationTimer_.cancel();
if (animationState_ != types::AnimationState::Pause)
{
animationState_ = types::AnimationState::Pause;
emit self_->AnimationStateUpdated(animationState_);
}
}
void TimelineManager::Impl::Play()
{
using namespace std::chrono_literals;
if (animationState_ != types::AnimationState::Play)
{
animationState_ = types::AnimationState::Play;
emit self_->AnimationStateUpdated(animationState_);
}
{
std::unique_lock animationTimerLock {animationTimerMutex_};
animationTimer_.cancel();
@ -260,7 +289,10 @@ void TimelineManager::Impl::Play()
{
if (e == boost::system::errc::success)
{
Play();
if (animationState_ == types::AnimationState::Play)
{
Play();
}
}
else if (e == boost::asio::error::operation_aborted)
{