From 5453997208f13ce00e74373290beea48198f469d Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 13 May 2023 00:41:32 -0500 Subject: [PATCH] Adding animation control signals --- .../scwx/qt/ui/animation_dock_widget.cpp | 119 +++++++++++++++++- .../scwx/qt/ui/animation_dock_widget.hpp | 18 +++ 2 files changed, 134 insertions(+), 3 deletions(-) diff --git a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.cpp b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.cpp index a427f310..f5edab98 100644 --- a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.cpp @@ -15,16 +15,31 @@ namespace ui static const std::string logPrefix_ = "scwx::qt::ui::animation_dock_widget"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); +enum class AnimationState +{ + Play, + Pause +}; + class AnimationDockWidgetImpl { public: - explicit AnimationDockWidgetImpl() = default; - ~AnimationDockWidgetImpl() = default; + explicit AnimationDockWidgetImpl(AnimationDockWidget* self) : self_ {self} {} + ~AnimationDockWidgetImpl() = default; + + AnimationDockWidget* self_; + + AnimationState animationState_ {AnimationState::Pause}; + + std::chrono::sys_days selectedDate_ {}; + std::chrono::seconds selectedTime_ {}; + + void ConnectSignals(); }; AnimationDockWidget::AnimationDockWidget(QWidget* parent) : QDockWidget(parent), - p {std::make_unique()}, + p {std::make_unique(this)}, ui(new Ui::AnimationDockWidget) { ui->setupUi(this); @@ -66,6 +81,9 @@ AnimationDockWidget::AnimationDockWidget(QWidget* parent) : // Evaluate every 15 seconds, every second is unnecessary maxDateTimer->start(15000); + + // Connect widget signals + p->ConnectSignals(); } AnimationDockWidget::~AnimationDockWidget() @@ -73,6 +91,101 @@ AnimationDockWidget::~AnimationDockWidget() delete ui; } +void AnimationDockWidgetImpl::ConnectSignals() +{ + // View type + QObject::connect(self_->ui->liveViewRadioButton, + &QRadioButton::toggled, + self_, + [this](bool checked) + { + if (checked) + { + emit self_->ViewTypeChanged(types::MapTime::Live); + } + }); + QObject::connect(self_->ui->archiveViewRadioButton, + &QRadioButton::toggled, + self_, + [this](bool checked) + { + if (checked) + { + emit self_->ViewTypeChanged(types::MapTime::Archive); + } + }); + + // Date/time controls + QObject::connect( // + self_->ui->dateEdit, + &QDateTimeEdit::dateChanged, + self_, + [this](QDate date) + { + if (date.isValid()) + { + selectedDate_ = date.toStdSysDays(); + emit self_->DateTimeChanged(selectedDate_ + selectedTime_); + } + }); + QObject::connect( + self_->ui->timeEdit, + &QDateTimeEdit::timeChanged, + self_, + [this](QTime time) + { + if (time.isValid()) + { + selectedTime_ = + std::chrono::seconds(time.msecsSinceStartOfDay() / 1000); + emit self_->DateTimeChanged(selectedDate_ + selectedTime_); + } + }); + + // Loop controls + QObject::connect(self_->ui->loopTimeSpinBox, + &QSpinBox::valueChanged, + self_, + [this](int i) + { emit self_->LoopTimeChanged(std::chrono::minutes(i)); }); + QObject::connect(self_->ui->loopSpeedSpinBox, + &QDoubleSpinBox::valueChanged, + self_, + [this](double d) { emit self_->LoopSpeedChanged(d); }); + + // Animation controls + QObject::connect(self_->ui->beginButton, + &QAbstractButton::clicked, + self_, + [this]() { emit self_->AnimationStepBeginSelected(); }); + QObject::connect(self_->ui->stepBackButton, + &QAbstractButton::clicked, + self_, + [this]() { emit self_->AnimationStepBackSelected(); }); + QObject::connect(self_->ui->playButton, + &QAbstractButton::clicked, + self_, + [this]() + { + if (animationState_ == AnimationState::Pause) + { + emit self_->AnimationPlaySelected(); + } + else + { + emit self_->AnimationPauseSelected(); + } + }); + QObject::connect(self_->ui->stepNextButton, + &QAbstractButton::clicked, + self_, + [this]() { emit self_->AnimationStepNextSelected(); }); + QObject::connect(self_->ui->endButton, + &QAbstractButton::clicked, + self_, + [this]() { emit self_->AnimationStepEndSelected(); }); +} + } // namespace ui } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.hpp b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.hpp index c8b33d5a..a054e592 100644 --- a/scwx-qt/source/scwx/qt/ui/animation_dock_widget.hpp +++ b/scwx-qt/source/scwx/qt/ui/animation_dock_widget.hpp @@ -1,5 +1,9 @@ #pragma once +#include + +#include + #include namespace Ui @@ -24,6 +28,20 @@ public: explicit AnimationDockWidget(QWidget* parent = nullptr); ~AnimationDockWidget(); +signals: + void ViewTypeChanged(types::MapTime viewType); + void DateTimeChanged(std::chrono::system_clock::time_point dateTime); + + void LoopTimeChanged(std::chrono::minutes loopTime); + void LoopSpeedChanged(double loopSpeed); + + void AnimationStepBeginSelected(); + void AnimationStepBackSelected(); + void AnimationPauseSelected(); + void AnimationPlaySelected(); + void AnimationStepNextSelected(); + void AnimationStepEndSelected(); + private: friend class AnimationDockWidgetImpl; std::unique_ptr p;