Browse Source

Change progress bar from block-based to time-based

This is less confusing to most people, and doesn't rely on estimates
of the total number of blocks received from other nodes.
0.8
Wladimir J. van der Laan 12 years ago committed by Pieter Wuille
parent
commit
24cde0b7d1
  1. 80
      src/qt/bitcoingui.cpp
  2. 2
      src/qt/bitcoingui.h
  3. 1
      src/qt/clientmodel.cpp
  4. 2
      src/qt/guiconstants.h

80
src/qt/bitcoingui.cpp

@ -67,7 +67,8 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
aboutQtAction(0), aboutQtAction(0),
trayIcon(0), trayIcon(0),
notificator(0), notificator(0),
rpcConsole(0) rpcConsole(0),
prevBlocks(0)
{ {
resize(850, 550); resize(850, 550);
setWindowTitle(tr("Bitcoin") + " - " + tr("Wallet")); setWindowTitle(tr("Bitcoin") + " - " + tr("Wallet"));
@ -527,75 +528,66 @@ void BitcoinGUI::setNumBlocks(int count, int nTotalBlocks)
importText = tr("Reindexing blocks on disk..."); importText = tr("Reindexing blocks on disk...");
} }
QDateTime lastBlockDate = clientModel->getLastBlockDate();
QDateTime currentDate = QDateTime::currentDateTime();
int secs = lastBlockDate.secsTo(currentDate);
if(count < nTotalBlocks) if(count < nTotalBlocks)
{ {
int nRemainingBlocks = nTotalBlocks - count; tooltip = tr("Processed %1 of %2 (estimated) blocks of transaction history.").arg(count).arg(nTotalBlocks);
float nPercentageDone = count / (nTotalBlocks * 0.01f);
progressBarLabel->setText(importText);
progressBarLabel->setVisible(true);
progressBar->setFormat(tr("~%n block(s) remaining", "", nRemainingBlocks));
progressBar->setMaximum(nTotalBlocks);
progressBar->setValue(count);
progressBar->setVisible(true);
tooltip = tr("Processed %1 of %2 blocks of transaction history (%3% done).").arg(count).arg(nTotalBlocks).arg(nPercentageDone, 0, 'f', 2);
} }
else else
{ {
progressBarLabel->setVisible(false);
progressBar->setVisible(false);
tooltip = tr("Processed %1 blocks of transaction history.").arg(count); tooltip = tr("Processed %1 blocks of transaction history.").arg(count);
} }
QDateTime lastBlockDate = clientModel->getLastBlockDate(); // Set icon state: spinning if catching up, tick otherwise
int secs = lastBlockDate.secsTo(QDateTime::currentDateTime()); if(secs < 90*60 && count >= nTotalBlocks)
QString text;
// Represent time from last generated block in human readable text
if(secs <= 0)
{ {
// Fully up to date. Leave text empty. tooltip = tr("Up to date") + QString(".<br>") + tooltip;
labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));
overviewPage->showOutOfSyncWarning(false);
progressBarLabel->setVisible(false);
progressBar->setVisible(false);
} }
else if(secs < 60) else
{ {
text = tr("%n second(s) ago","",secs); // Represent time from last generated block in human readable text
} QString timeBehindText;
else if(secs < 60*60) if(secs < 48*60*60)
{ {
text = tr("%n minute(s) ago","",secs/60); timeBehindText = tr("%n hour(s)","",secs/(60*60));
} }
else if(secs < 24*60*60) else if(secs < 14*24*60*60)
{ {
text = tr("%n hour(s) ago","",secs/(60*60)); timeBehindText = tr("%n day(s)","",secs/(24*60*60));
} }
else else
{ {
text = tr("%n day(s) ago","",secs/(60*60*24)); timeBehindText = tr("%n week(s)","",secs/(7*24*60*60));
} }
// Set icon state: spinning if catching up, tick otherwise progressBarLabel->setText(importText);
if(secs < 90*60 && count >= nTotalBlocks) progressBarLabel->setVisible(true);
{ progressBar->setFormat(tr("%1 behind").arg(timeBehindText));
tooltip = tr("Up to date") + QString(".<br>") + tooltip; progressBar->setMaximum(totalSecs);
labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); progressBar->setValue(totalSecs - secs);
progressBar->setVisible(true);
overviewPage->showOutOfSyncWarning(false);
}
else
{
tooltip = tr("Catching up...") + QString("<br>") + tooltip; tooltip = tr("Catching up...") + QString("<br>") + tooltip;
labelBlocksIcon->setMovie(syncIconMovie); labelBlocksIcon->setMovie(syncIconMovie);
syncIconMovie->start(); if(count != prevBlocks)
syncIconMovie->jumpToNextFrame();
prevBlocks = count;
overviewPage->showOutOfSyncWarning(true); overviewPage->showOutOfSyncWarning(true);
}
if(!text.isEmpty())
{
tooltip += QString("<br>"); tooltip += QString("<br>");
tooltip += tr("Last received block was generated %1.").arg(text); tooltip += tr("Last received block was generated %1 ago.").arg(timeBehindText);
tooltip += QString("<br>");
tooltip += tr("Transactions after this will not yet be visible.");
} }
// Don't word-wrap this (fixed-width) tooltip // Don't word-wrap this (fixed-width) tooltip

2
src/qt/bitcoingui.h

@ -98,6 +98,8 @@ private:
RPCConsole *rpcConsole; RPCConsole *rpcConsole;
QMovie *syncIconMovie; QMovie *syncIconMovie;
/** Keep track of previous number of blocks, to detect progress */
int prevBlocks;
/** Create the main UI actions. */ /** Create the main UI actions. */
void createActions(); void createActions();

1
src/qt/clientmodel.cpp

@ -54,6 +54,7 @@ QDateTime ClientModel::getLastBlockDate() const
return QDateTime::fromTime_t(1231006505); // Genesis block's time return QDateTime::fromTime_t(1231006505); // Genesis block's time
} }
void ClientModel::updateTimer() void ClientModel::updateTimer()
{ {
// Some quantities (such as number of blocks) change so fast that we don't want to be notified for each change. // Some quantities (such as number of blocks) change so fast that we don't want to be notified for each change.

2
src/qt/guiconstants.h

@ -2,7 +2,7 @@
#define GUICONSTANTS_H #define GUICONSTANTS_H
/* Milliseconds between model updates */ /* Milliseconds between model updates */
static const int MODEL_UPDATE_DELAY = 500; static const int MODEL_UPDATE_DELAY = 250;
/* AskPassphraseDialog -- Maximum passphrase length */ /* AskPassphraseDialog -- Maximum passphrase length */
static const int MAX_PASSPHRASE_SIZE = 1024; static const int MAX_PASSPHRASE_SIZE = 1024;

Loading…
Cancel
Save