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.
miguelfreitas
Wladimir J. van der Laan 12 years ago committed by Pieter Wuille
parent
commit
24cde0b7d1
  1. 84
      src/qt/bitcoingui.cpp
  2. 2
      src/qt/bitcoingui.h
  3. 1
      src/qt/clientmodel.cpp
  4. 2
      src/qt/guiconstants.h

84
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,52 +528,17 @@ void BitcoinGUI::setNumBlocks(int count, int nTotalBlocks)
importText = tr("Reindexing blocks on disk..."); importText = tr("Reindexing blocks on disk...");
} }
if(count < nTotalBlocks)
{
int nRemainingBlocks = nTotalBlocks - count;
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
{
progressBarLabel->setVisible(false);
progressBar->setVisible(false);
tooltip = tr("Processed %1 blocks of transaction history.").arg(count);
}
QDateTime lastBlockDate = clientModel->getLastBlockDate(); QDateTime lastBlockDate = clientModel->getLastBlockDate();
int secs = lastBlockDate.secsTo(QDateTime::currentDateTime()); QDateTime currentDate = QDateTime::currentDateTime();
QString text; int secs = lastBlockDate.secsTo(currentDate);
// Represent time from last generated block in human readable text if(count < nTotalBlocks)
if(secs <= 0)
{
// Fully up to date. Leave text empty.
}
else if(secs < 60)
{
text = tr("%n second(s) ago","",secs);
}
else if(secs < 60*60)
{
text = tr("%n minute(s) ago","",secs/60);
}
else if(secs < 24*60*60)
{ {
text = tr("%n hour(s) ago","",secs/(60*60)); tooltip = tr("Processed %1 of %2 (estimated) blocks of transaction history.").arg(count).arg(nTotalBlocks);
} }
else else
{ {
text = tr("%n day(s) ago","",secs/(60*60*24)); tooltip = tr("Processed %1 blocks of transaction history.").arg(count);
} }
// Set icon state: spinning if catching up, tick otherwise // Set icon state: spinning if catching up, tick otherwise
@ -582,20 +548,46 @@ void BitcoinGUI::setNumBlocks(int count, int nTotalBlocks)
labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));
overviewPage->showOutOfSyncWarning(false); overviewPage->showOutOfSyncWarning(false);
progressBarLabel->setVisible(false);
progressBar->setVisible(false);
} }
else else
{ {
// Represent time from last generated block in human readable text
QString timeBehindText;
if(secs < 48*60*60)
{
timeBehindText = tr("%n hour(s)","",secs/(60*60));
}
else if(secs < 14*24*60*60)
{
timeBehindText = tr("%n day(s)","",secs/(24*60*60));
}
else
{
timeBehindText = tr("%n week(s)","",secs/(7*24*60*60));
}
progressBarLabel->setText(importText);
progressBarLabel->setVisible(true);
progressBar->setFormat(tr("%1 behind").arg(timeBehindText));
progressBar->setMaximum(totalSecs);
progressBar->setValue(totalSecs - secs);
progressBar->setVisible(true);
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