On initial block chain download, show a progress bar
authorWladimir J. van der Laan <laanwj@gmail.com>
Sat, 18 Jun 2011 19:25:38 +0000 (21:25 +0200)
committerWladimir J. van der Laan <laanwj@gmail.com>
Sat, 18 Jun 2011 19:25:38 +0000 (21:25 +0200)
src/main.cpp
src/main.h
src/qt/bitcoingui.cpp
src/qt/bitcoingui.h
src/qt/clientmodel.cpp
src/qt/clientmodel.h

index 108842f..5a8cc24 100644 (file)
@@ -25,6 +25,7 @@ map<COutPoint, CInPoint> mapNextTx;
 map<uint256, CBlockIndex*> mapBlockIndex;
 uint256 hashGenesisBlock("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f");
 CBigNum bnProofOfWorkLimit(~uint256(0) >> 32);
+const int nTotalBlocksEstimate = 131000; // Conservative estimate of total nr of blocks on main chain
 CBlockIndex* pindexGenesisBlock = NULL;
 int nBestHeight = -1;
 CBigNum bnBestChainWork = 0;
@@ -1156,9 +1157,22 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits)
     return true;
 }
 
+// Return conservative estimate of total number of blocks, 0 if unknown
+int GetTotalBlocksEstimate()
+{
+    if(fTestNet)
+    {
+        return 0;
+    }
+    else
+    {
+        return nTotalBlocksEstimate;
+    }
+}
+
 bool IsInitialBlockDownload()
 {
-    if (pindexBest == NULL || (!fTestNet && nBestHeight < 118000))
+    if (pindexBest == NULL || nBestHeight < GetTotalBlocksEstimate())
         return true;
     static int64 nLastUpdate;
     static CBlockIndex* pindexLastBest;
index 7aa6d41..73935bc 100644 (file)
@@ -118,6 +118,7 @@ void FormatHashBuffers(CBlock* pblock, char* pmidstate, char* pdata, char* phash
 bool CheckWork(CBlock* pblock, CReserveKey& reservekey);
 void BitcoinMiner();
 bool CheckProofOfWork(uint256 hash, unsigned int nBits);
+int GetTotalBlocksEstimate();
 bool IsInitialBlockDownload();
 std::string GetWarnings(std::string strFor);
 
index f487da7..2dfcd40 100644 (file)
@@ -36,6 +36,7 @@
 #include <QSortFilterProxyModel>
 #include <QClipboard>
 #include <QMessageBox>
+#include <QProgressBar>
 
 #include <QDebug>
 
@@ -124,10 +125,19 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
     labelTransactions->setMinimumWidth(130);
     labelTransactions->setToolTip(tr("Number of transactions in your wallet"));
 
+    // Progress bar for blocks download
+    progressBarLabel = new QLabel(tr("Downloading initial data..."));
+    progressBarLabel->setVisible(false);
+    progressBar = new QProgressBar();
+    progressBar->setToolTip(tr("Initial block chain download in progress"));
+    progressBar->setVisible(false);
+
+    statusBar()->addWidget(progressBarLabel);
+    statusBar()->addWidget(progressBar);
     statusBar()->addPermanentWidget(labelConnections);
     statusBar()->addPermanentWidget(labelBlocks);
     statusBar()->addPermanentWidget(labelTransactions);
-     
+
     // Action bindings
     connect(button_new, SIGNAL(clicked()), this, SLOT(newAddressClicked()));
     connect(button_clipboard, SIGNAL(clicked()), this, SLOT(copyClipboardClicked()));
@@ -360,6 +370,20 @@ void BitcoinGUI::setNumConnections(int count)
 
 void BitcoinGUI::setNumBlocks(int count)
 {
+    int total = model->getTotalBlocksEstimate();
+    if(count < total)
+    {
+        progressBarLabel->setVisible(true);
+        progressBar->setVisible(true);
+        progressBar->setMaximum(total);
+        progressBar->setValue(count);
+    }
+    else
+    {
+        progressBarLabel->setVisible(false);
+        progressBar->setVisible(false);
+    }
+
     labelBlocks->setText(QLocale::system().toString(count)+" "+tr("block(s)", "", count));
 }
 
index e1b3ef1..b3559c3 100644 (file)
@@ -13,6 +13,7 @@ class QLineEdit;
 class QTableView;
 class QAbstractItemModel;
 class QModelIndex;
+class QProgressBar;
 QT_END_NAMESPACE
 
 class BitcoinGUI : public QMainWindow
@@ -43,6 +44,8 @@ private:
     QLabel *labelConnectionsIcon;
     QLabel *labelBlocks;
     QLabel *labelTransactions;
+    QLabel *progressBarLabel;
+    QProgressBar *progressBar;
 
     QAction *quit;
     QAction *sendcoins;
index 822c03d..86fc8b3 100644 (file)
@@ -143,6 +143,12 @@ bool ClientModel::inInitialBlockDownload() const
     return IsInitialBlockDownload();
 }
 
+int ClientModel::getTotalBlocksEstimate() const
+{
+    return GetTotalBlocksEstimate();
+}
+
+
 OptionsModel *ClientModel::getOptionsModel()
 {
     return optionsModel;
index f5f12fc..7141937 100644 (file)
@@ -36,6 +36,8 @@ public:
 
     /* Return true if core is doing initial block download */
     bool inInitialBlockDownload() const;
+    /* Return conservative estimate of total number of blocks, or 0 if unknown */
+    int getTotalBlocksEstimate() const;
 
     /* Set default address */
     void setAddress(const QString &defaultAddress);