diff --git a/src/SettingsDialog.cpp b/src/SettingsDialog.cpp index 0562dedf..4160525b 100644 --- a/src/SettingsDialog.cpp +++ b/src/SettingsDialog.cpp @@ -139,6 +139,12 @@ void Settings::setupAppearanceTab() { emit updateBalance(); }); + // [Prefer reduced motion] wowlet: gate playful animations (mining tab, loaders, ...) + ui->checkBox_reducedMotion->setChecked(conf()->get(Config::reducedMotion).toBool()); + connect(ui->checkBox_reducedMotion, &QCheckBox::toggled, [this](bool toggled){ + conf()->set(Config::reducedMotion, toggled); + }); + // [Preferred fiat currency] QStringList availableFiatCurrencies = appData()->prices.rates.keys(); for (const auto ¤cy : availableFiatCurrencies) { diff --git a/src/SettingsDialog.ui b/src/SettingsDialog.ui index b9ee7512..17173b65 100644 --- a/src/SettingsDialog.ui +++ b/src/SettingsDialog.ui @@ -159,6 +159,13 @@ + + + + Prefer reduced motion (disable playful animations) + + + diff --git a/src/assets/qml/mining.qml b/src/assets/qml/mining.qml index 5a659464..f75bcc30 100644 --- a/src/assets/qml/mining.qml +++ b/src/assets/qml/mining.qml @@ -35,6 +35,7 @@ Rectangle { } AnimatedImage { + playing: !mining.reducedMotion // wowlet: respect reduced-motion //visible: mining.daemonMiningState === 0 source: "qrc:/mining/bg1.gif" fillMode: Image.PreserveAspectCrop @@ -195,6 +196,7 @@ Rectangle { } AnimatedImage { + playing: !mining.reducedMotion // wowlet: respect reduced-motion visible: mining.daemonMiningState !== 0 source: "qrc:/mining/mining.webp" fillMode: Image.PreserveAspectCrop @@ -436,6 +438,7 @@ Rectangle { smooth: false AnimatedImage { + playing: !mining.reducedMotion // wowlet: respect reduced-motion source: mining.daemonMiningState === 0 ? "qrc:/assets/images/dog_sitting.gif" : "qrc:/assets/images/dog_running.gif" width: 80 height: 60 @@ -546,6 +549,7 @@ Rectangle { } AnimatedImage { + playing: !mining.reducedMotion // wowlet: respect reduced-motion visible: mining.daemonMiningState !== 0 source: "qrc:/mining/elmo.gif" width: 106 diff --git a/src/utils/config.cpp b/src/utils/config.cpp index 36dc0589..c96b5a1e 100644 --- a/src/utils/config.cpp +++ b/src/utils/config.cpp @@ -30,6 +30,7 @@ static const QHash configStrings = { {Config::homeWidget,{QS("homeWidget"), "ccs"}}, {Config::donateBeg,{QS("donateBeg"), 1}}, {Config::showHistorySyncNotice, {QS("showHistorySyncNotice"), true}}, + {Config::reducedMotion, {QS("reducedMotion"), false}}, {Config::geometry, {QS("geometry"), {}}}, {Config::windowState, {QS("windowState"), {}}}, diff --git a/src/utils/config.h b/src/utils/config.h index 0cd30b2c..b37ff383 100644 --- a/src/utils/config.h +++ b/src/utils/config.h @@ -29,6 +29,7 @@ public: homeWidget, donateBeg, showHistorySyncNotice, + reducedMotion, // wowlet: disable playful animations (accessibility / preference) geometry, windowState, diff --git a/src/widgets/MiningWidget.cpp b/src/widgets/MiningWidget.cpp index 17f6af18..8efa8340 100644 --- a/src/widgets/MiningWidget.cpp +++ b/src/widgets/MiningWidget.cpp @@ -11,6 +11,8 @@ #include #include +#include "utils/config.h" + static QString formatUptime(qint64 secs) { return QString("%1:%2:%3") .arg(secs / 3600, 2, 10, QChar('0')) @@ -29,6 +31,7 @@ MiningWidget::MiningWidget(Wallet *wallet, QWidget *parent) layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_quickWidget); + m_backend->setReducedMotion(conf()->get(Config::reducedMotion).toBool()); m_quickWidget->rootContext()->setContextProperty("mining", m_backend); m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); m_quickWidget->setSource(QUrl("qrc:/qml/mining.qml")); diff --git a/src/widgets/MiningWidget.h b/src/widgets/MiningWidget.h index 6c90141b..6707019e 100644 --- a/src/widgets/MiningWidget.h +++ b/src/widgets/MiningWidget.h @@ -15,13 +15,17 @@ class MiningBackend : public QObject { Q_OBJECT Q_PROPERTY(int daemonMiningState READ daemonMiningState NOTIFY daemonMiningStateChanged) + Q_PROPERTY(bool reducedMotion READ reducedMotion NOTIFY reducedMotionChanged) public: explicit MiningBackend(QObject *parent = nullptr) : QObject(parent) {} int daemonMiningState() const { return m_state; } void setState(int s) { if (m_state != s) { m_state = s; emit daemonMiningStateChanged(); } } + bool reducedMotion() const { return m_reducedMotion; } + void setReducedMotion(bool r) { if (m_reducedMotion != r) { m_reducedMotion = r; emit reducedMotionChanged(); } } signals: void daemonMiningStateChanged(); + void reducedMotionChanged(); void daemonOutput(const QString &line); void syncStatus(int from, int to, int pct); void uptimeChanged(const QString &uptime); @@ -29,6 +33,7 @@ signals: private: int m_state = 0; // 0:idle 1:startup 2:syncing 3:mining + bool m_reducedMotion = false; }; // wowlet: the pixel-art mining tab. Hosts mining.qml and wires its pick-axe to the wallet's solo diff --git a/src/wizard/PageMenu.cpp b/src/wizard/PageMenu.cpp index 2591ee82..c8333992 100644 --- a/src/wizard/PageMenu.cpp +++ b/src/wizard/PageMenu.cpp @@ -27,6 +27,13 @@ PageMenu::PageMenu(WizardFields *fields, WalletKeysFilesModel *wallets, QWidget }); QString settingsSkin = conf()->get(Config::skin).toString(); + + // wowlet: reduced-motion opt-out, surfaced on first run (unchecked = playful + // animations on, the default). Also lives in Settings → Appearance. + ui->checkBox_reducedMotion->setChecked(conf()->get(Config::reducedMotion).toBool()); + connect(ui->checkBox_reducedMotion, &QCheckBox::toggled, [](bool toggled){ + conf()->set(Config::reducedMotion, toggled); + }); } void PageMenu::initializePage() { diff --git a/src/wizard/PageMenu.ui b/src/wizard/PageMenu.ui index 77c4ee62..a7f993d2 100644 --- a/src/wizard/PageMenu.ui +++ b/src/wizard/PageMenu.ui @@ -192,6 +192,13 @@ + + + + Prefer reduced motion (disable playful animations) + + +