qt: Make sure the statusbar reflects internal states correct (#3698)
* qt: Increase number of spinner frames * qt: Add and use BitcoinGUI::startSpinner and BitcoinGUI::stopSpinner * qt: Handle CMasternodeSync::Reset calls * qt: Make sure the statusbar always reflects the sync state/progress * qt: Add BitcoinGUI::updateProgressBarVisibility * qt: Animate connection icon while connecting * qt: Refactor check in BitcoinGUI::updateProgressBarVisibility * qt: Rename some variables * Update src/qt/bitcoingui.cpp Co-authored-by: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com> Co-authored-by: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com>
@ -120,8 +120,8 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle* networkStyle, QWidget* parent) :
|
|||||||
helpMessageDialog(0),
|
helpMessageDialog(0),
|
||||||
modalOverlay(0),
|
modalOverlay(0),
|
||||||
tabGroup(0),
|
tabGroup(0),
|
||||||
prevBlocks(0),
|
timerConnecting(0),
|
||||||
spinnerFrame(0)
|
timerSpinner(0)
|
||||||
{
|
{
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
if (!restoreGeometry(settings.value("MainWindowGeometry").toByteArray())) {
|
if (!restoreGeometry(settings.value("MainWindowGeometry").toByteArray())) {
|
||||||
@ -211,6 +211,10 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle* networkStyle, QWidget* parent) :
|
|||||||
frameBlocksLayout->addWidget(labelBlocksIcon);
|
frameBlocksLayout->addWidget(labelBlocksIcon);
|
||||||
frameBlocksLayout->addStretch();
|
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
|
// Progress bar and label for blocks download
|
||||||
progressBarLabel = new QLabel();
|
progressBarLabel = new QLabel();
|
||||||
progressBarLabel->setVisible(true);
|
progressBarLabel->setVisible(true);
|
||||||
@ -281,6 +285,88 @@ BitcoinGUI::~BitcoinGUI()
|
|||||||
delete tabGroup;
|
delete tabGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BitcoinGUI::startSpinner()
|
||||||
|
{
|
||||||
|
if (labelBlocksIcon == nullptr || labelBlocksIcon->isHidden() || timerSpinner != nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto getNextFrame = []() {
|
||||||
|
static std::vector<std::unique_ptr<QPixmap>> vecFrames;
|
||||||
|
static std::vector<std::unique_ptr<QPixmap>>::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<QPixmap>(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()
|
void BitcoinGUI::createActions()
|
||||||
{
|
{
|
||||||
tabGroup = new QButtonGroup(this);
|
tabGroup = new QButtonGroup(this);
|
||||||
@ -1002,7 +1088,10 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr)
|
|||||||
|
|
||||||
void BitcoinGUI::updateNetworkState()
|
void BitcoinGUI::updateNetworkState()
|
||||||
{
|
{
|
||||||
|
static int nCountPrev{0};
|
||||||
|
static bool fNetworkActivePrev{false};
|
||||||
int count = clientModel->getNumConnections();
|
int count = clientModel->getNumConnections();
|
||||||
|
bool fNetworkActive = clientModel->getNetworkActive();
|
||||||
QString icon;
|
QString icon;
|
||||||
GUIUtil::ThemedColor color = GUIUtil::ThemedColor::ORANGE;
|
GUIUtil::ThemedColor color = GUIUtil::ThemedColor::ORANGE;
|
||||||
switch(count)
|
switch(count)
|
||||||
@ -1014,7 +1103,35 @@ void BitcoinGUI::updateNetworkState()
|
|||||||
default: icon = "connect_4"; color = GUIUtil::ThemedColor::GREEN; break;
|
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));
|
labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Dash network", "", count));
|
||||||
} else {
|
} else {
|
||||||
labelConnectionsIcon->setToolTip(tr("Network activity disabled"));
|
labelConnectionsIcon->setToolTip(tr("Network activity disabled"));
|
||||||
@ -1022,7 +1139,13 @@ void BitcoinGUI::updateNetworkState()
|
|||||||
color = GUIUtil::ThemedColor::RED;
|
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)
|
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)));
|
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)
|
void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, const QString& blockHash, double nVerificationProgress, bool header)
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
@ -1071,6 +1209,8 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, const QStri
|
|||||||
if (!clientModel)
|
if (!clientModel)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
updateProgressBarVisibility();
|
||||||
|
|
||||||
// Prevent orphan statusbar messages (e.g. hover Quit in main menu, wait until chain-sync starts -> garbled text)
|
// Prevent orphan statusbar messages (e.g. hover Quit in main menu, wait until chain-sync starts -> garbled text)
|
||||||
statusBar()->clearMessage();
|
statusBar()->clearMessage();
|
||||||
|
|
||||||
@ -1131,21 +1271,11 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, const QStri
|
|||||||
{
|
{
|
||||||
QString timeBehindText = GUIUtil::formatNiceTimeOffset(secs);
|
QString timeBehindText = GUIUtil::formatNiceTimeOffset(secs);
|
||||||
|
|
||||||
progressBarLabel->setVisible(true);
|
|
||||||
progressBar->setFormat(tr("%1 behind").arg(timeBehindText));
|
progressBar->setFormat(tr("%1 behind").arg(timeBehindText));
|
||||||
progressBar->setMaximum(1000000000);
|
progressBar->setMaximum(1000000000);
|
||||||
progressBar->setValue(nVerificationProgress * 1000000000.0 + 0.5);
|
progressBar->setValue(nVerificationProgress * 1000000000.0 + 0.5);
|
||||||
progressBar->setVisible(true);
|
|
||||||
|
|
||||||
tooltip = tr("Catching up...") + QString("<br>") + tooltip;
|
tooltip = tr("Catching up...") + QString("<br>") + 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
|
#ifdef ENABLE_WALLET
|
||||||
if(walletFrame)
|
if(walletFrame)
|
||||||
@ -1175,6 +1305,16 @@ void BitcoinGUI::setAdditionalDataSyncProgress(double nSyncProgress)
|
|||||||
if(!clientModel)
|
if(!clientModel)
|
||||||
return;
|
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
|
// No additional data sync should be happening while blockchain is not synced, nothing to update
|
||||||
if(!masternodeSync.IsBlockchainSynced())
|
if(!masternodeSync.IsBlockchainSynced())
|
||||||
return;
|
return;
|
||||||
@ -1193,17 +1333,12 @@ void BitcoinGUI::setAdditionalDataSyncProgress(double nSyncProgress)
|
|||||||
walletFrame->showOutOfSyncWarning(false);
|
walletFrame->showOutOfSyncWarning(false);
|
||||||
#endif // ENABLE_WALLET
|
#endif // ENABLE_WALLET
|
||||||
|
|
||||||
|
updateProgressBarVisibility();
|
||||||
|
|
||||||
if(masternodeSync.IsSynced()) {
|
if(masternodeSync.IsSynced()) {
|
||||||
progressBarLabel->setVisible(false);
|
stopSpinner();
|
||||||
progressBar->setVisible(false);
|
|
||||||
labelBlocksIcon->setPixmap(GUIUtil::getIcon("synced", GUIUtil::ThemedColor::GREEN).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));
|
labelBlocksIcon->setPixmap(GUIUtil::getIcon("synced", GUIUtil::ThemedColor::GREEN).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));
|
||||||
} else {
|
} 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->setFormat(tr("Synchronizing additional data: %p%"));
|
||||||
progressBar->setMaximum(1000000000);
|
progressBar->setMaximum(1000000000);
|
||||||
progressBar->setValue(nSyncProgress * 1000000000.0 + 0.5);
|
progressBar->setValue(nSyncProgress * 1000000000.0 + 0.5);
|
||||||
@ -1310,10 +1445,6 @@ void BitcoinGUI::changeEvent(QEvent *e)
|
|||||||
#endif
|
#endif
|
||||||
if (masternodeSync.IsSynced()) {
|
if (masternodeSync.IsSynced()) {
|
||||||
labelBlocksIcon->setPixmap(GUIUtil::getIcon("synced", GUIUtil::ThemedColor::GREEN).pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));
|
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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,9 +146,19 @@ private:
|
|||||||
CAppNapInhibitor* m_app_nap_inhibitor = nullptr;
|
CAppNapInhibitor* m_app_nap_inhibitor = nullptr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Keep track of previous number of blocks, to detect progress */
|
/** Timer to update the spinner animation in the status bar periodically */
|
||||||
int prevBlocks;
|
QTimer* timerSpinner;
|
||||||
int spinnerFrame;
|
/** 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 {
|
struct IncomingTransactionMessage {
|
||||||
QString date;
|
QString date;
|
||||||
@ -186,6 +196,8 @@ private:
|
|||||||
|
|
||||||
void updateHeadersSyncProgressLabel();
|
void updateHeadersSyncProgressLabel();
|
||||||
|
|
||||||
|
void updateProgressBarVisibility();
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
/** Signal raised when a URI was entered or dragged to the GUI */
|
/** Signal raised when a URI was entered or dragged to the GUI */
|
||||||
void receivedURI(const QString &uri);
|
void receivedURI(const QString &uri);
|
||||||
|
@ -169,5 +169,59 @@
|
|||||||
<file alias="spinner-033">res/movies/spinner-033.png</file>
|
<file alias="spinner-033">res/movies/spinner-033.png</file>
|
||||||
<file alias="spinner-034">res/movies/spinner-034.png</file>
|
<file alias="spinner-034">res/movies/spinner-034.png</file>
|
||||||
<file alias="spinner-035">res/movies/spinner-035.png</file>
|
<file alias="spinner-035">res/movies/spinner-035.png</file>
|
||||||
|
<file alias="spinner-036">res/movies/spinner-036.png</file>
|
||||||
|
<file alias="spinner-037">res/movies/spinner-037.png</file>
|
||||||
|
<file alias="spinner-038">res/movies/spinner-038.png</file>
|
||||||
|
<file alias="spinner-039">res/movies/spinner-039.png</file>
|
||||||
|
<file alias="spinner-040">res/movies/spinner-040.png</file>
|
||||||
|
<file alias="spinner-041">res/movies/spinner-041.png</file>
|
||||||
|
<file alias="spinner-042">res/movies/spinner-042.png</file>
|
||||||
|
<file alias="spinner-043">res/movies/spinner-043.png</file>
|
||||||
|
<file alias="spinner-044">res/movies/spinner-044.png</file>
|
||||||
|
<file alias="spinner-045">res/movies/spinner-045.png</file>
|
||||||
|
<file alias="spinner-046">res/movies/spinner-046.png</file>
|
||||||
|
<file alias="spinner-047">res/movies/spinner-047.png</file>
|
||||||
|
<file alias="spinner-048">res/movies/spinner-048.png</file>
|
||||||
|
<file alias="spinner-049">res/movies/spinner-049.png</file>
|
||||||
|
<file alias="spinner-050">res/movies/spinner-050.png</file>
|
||||||
|
<file alias="spinner-051">res/movies/spinner-051.png</file>
|
||||||
|
<file alias="spinner-052">res/movies/spinner-052.png</file>
|
||||||
|
<file alias="spinner-053">res/movies/spinner-053.png</file>
|
||||||
|
<file alias="spinner-054">res/movies/spinner-054.png</file>
|
||||||
|
<file alias="spinner-055">res/movies/spinner-055.png</file>
|
||||||
|
<file alias="spinner-056">res/movies/spinner-056.png</file>
|
||||||
|
<file alias="spinner-057">res/movies/spinner-057.png</file>
|
||||||
|
<file alias="spinner-058">res/movies/spinner-058.png</file>
|
||||||
|
<file alias="spinner-059">res/movies/spinner-059.png</file>
|
||||||
|
<file alias="spinner-060">res/movies/spinner-060.png</file>
|
||||||
|
<file alias="spinner-061">res/movies/spinner-061.png</file>
|
||||||
|
<file alias="spinner-062">res/movies/spinner-062.png</file>
|
||||||
|
<file alias="spinner-063">res/movies/spinner-063.png</file>
|
||||||
|
<file alias="spinner-064">res/movies/spinner-064.png</file>
|
||||||
|
<file alias="spinner-065">res/movies/spinner-065.png</file>
|
||||||
|
<file alias="spinner-066">res/movies/spinner-066.png</file>
|
||||||
|
<file alias="spinner-067">res/movies/spinner-067.png</file>
|
||||||
|
<file alias="spinner-068">res/movies/spinner-068.png</file>
|
||||||
|
<file alias="spinner-069">res/movies/spinner-069.png</file>
|
||||||
|
<file alias="spinner-070">res/movies/spinner-070.png</file>
|
||||||
|
<file alias="spinner-071">res/movies/spinner-071.png</file>
|
||||||
|
<file alias="spinner-072">res/movies/spinner-072.png</file>
|
||||||
|
<file alias="spinner-073">res/movies/spinner-073.png</file>
|
||||||
|
<file alias="spinner-074">res/movies/spinner-074.png</file>
|
||||||
|
<file alias="spinner-075">res/movies/spinner-075.png</file>
|
||||||
|
<file alias="spinner-076">res/movies/spinner-076.png</file>
|
||||||
|
<file alias="spinner-077">res/movies/spinner-077.png</file>
|
||||||
|
<file alias="spinner-078">res/movies/spinner-078.png</file>
|
||||||
|
<file alias="spinner-079">res/movies/spinner-079.png</file>
|
||||||
|
<file alias="spinner-080">res/movies/spinner-080.png</file>
|
||||||
|
<file alias="spinner-081">res/movies/spinner-081.png</file>
|
||||||
|
<file alias="spinner-082">res/movies/spinner-082.png</file>
|
||||||
|
<file alias="spinner-083">res/movies/spinner-083.png</file>
|
||||||
|
<file alias="spinner-084">res/movies/spinner-084.png</file>
|
||||||
|
<file alias="spinner-085">res/movies/spinner-085.png</file>
|
||||||
|
<file alias="spinner-086">res/movies/spinner-086.png</file>
|
||||||
|
<file alias="spinner-087">res/movies/spinner-087.png</file>
|
||||||
|
<file alias="spinner-088">res/movies/spinner-088.png</file>
|
||||||
|
<file alias="spinner-089">res/movies/spinner-089.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@ -39,7 +39,7 @@ static const int MAX_URI_LENGTH = 255;
|
|||||||
#define QR_IMAGE_SIZE 300
|
#define QR_IMAGE_SIZE 300
|
||||||
|
|
||||||
/* Number of frames in spinner animation */
|
/* Number of frames in spinner animation */
|
||||||
#define SPINNER_FRAMES 36
|
#define SPINNER_FRAMES 90
|
||||||
|
|
||||||
#define QAPP_ORG_NAME "Dash"
|
#define QAPP_ORG_NAME "Dash"
|
||||||
#define QAPP_ORG_DOMAIN "dash.org"
|
#define QAPP_ORG_DOMAIN "dash.org"
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
|
|
||||||
export LC_ALL=C
|
export LC_ALL=C
|
||||||
FRAMEDIR=$(dirname $0)
|
FRAMEDIR=$(dirname $0)
|
||||||
for i in {0..35}
|
for i in {0..89}
|
||||||
do
|
do
|
||||||
frame=$(printf "%03d" $i)
|
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
|
convert $FRAMEDIR/../src/spinner.png -background "rgba(0,0,0,0.0)" -distort SRT $angle $FRAMEDIR/spinner-$frame.png
|
||||||
done
|
done
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 956 B After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 992 B After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 949 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-036.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-037.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-038.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-039.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-040.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-041.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-042.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-043.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-044.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-045.png
Normal file
After Width: | Height: | Size: 992 B |
BIN
src/qt/res/movies/spinner-046.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-047.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-048.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-049.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-050.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-051.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-052.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-053.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-054.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-055.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-056.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-057.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-058.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-059.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-060.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-061.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-062.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-063.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-064.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-065.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-066.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-067.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-068.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-069.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-070.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-071.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-072.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-073.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-074.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-075.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-076.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-077.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-078.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-079.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-080.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-081.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-082.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-083.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-084.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-085.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-086.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/qt/res/movies/spinner-087.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-088.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/qt/res/movies/spinner-089.png
Normal file
After Width: | Height: | Size: 1.2 KiB |