diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 32e8c7ec8c2b..4d75632fbbd6 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -120,8 +120,8 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle* networkStyle, QWidget* parent) : helpMessageDialog(0), modalOverlay(0), tabGroup(0), - prevBlocks(0), - spinnerFrame(0) + timerConnecting(0), + timerSpinner(0) { QSettings settings; if (!restoreGeometry(settings.value("MainWindowGeometry").toByteArray())) { @@ -211,6 +211,10 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle* networkStyle, QWidget* parent) : frameBlocksLayout->addWidget(labelBlocksIcon); frameBlocksLayout->addStretch(); + // Hide the spinner/synced icon by default to avoid + // that the spinner starts before we have any connections + labelBlocksIcon->hide(); + // Progress bar and label for blocks download progressBarLabel = new QLabel(); progressBarLabel->setVisible(true); @@ -281,6 +285,88 @@ BitcoinGUI::~BitcoinGUI() delete tabGroup; } +void BitcoinGUI::startSpinner() +{ + if (labelBlocksIcon == nullptr || labelBlocksIcon->isHidden() || timerSpinner != nullptr) { + return; + } + auto getNextFrame = []() { + static std::vector> vecFrames; + static std::vector>::iterator itFrame; + while (vecFrames.size() < SPINNER_FRAMES) { + QString&& strFrame = QString("spinner-%1").arg(vecFrames.size(), 3, 10, QChar('0')); + QPixmap&& frame = getIcon(strFrame, GUIUtil::ThemedColor::ORANGE, MOVIES_PATH).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE); + itFrame = vecFrames.insert(vecFrames.end(), std::make_unique(frame)); + } + assert(vecFrames.size() == SPINNER_FRAMES); + if (itFrame == vecFrames.end()) { + itFrame = vecFrames.begin(); + } + return *itFrame++->get(); + }; + + timerSpinner = new QTimer(this); + QObject::connect(timerSpinner, &QTimer::timeout, [=]() { + if (timerSpinner == nullptr) { + return; + } + labelBlocksIcon->setPixmap(getNextFrame()); + }); + timerSpinner->start(40); +} + +void BitcoinGUI::stopSpinner() +{ + if (timerSpinner == nullptr) { + return; + } + timerSpinner->deleteLater(); + timerSpinner = nullptr; +} + +void BitcoinGUI::startConnectingAnimation() +{ + static int nStep{-1}; + const int nAnimationSteps = 10; + + if (timerConnecting != nullptr) { + return; + } + + timerConnecting = new QTimer(this); + QObject::connect(timerConnecting, &QTimer::timeout, [=]() { + + if (timerConnecting == nullptr) { + return; + } + + QString strImage; + GUIUtil::ThemedColor color; + + nStep = (nStep + 1) % (nAnimationSteps + 1); + if (nStep == 0) { + strImage = "connect_4"; + color = GUIUtil::ThemedColor::ICON_ALTERNATIVE_COLOR; + } else if (nStep == nAnimationSteps / 2) { + strImage = "connect_1"; + color = GUIUtil::ThemedColor::ORANGE; + } else { + return; + } + labelConnectionsIcon->setPixmap(GUIUtil::getIcon(strImage, color).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); + }); + timerConnecting->start(100); +} + +void BitcoinGUI::stopConnectingAnimation() +{ + if (timerConnecting == nullptr) { + return; + } + timerConnecting->deleteLater(); + timerConnecting = nullptr; +} + void BitcoinGUI::createActions() { tabGroup = new QButtonGroup(this); @@ -1002,7 +1088,10 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr) void BitcoinGUI::updateNetworkState() { + static int nCountPrev{0}; + static bool fNetworkActivePrev{false}; int count = clientModel->getNumConnections(); + bool fNetworkActive = clientModel->getNetworkActive(); QString icon; GUIUtil::ThemedColor color = GUIUtil::ThemedColor::ORANGE; switch(count) @@ -1014,7 +1103,35 @@ void BitcoinGUI::updateNetworkState() default: icon = "connect_4"; color = GUIUtil::ThemedColor::GREEN; break; } - if (clientModel->getNetworkActive()) { + labelBlocksIcon->setVisible(count > 0); + updateProgressBarVisibility(); + + bool fNetworkBecameActive = (!fNetworkActivePrev && fNetworkActive) || (nCountPrev == 0 && count > 0); + bool fNetworkBecameInactive = (fNetworkActivePrev && !fNetworkActive) || (nCountPrev > 0 && count == 0); + + if (fNetworkBecameActive) { + // If the sync process still signals synced after five seconds represent it in the UI. + if (masternodeSync.IsSynced()) { + QTimer::singleShot(5000, this, [&]() { + if (clientModel->getNumConnections() > 0 && masternodeSync.IsSynced()) { + setAdditionalDataSyncProgress(1); + } + }); + } + startSpinner(); + } else if (fNetworkBecameInactive) { + labelBlocksIcon->hide(); + stopSpinner(); + } + + if (fNetworkBecameActive || fNetworkBecameInactive) { + setNumBlocks(clientModel->getNumBlocks(), clientModel->getLastBlockDate(), clientModel->getLastBlockHash(), clientModel->getVerificationProgress(nullptr), false); + } + + nCountPrev = count; + fNetworkActivePrev = fNetworkActive; + + if (fNetworkActive) { labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Dash network", "", count)); } else { labelConnectionsIcon->setToolTip(tr("Network activity disabled")); @@ -1022,7 +1139,13 @@ void BitcoinGUI::updateNetworkState() color = GUIUtil::ThemedColor::RED; } - labelConnectionsIcon->setPixmap(GUIUtil::getIcon(icon, color).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); + if (fNetworkActive && count == 0) { + startConnectingAnimation(); + } + if (!fNetworkActive || count > 0) { + stopConnectingAnimation(); + labelConnectionsIcon->setPixmap(GUIUtil::getIcon(icon, color).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); + } } void BitcoinGUI::setNumConnections(int count) @@ -1044,6 +1167,21 @@ void BitcoinGUI::updateHeadersSyncProgressLabel() progressBarLabel->setText(tr("Syncing Headers (%1%)...").arg(QString::number(100.0 / (headersTipHeight+estHeadersLeft)*headersTipHeight, 'f', 1))); } +void BitcoinGUI::updateProgressBarVisibility() +{ + if (clientModel == nullptr) { + return; + } + // Show the progress bar label if the network is active + we are out of sync or we have no connections. + bool fShowProgressBarLabel = clientModel->getNetworkActive() && (!masternodeSync.IsSynced() || clientModel->getNumConnections() == 0); + // Show the progress bar only if the the network active + we are not synced + we have any connection. Unlike with the label + // which gives an info text about the connecting phase there is no reason to show the progress bar if we don't have connections + // since it will not get any updates in this case. + bool fShowProgressBar = clientModel->getNetworkActive() && !masternodeSync.IsSynced() && clientModel->getNumConnections() > 0; + progressBarLabel->setVisible(fShowProgressBarLabel); + progressBar->setVisible(fShowProgressBar); +} + void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, const QString& blockHash, double nVerificationProgress, bool header) { #ifdef Q_OS_MAC @@ -1071,6 +1209,8 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, const QStri if (!clientModel) return; + updateProgressBarVisibility(); + // Prevent orphan statusbar messages (e.g. hover Quit in main menu, wait until chain-sync starts -> garbled text) statusBar()->clearMessage(); @@ -1131,21 +1271,11 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, const QStri { QString timeBehindText = GUIUtil::formatNiceTimeOffset(secs); - progressBarLabel->setVisible(true); progressBar->setFormat(tr("%1 behind").arg(timeBehindText)); progressBar->setMaximum(1000000000); progressBar->setValue(nVerificationProgress * 1000000000.0 + 0.5); - progressBar->setVisible(true); tooltip = tr("Catching up...") + QString("
") + tooltip; - if(count != prevBlocks) - { - labelBlocksIcon->setPixmap(GUIUtil::getIcon(QString( - "spinner-%1").arg(spinnerFrame, 3, 10, QChar('0')), GUIUtil::ThemedColor::ORANGE, MOVIES_PATH) - .pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); - spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES; - } - prevBlocks = count; #ifdef ENABLE_WALLET if(walletFrame) @@ -1175,6 +1305,16 @@ void BitcoinGUI::setAdditionalDataSyncProgress(double nSyncProgress) if(!clientModel) return; + // If masternodeSync.Reset() has been called make sure status bar shows the correct information. + if (nSyncProgress == -1) { + setNumBlocks(clientModel->getNumBlocks(), clientModel->getLastBlockDate(), clientModel->getLastBlockHash(), clientModel->getVerificationProgress(nullptr), false); + if (clientModel->getNumConnections()) { + labelBlocksIcon->show(); + startSpinner(); + } + return; + } + // No additional data sync should be happening while blockchain is not synced, nothing to update if(!masternodeSync.IsBlockchainSynced()) return; @@ -1193,17 +1333,12 @@ void BitcoinGUI::setAdditionalDataSyncProgress(double nSyncProgress) walletFrame->showOutOfSyncWarning(false); #endif // ENABLE_WALLET + updateProgressBarVisibility(); + if(masternodeSync.IsSynced()) { - progressBarLabel->setVisible(false); - progressBar->setVisible(false); + stopSpinner(); labelBlocksIcon->setPixmap(GUIUtil::getIcon("synced", GUIUtil::ThemedColor::GREEN).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); } else { - - labelBlocksIcon->setPixmap(GUIUtil::getIcon(QString( - "spinner-%1").arg(spinnerFrame, 3, 10, QChar('0')), GUIUtil::ThemedColor::ORANGE, MOVIES_PATH) - .pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); - spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES; - progressBar->setFormat(tr("Synchronizing additional data: %p%")); progressBar->setMaximum(1000000000); progressBar->setValue(nSyncProgress * 1000000000.0 + 0.5); @@ -1310,10 +1445,6 @@ void BitcoinGUI::changeEvent(QEvent *e) #endif if (masternodeSync.IsSynced()) { labelBlocksIcon->setPixmap(GUIUtil::getIcon("synced", GUIUtil::ThemedColor::GREEN).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); - } else { - labelBlocksIcon->setPixmap(GUIUtil::getIcon(QString( - "spinner-%1").arg(spinnerFrame, 3, 10, QChar('0')), GUIUtil::ThemedColor::ORANGE, MOVIES_PATH) - .pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); } } } diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index e3807a93d71d..e4998dd8f82a 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -146,9 +146,19 @@ class BitcoinGUI : public QMainWindow CAppNapInhibitor* m_app_nap_inhibitor = nullptr; #endif - /** Keep track of previous number of blocks, to detect progress */ - int prevBlocks; - int spinnerFrame; + /** Timer to update the spinner animation in the status bar periodically */ + QTimer* timerSpinner; + /** Start the spinner animation in the status bar if it's not running and if labelBlocksIcon is visible. */ + void startSpinner(); + /** Stop the spinner animation in the status bar */ + void stopSpinner(); + + /** Timer to update the connection icon during connecting phase */ + QTimer* timerConnecting; + /** Start the connecting animation */ + void startConnectingAnimation(); + /** Stop the connecting animation */ + void stopConnectingAnimation(); struct IncomingTransactionMessage { QString date; @@ -186,6 +196,8 @@ class BitcoinGUI : public QMainWindow void updateHeadersSyncProgressLabel(); + void updateProgressBarVisibility(); + Q_SIGNALS: /** Signal raised when a URI was entered or dragged to the GUI */ void receivedURI(const QString &uri); diff --git a/src/qt/dash.qrc b/src/qt/dash.qrc index d8e1f02fee90..dd08a3a8c5d1 100644 --- a/src/qt/dash.qrc +++ b/src/qt/dash.qrc @@ -169,5 +169,59 @@ res/movies/spinner-033.png res/movies/spinner-034.png res/movies/spinner-035.png + res/movies/spinner-036.png + res/movies/spinner-037.png + res/movies/spinner-038.png + res/movies/spinner-039.png + res/movies/spinner-040.png + res/movies/spinner-041.png + res/movies/spinner-042.png + res/movies/spinner-043.png + res/movies/spinner-044.png + res/movies/spinner-045.png + res/movies/spinner-046.png + res/movies/spinner-047.png + res/movies/spinner-048.png + res/movies/spinner-049.png + res/movies/spinner-050.png + res/movies/spinner-051.png + res/movies/spinner-052.png + res/movies/spinner-053.png + res/movies/spinner-054.png + res/movies/spinner-055.png + res/movies/spinner-056.png + res/movies/spinner-057.png + res/movies/spinner-058.png + res/movies/spinner-059.png + res/movies/spinner-060.png + res/movies/spinner-061.png + res/movies/spinner-062.png + res/movies/spinner-063.png + res/movies/spinner-064.png + res/movies/spinner-065.png + res/movies/spinner-066.png + res/movies/spinner-067.png + res/movies/spinner-068.png + res/movies/spinner-069.png + res/movies/spinner-070.png + res/movies/spinner-071.png + res/movies/spinner-072.png + res/movies/spinner-073.png + res/movies/spinner-074.png + res/movies/spinner-075.png + res/movies/spinner-076.png + res/movies/spinner-077.png + res/movies/spinner-078.png + res/movies/spinner-079.png + res/movies/spinner-080.png + res/movies/spinner-081.png + res/movies/spinner-082.png + res/movies/spinner-083.png + res/movies/spinner-084.png + res/movies/spinner-085.png + res/movies/spinner-086.png + res/movies/spinner-087.png + res/movies/spinner-088.png + res/movies/spinner-089.png diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h index 4309acdcfc4a..4750c2dfb4cb 100644 --- a/src/qt/guiconstants.h +++ b/src/qt/guiconstants.h @@ -39,7 +39,7 @@ static const int MAX_URI_LENGTH = 255; #define QR_IMAGE_SIZE 300 /* Number of frames in spinner animation */ -#define SPINNER_FRAMES 36 +#define SPINNER_FRAMES 90 #define QAPP_ORG_NAME "Dash" #define QAPP_ORG_DOMAIN "dash.org" diff --git a/src/qt/res/movies/makespinner.sh b/src/qt/res/movies/makespinner.sh index 76e36e4f3140..575d0e0b02cf 100755 --- a/src/qt/res/movies/makespinner.sh +++ b/src/qt/res/movies/makespinner.sh @@ -4,9 +4,9 @@ export LC_ALL=C FRAMEDIR=$(dirname $0) -for i in {0..35} +for i in {0..89} do frame=$(printf "%03d" $i) - angle=$(($i * 10)) + angle=$(($i * 4)) convert $FRAMEDIR/../src/spinner.png -background "rgba(0,0,0,0.0)" -distort SRT $angle $FRAMEDIR/spinner-$frame.png done diff --git a/src/qt/res/movies/spinner-001.png b/src/qt/res/movies/spinner-001.png index f77f7952c020..0a0352e3434f 100644 Binary files a/src/qt/res/movies/spinner-001.png and b/src/qt/res/movies/spinner-001.png differ diff --git a/src/qt/res/movies/spinner-002.png b/src/qt/res/movies/spinner-002.png index 75311a2f2bf2..ec963ee417ff 100644 Binary files a/src/qt/res/movies/spinner-002.png and b/src/qt/res/movies/spinner-002.png differ diff --git a/src/qt/res/movies/spinner-003.png b/src/qt/res/movies/spinner-003.png index 91eeff1b5909..50d54529b73d 100644 Binary files a/src/qt/res/movies/spinner-003.png and b/src/qt/res/movies/spinner-003.png differ diff --git a/src/qt/res/movies/spinner-004.png b/src/qt/res/movies/spinner-004.png index b8451c79881b..11fe18569e8d 100644 Binary files a/src/qt/res/movies/spinner-004.png and b/src/qt/res/movies/spinner-004.png differ diff --git a/src/qt/res/movies/spinner-005.png b/src/qt/res/movies/spinner-005.png index dd0007ae1d3f..75311a2f2bf2 100644 Binary files a/src/qt/res/movies/spinner-005.png and b/src/qt/res/movies/spinner-005.png differ diff --git a/src/qt/res/movies/spinner-006.png b/src/qt/res/movies/spinner-006.png index 1c2bb6991996..e8bcfa89b79d 100644 Binary files a/src/qt/res/movies/spinner-006.png and b/src/qt/res/movies/spinner-006.png differ diff --git a/src/qt/res/movies/spinner-007.png b/src/qt/res/movies/spinner-007.png index 6d4e74544042..71845b6b337c 100644 Binary files a/src/qt/res/movies/spinner-007.png and b/src/qt/res/movies/spinner-007.png differ diff --git a/src/qt/res/movies/spinner-008.png b/src/qt/res/movies/spinner-008.png index 1bf547ec9037..1bc586d916ae 100644 Binary files a/src/qt/res/movies/spinner-008.png and b/src/qt/res/movies/spinner-008.png differ diff --git a/src/qt/res/movies/spinner-009.png b/src/qt/res/movies/spinner-009.png index 8f605399a631..741ad5c9ea39 100644 Binary files a/src/qt/res/movies/spinner-009.png and b/src/qt/res/movies/spinner-009.png differ diff --git a/src/qt/res/movies/spinner-010.png b/src/qt/res/movies/spinner-010.png index 2e37e3e46d61..b8451c79881b 100644 Binary files a/src/qt/res/movies/spinner-010.png and b/src/qt/res/movies/spinner-010.png differ diff --git a/src/qt/res/movies/spinner-011.png b/src/qt/res/movies/spinner-011.png index c93d3e23e790..af8a0f55e087 100644 Binary files a/src/qt/res/movies/spinner-011.png and b/src/qt/res/movies/spinner-011.png differ diff --git a/src/qt/res/movies/spinner-012.png b/src/qt/res/movies/spinner-012.png index cac4d54d140e..8d0b6eafd35b 100644 Binary files a/src/qt/res/movies/spinner-012.png and b/src/qt/res/movies/spinner-012.png differ diff --git a/src/qt/res/movies/spinner-013.png b/src/qt/res/movies/spinner-013.png index 58814b4cca23..f5b8de44c3de 100644 Binary files a/src/qt/res/movies/spinner-013.png and b/src/qt/res/movies/spinner-013.png differ diff --git a/src/qt/res/movies/spinner-014.png b/src/qt/res/movies/spinner-014.png index bfc457ad24d4..65ab3bbc4df6 100644 Binary files a/src/qt/res/movies/spinner-014.png and b/src/qt/res/movies/spinner-014.png differ diff --git a/src/qt/res/movies/spinner-015.png b/src/qt/res/movies/spinner-015.png index 932e666c7d70..1c2bb6991996 100644 Binary files a/src/qt/res/movies/spinner-015.png and b/src/qt/res/movies/spinner-015.png differ diff --git a/src/qt/res/movies/spinner-016.png b/src/qt/res/movies/spinner-016.png index d3f98653ce2c..53c5af694629 100644 Binary files a/src/qt/res/movies/spinner-016.png and b/src/qt/res/movies/spinner-016.png differ diff --git a/src/qt/res/movies/spinner-017.png b/src/qt/res/movies/spinner-017.png index c374fd8056b8..edd7ce1fd497 100644 Binary files a/src/qt/res/movies/spinner-017.png and b/src/qt/res/movies/spinner-017.png differ diff --git a/src/qt/res/movies/spinner-018.png b/src/qt/res/movies/spinner-018.png index 345219ec137c..c2fbb38b7b70 100644 Binary files a/src/qt/res/movies/spinner-018.png and b/src/qt/res/movies/spinner-018.png differ diff --git a/src/qt/res/movies/spinner-019.png b/src/qt/res/movies/spinner-019.png index 6b54474d7e3a..4fec820283ea 100644 Binary files a/src/qt/res/movies/spinner-019.png and b/src/qt/res/movies/spinner-019.png differ diff --git a/src/qt/res/movies/spinner-020.png b/src/qt/res/movies/spinner-020.png index 918b7156d533..1bf547ec9037 100644 Binary files a/src/qt/res/movies/spinner-020.png and b/src/qt/res/movies/spinner-020.png differ diff --git a/src/qt/res/movies/spinner-021.png b/src/qt/res/movies/spinner-021.png index 66576802cee7..4b5fc65408e8 100644 Binary files a/src/qt/res/movies/spinner-021.png and b/src/qt/res/movies/spinner-021.png differ diff --git a/src/qt/res/movies/spinner-022.png b/src/qt/res/movies/spinner-022.png index db06bb2136f0..f184354507cb 100644 Binary files a/src/qt/res/movies/spinner-022.png and b/src/qt/res/movies/spinner-022.png differ diff --git a/src/qt/res/movies/spinner-023.png b/src/qt/res/movies/spinner-023.png index 2ad03e82d008..29e6704d3abf 100644 Binary files a/src/qt/res/movies/spinner-023.png and b/src/qt/res/movies/spinner-023.png differ diff --git a/src/qt/res/movies/spinner-024.png b/src/qt/res/movies/spinner-024.png index a18d05fd5c46..8e243d35a11d 100644 Binary files a/src/qt/res/movies/spinner-024.png and b/src/qt/res/movies/spinner-024.png differ diff --git a/src/qt/res/movies/spinner-025.png b/src/qt/res/movies/spinner-025.png index 9a1d99c596d2..2e37e3e46d61 100644 Binary files a/src/qt/res/movies/spinner-025.png and b/src/qt/res/movies/spinner-025.png differ diff --git a/src/qt/res/movies/spinner-026.png b/src/qt/res/movies/spinner-026.png index d62a6c2846ec..c61f80f63c84 100644 Binary files a/src/qt/res/movies/spinner-026.png and b/src/qt/res/movies/spinner-026.png differ diff --git a/src/qt/res/movies/spinner-027.png b/src/qt/res/movies/spinner-027.png index 2be3a9e95354..2f8ef5fc5c0f 100644 Binary files a/src/qt/res/movies/spinner-027.png and b/src/qt/res/movies/spinner-027.png differ diff --git a/src/qt/res/movies/spinner-028.png b/src/qt/res/movies/spinner-028.png index 20c97344113e..4ea365978282 100644 Binary files a/src/qt/res/movies/spinner-028.png and b/src/qt/res/movies/spinner-028.png differ diff --git a/src/qt/res/movies/spinner-029.png b/src/qt/res/movies/spinner-029.png index cbbcd9aaf596..26da0d1fc6ff 100644 Binary files a/src/qt/res/movies/spinner-029.png and b/src/qt/res/movies/spinner-029.png differ diff --git a/src/qt/res/movies/spinner-030.png b/src/qt/res/movies/spinner-030.png index 4339b5ac72c8..cac4d54d140e 100644 Binary files a/src/qt/res/movies/spinner-030.png and b/src/qt/res/movies/spinner-030.png differ diff --git a/src/qt/res/movies/spinner-031.png b/src/qt/res/movies/spinner-031.png index ce7d73b08060..ee9cc0628482 100644 Binary files a/src/qt/res/movies/spinner-031.png and b/src/qt/res/movies/spinner-031.png differ diff --git a/src/qt/res/movies/spinner-032.png b/src/qt/res/movies/spinner-032.png index f694bf82f737..daa7c22fffc3 100644 Binary files a/src/qt/res/movies/spinner-032.png and b/src/qt/res/movies/spinner-032.png differ diff --git a/src/qt/res/movies/spinner-033.png b/src/qt/res/movies/spinner-033.png index e52e138a0203..310aa6544cfc 100644 Binary files a/src/qt/res/movies/spinner-033.png and b/src/qt/res/movies/spinner-033.png differ diff --git a/src/qt/res/movies/spinner-034.png b/src/qt/res/movies/spinner-034.png index 167df4a3ca8e..157d399c4a89 100644 Binary files a/src/qt/res/movies/spinner-034.png and b/src/qt/res/movies/spinner-034.png differ diff --git a/src/qt/res/movies/spinner-035.png b/src/qt/res/movies/spinner-035.png index b825c4bd312c..bfc457ad24d4 100644 Binary files a/src/qt/res/movies/spinner-035.png and b/src/qt/res/movies/spinner-035.png differ diff --git a/src/qt/res/movies/spinner-036.png b/src/qt/res/movies/spinner-036.png new file mode 100644 index 000000000000..a5a5ece00532 Binary files /dev/null and b/src/qt/res/movies/spinner-036.png differ diff --git a/src/qt/res/movies/spinner-037.png b/src/qt/res/movies/spinner-037.png new file mode 100644 index 000000000000..456c81b59aff Binary files /dev/null and b/src/qt/res/movies/spinner-037.png differ diff --git a/src/qt/res/movies/spinner-038.png b/src/qt/res/movies/spinner-038.png new file mode 100644 index 000000000000..c39ba2ce3c16 Binary files /dev/null and b/src/qt/res/movies/spinner-038.png differ diff --git a/src/qt/res/movies/spinner-039.png b/src/qt/res/movies/spinner-039.png new file mode 100644 index 000000000000..71d2841961f8 Binary files /dev/null and b/src/qt/res/movies/spinner-039.png differ diff --git a/src/qt/res/movies/spinner-040.png b/src/qt/res/movies/spinner-040.png new file mode 100644 index 000000000000..d3f98653ce2c Binary files /dev/null and b/src/qt/res/movies/spinner-040.png differ diff --git a/src/qt/res/movies/spinner-041.png b/src/qt/res/movies/spinner-041.png new file mode 100644 index 000000000000..c12d3f2ac7af Binary files /dev/null and b/src/qt/res/movies/spinner-041.png differ diff --git a/src/qt/res/movies/spinner-042.png b/src/qt/res/movies/spinner-042.png new file mode 100644 index 000000000000..6c99576c4c60 Binary files /dev/null and b/src/qt/res/movies/spinner-042.png differ diff --git a/src/qt/res/movies/spinner-043.png b/src/qt/res/movies/spinner-043.png new file mode 100644 index 000000000000..e32462a4a58c Binary files /dev/null and b/src/qt/res/movies/spinner-043.png differ diff --git a/src/qt/res/movies/spinner-044.png b/src/qt/res/movies/spinner-044.png new file mode 100644 index 000000000000..9a17ad81370d Binary files /dev/null and b/src/qt/res/movies/spinner-044.png differ diff --git a/src/qt/res/movies/spinner-045.png b/src/qt/res/movies/spinner-045.png new file mode 100644 index 000000000000..345219ec137c Binary files /dev/null and b/src/qt/res/movies/spinner-045.png differ diff --git a/src/qt/res/movies/spinner-046.png b/src/qt/res/movies/spinner-046.png new file mode 100644 index 000000000000..dbda548462f2 Binary files /dev/null and b/src/qt/res/movies/spinner-046.png differ diff --git a/src/qt/res/movies/spinner-047.png b/src/qt/res/movies/spinner-047.png new file mode 100644 index 000000000000..049008a62aa0 Binary files /dev/null and b/src/qt/res/movies/spinner-047.png differ diff --git a/src/qt/res/movies/spinner-048.png b/src/qt/res/movies/spinner-048.png new file mode 100644 index 000000000000..c796103e162f Binary files /dev/null and b/src/qt/res/movies/spinner-048.png differ diff --git a/src/qt/res/movies/spinner-049.png b/src/qt/res/movies/spinner-049.png new file mode 100644 index 000000000000..8d7a4a387a65 Binary files /dev/null and b/src/qt/res/movies/spinner-049.png differ diff --git a/src/qt/res/movies/spinner-050.png b/src/qt/res/movies/spinner-050.png new file mode 100644 index 000000000000..918b7156d533 Binary files /dev/null and b/src/qt/res/movies/spinner-050.png differ diff --git a/src/qt/res/movies/spinner-051.png b/src/qt/res/movies/spinner-051.png new file mode 100644 index 000000000000..9dd0a79454b9 Binary files /dev/null and b/src/qt/res/movies/spinner-051.png differ diff --git a/src/qt/res/movies/spinner-052.png b/src/qt/res/movies/spinner-052.png new file mode 100644 index 000000000000..3c3fcb30cb2e Binary files /dev/null and b/src/qt/res/movies/spinner-052.png differ diff --git a/src/qt/res/movies/spinner-053.png b/src/qt/res/movies/spinner-053.png new file mode 100644 index 000000000000..ffdc29610f5f Binary files /dev/null and b/src/qt/res/movies/spinner-053.png differ diff --git a/src/qt/res/movies/spinner-054.png b/src/qt/res/movies/spinner-054.png new file mode 100644 index 000000000000..a60eb9023032 Binary files /dev/null and b/src/qt/res/movies/spinner-054.png differ diff --git a/src/qt/res/movies/spinner-055.png b/src/qt/res/movies/spinner-055.png new file mode 100644 index 000000000000..db06bb2136f0 Binary files /dev/null and b/src/qt/res/movies/spinner-055.png differ diff --git a/src/qt/res/movies/spinner-056.png b/src/qt/res/movies/spinner-056.png new file mode 100644 index 000000000000..4eafca81af0f Binary files /dev/null and b/src/qt/res/movies/spinner-056.png differ diff --git a/src/qt/res/movies/spinner-057.png b/src/qt/res/movies/spinner-057.png new file mode 100644 index 000000000000..4aa5b5d74985 Binary files /dev/null and b/src/qt/res/movies/spinner-057.png differ diff --git a/src/qt/res/movies/spinner-058.png b/src/qt/res/movies/spinner-058.png new file mode 100644 index 000000000000..7fb372d59188 Binary files /dev/null and b/src/qt/res/movies/spinner-058.png differ diff --git a/src/qt/res/movies/spinner-059.png b/src/qt/res/movies/spinner-059.png new file mode 100644 index 000000000000..1988a463f586 Binary files /dev/null and b/src/qt/res/movies/spinner-059.png differ diff --git a/src/qt/res/movies/spinner-060.png b/src/qt/res/movies/spinner-060.png new file mode 100644 index 000000000000..a18d05fd5c46 Binary files /dev/null and b/src/qt/res/movies/spinner-060.png differ diff --git a/src/qt/res/movies/spinner-061.png b/src/qt/res/movies/spinner-061.png new file mode 100644 index 000000000000..ad6901c68c1c Binary files /dev/null and b/src/qt/res/movies/spinner-061.png differ diff --git a/src/qt/res/movies/spinner-062.png b/src/qt/res/movies/spinner-062.png new file mode 100644 index 000000000000..ab901a35d64e Binary files /dev/null and b/src/qt/res/movies/spinner-062.png differ diff --git a/src/qt/res/movies/spinner-063.png b/src/qt/res/movies/spinner-063.png new file mode 100644 index 000000000000..0137d23aff3f Binary files /dev/null and b/src/qt/res/movies/spinner-063.png differ diff --git a/src/qt/res/movies/spinner-064.png b/src/qt/res/movies/spinner-064.png new file mode 100644 index 000000000000..123f853b2d31 Binary files /dev/null and b/src/qt/res/movies/spinner-064.png differ diff --git a/src/qt/res/movies/spinner-065.png b/src/qt/res/movies/spinner-065.png new file mode 100644 index 000000000000..d62a6c2846ec Binary files /dev/null and b/src/qt/res/movies/spinner-065.png differ diff --git a/src/qt/res/movies/spinner-066.png b/src/qt/res/movies/spinner-066.png new file mode 100644 index 000000000000..1362c08d5240 Binary files /dev/null and b/src/qt/res/movies/spinner-066.png differ diff --git a/src/qt/res/movies/spinner-067.png b/src/qt/res/movies/spinner-067.png new file mode 100644 index 000000000000..86f162ec8cb2 Binary files /dev/null and b/src/qt/res/movies/spinner-067.png differ diff --git a/src/qt/res/movies/spinner-068.png b/src/qt/res/movies/spinner-068.png new file mode 100644 index 000000000000..bded31d723a3 Binary files /dev/null and b/src/qt/res/movies/spinner-068.png differ diff --git a/src/qt/res/movies/spinner-069.png b/src/qt/res/movies/spinner-069.png new file mode 100644 index 000000000000..94ce9b20e0b2 Binary files /dev/null and b/src/qt/res/movies/spinner-069.png differ diff --git a/src/qt/res/movies/spinner-070.png b/src/qt/res/movies/spinner-070.png new file mode 100644 index 000000000000..20c97344113e Binary files /dev/null and b/src/qt/res/movies/spinner-070.png differ diff --git a/src/qt/res/movies/spinner-071.png b/src/qt/res/movies/spinner-071.png new file mode 100644 index 000000000000..f1cdf1cb6771 Binary files /dev/null and b/src/qt/res/movies/spinner-071.png differ diff --git a/src/qt/res/movies/spinner-072.png b/src/qt/res/movies/spinner-072.png new file mode 100644 index 000000000000..8a3774b2fad1 Binary files /dev/null and b/src/qt/res/movies/spinner-072.png differ diff --git a/src/qt/res/movies/spinner-073.png b/src/qt/res/movies/spinner-073.png new file mode 100644 index 000000000000..cfc855c100f3 Binary files /dev/null and b/src/qt/res/movies/spinner-073.png differ diff --git a/src/qt/res/movies/spinner-074.png b/src/qt/res/movies/spinner-074.png new file mode 100644 index 000000000000..73fefc9271cf Binary files /dev/null and b/src/qt/res/movies/spinner-074.png differ diff --git a/src/qt/res/movies/spinner-075.png b/src/qt/res/movies/spinner-075.png new file mode 100644 index 000000000000..4339b5ac72c8 Binary files /dev/null and b/src/qt/res/movies/spinner-075.png differ diff --git a/src/qt/res/movies/spinner-076.png b/src/qt/res/movies/spinner-076.png new file mode 100644 index 000000000000..e8057ca4cf4e Binary files /dev/null and b/src/qt/res/movies/spinner-076.png differ diff --git a/src/qt/res/movies/spinner-077.png b/src/qt/res/movies/spinner-077.png new file mode 100644 index 000000000000..c2322c7161af Binary files /dev/null and b/src/qt/res/movies/spinner-077.png differ diff --git a/src/qt/res/movies/spinner-078.png b/src/qt/res/movies/spinner-078.png new file mode 100644 index 000000000000..147d7114faf5 Binary files /dev/null and b/src/qt/res/movies/spinner-078.png differ diff --git a/src/qt/res/movies/spinner-079.png b/src/qt/res/movies/spinner-079.png new file mode 100644 index 000000000000..6a9e0e2dda5e Binary files /dev/null and b/src/qt/res/movies/spinner-079.png differ diff --git a/src/qt/res/movies/spinner-080.png b/src/qt/res/movies/spinner-080.png new file mode 100644 index 000000000000..f694bf82f737 Binary files /dev/null and b/src/qt/res/movies/spinner-080.png differ diff --git a/src/qt/res/movies/spinner-081.png b/src/qt/res/movies/spinner-081.png new file mode 100644 index 000000000000..e35e66c91af9 Binary files /dev/null and b/src/qt/res/movies/spinner-081.png differ diff --git a/src/qt/res/movies/spinner-082.png b/src/qt/res/movies/spinner-082.png new file mode 100644 index 000000000000..a16c34f0c709 Binary files /dev/null and b/src/qt/res/movies/spinner-082.png differ diff --git a/src/qt/res/movies/spinner-083.png b/src/qt/res/movies/spinner-083.png new file mode 100644 index 000000000000..6d873a03d04d Binary files /dev/null and b/src/qt/res/movies/spinner-083.png differ diff --git a/src/qt/res/movies/spinner-084.png b/src/qt/res/movies/spinner-084.png new file mode 100644 index 000000000000..85ac8b1e9e95 Binary files /dev/null and b/src/qt/res/movies/spinner-084.png differ diff --git a/src/qt/res/movies/spinner-085.png b/src/qt/res/movies/spinner-085.png new file mode 100644 index 000000000000..167df4a3ca8e Binary files /dev/null and b/src/qt/res/movies/spinner-085.png differ diff --git a/src/qt/res/movies/spinner-086.png b/src/qt/res/movies/spinner-086.png new file mode 100644 index 000000000000..41e52fd5fca7 Binary files /dev/null and b/src/qt/res/movies/spinner-086.png differ diff --git a/src/qt/res/movies/spinner-087.png b/src/qt/res/movies/spinner-087.png new file mode 100644 index 000000000000..35afcf38fc71 Binary files /dev/null and b/src/qt/res/movies/spinner-087.png differ diff --git a/src/qt/res/movies/spinner-088.png b/src/qt/res/movies/spinner-088.png new file mode 100644 index 000000000000..96bd193bb1d5 Binary files /dev/null and b/src/qt/res/movies/spinner-088.png differ diff --git a/src/qt/res/movies/spinner-089.png b/src/qt/res/movies/spinner-089.png new file mode 100644 index 000000000000..382331ea791a Binary files /dev/null and b/src/qt/res/movies/spinner-089.png differ