diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgToolButton.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgToolButton.hpp index 769a4a75..49fe50fd 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgToolButton.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgToolButton.hpp @@ -56,6 +56,13 @@ namespace Bloom::Widgets return this->buttonHeight; } + void startSpin() { + this->svgWidget->startSpin(); + } + + void stopSpin() { + this->svgWidget->stopSpin(); + } protected: void childEvent(QChildEvent* childEvent) override; diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgWidget.cpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgWidget.cpp index bd9df271..60e74744 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgWidget.cpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgWidget.cpp @@ -9,6 +9,28 @@ SvgWidget::SvgWidget(QWidget* parent): QFrame(parent) { this->renderer.setAspectRatioMode(Qt::AspectRatioMode::KeepAspectRatioByExpanding); } +void SvgWidget::startSpin() { + if (this->spinningAnimation == nullptr) { + this->spinningAnimation = new QPropertyAnimation(this, "angle", this); + this->spinningAnimation->setDuration(2000); + this->spinningAnimation->setStartValue(0); + this->spinningAnimation->setEndValue(360); + + QObject::connect(this->spinningAnimation, &QPropertyAnimation::finished, this, [this] { + this->spinningAnimation->start(); + }); + } + + this->spinningAnimation->start(); +} + +void SvgWidget::stopSpin() { + if (this->spinningAnimation != nullptr) { + this->spinningAnimation->stop(); + this->setAngle(0); + } +} + void SvgWidget::paintEvent(QPaintEvent* paintEvent) { auto painter = QPainter(this); auto svgSize = this->renderer.defaultSize(); diff --git a/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgWidget.hpp b/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgWidget.hpp index 8860d249..5a96b43f 100644 --- a/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgWidget.hpp +++ b/src/Insight/UserInterfaces/InsightWindow/Widgets/SvgWidget.hpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace Bloom::Widgets { @@ -57,12 +58,29 @@ namespace Bloom::Widgets void setAngle(int angle) { this->angle = angle; + + if (this->spinningAnimation != nullptr) { + this->update(); + } } [[nodiscard]] int getAngle() const { return this->angle; } + /** + * Starts a spinning animation, where the widget will rotate on its center, indefinitely. + * + * This is typically used in SvgToolButton instances, where the spinning of the tool button icon indicates + * some action being in progress (see the refresh tool button in the TargetMemoryInspectionPane widget). + */ + void startSpin(); + + /** + * Stops the spinning animation. + */ + void stopSpin(); + protected: void paintEvent(QPaintEvent* paintEvent) override; void changeEvent(QEvent* event) override; @@ -74,5 +92,6 @@ namespace Bloom::Widgets int containerWidth = 0; int containerHeight = 0; int angle = 0; + QPropertyAnimation* spinningAnimation = nullptr; }; }