void ShadowGUI::setNumBlocks(int count, int nTotalBlocks) { QWebElement blocksIcon = documentFrame->findFirstElement("#blocksIcon"); QWebElement syncingIcon = documentFrame->findFirstElement("#syncingIcon"); QWebElement syncProgressBar = documentFrame->findFirstElement("#syncProgressBar"); // don't show / hide progress bar and its label if we have no connection to the network if (!clientModel || clientModel->getNumConnections() == 0) { syncProgressBar.setAttribute("style", "display:none;"); return; } // -- translation (tr()) makes it difficult to neatly pick block/header static QString sBlockType = nNodeMode == NT_FULL ? tr("block") : tr("header"); static QString sBlockTypeMulti = nNodeMode == NT_FULL ? tr("blocks") : tr("headers"); QString strStatusBarWarnings = clientModel->getStatusBarWarnings(); QString tooltip; if (nNodeMode != NT_FULL && nNodeState == NS_GET_FILTERED_BLOCKS) { tooltip = tr("Synchronizing with network..."); + "\n" + tr("Downloading filtered blocks..."); int nRemainingBlocks = nTotalBlocks - pwalletMain->nLastFilteredHeight; float nPercentageDone = pwalletMain->nLastFilteredHeight / (nTotalBlocks * 0.01f); tooltip += "\n" + tr("~%1 filtered block(s) remaining (%2% done).").arg(nRemainingBlocks).arg(nPercentageDone); count = pwalletMain->nLastFilteredHeight; syncProgressBar.removeAttribute("style"); } else if (count < nTotalBlocks) { int nRemainingBlocks = nTotalBlocks - count; float nPercentageDone = count / (nTotalBlocks * 0.01f); syncProgressBar.removeAttribute("style"); if (strStatusBarWarnings.isEmpty()) { bridge->networkAlert(""); tooltip = tr("Synchronizing with network..."); if (nNodeMode == NT_FULL) { tooltip += "\n" + tr("~%n block(s) remaining", "", nRemainingBlocks); } else { char temp[128]; snprintf(temp, sizeof(temp), "~%%n %s remaining", nRemainingBlocks == 1 ? qPrintable(sBlockType) : qPrintable(sBlockTypeMulti)); tooltip += "\n" + tr(temp, "", nRemainingBlocks); }; } tooltip += (tooltip.isEmpty()? "" : "\n") + tr("Downloaded %1 of %2 %3 of transaction history (%4% done).").arg(count).arg(nTotalBlocks).arg(sBlockTypeMulti).arg(nPercentageDone, 0, 'f', 2); } else { tooltip = tr("Downloaded %1 blocks of transaction history.").arg(count); } // Override progressBarLabel text when we have warnings to display if (!strStatusBarWarnings.isEmpty()) bridge->networkAlert(strStatusBarWarnings); QDateTime lastBlockDate; if (nNodeMode == NT_FULL) lastBlockDate = clientModel->getLastBlockDate(); else lastBlockDate = clientModel->getLastBlockThinDate(); int secs = lastBlockDate.secsTo(QDateTime::currentDateTime()); QString text; // Represent time from last generated block in human readable text 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)); } else { text = tr("%n day(s) ago","",secs/(60*60*24)); } // Set icon state: spinning if catching up, tick otherwise if (secs < 90*60 && count >= nTotalBlocks && nNodeState != NS_GET_FILTERED_BLOCKS) { tooltip = tr("Up to date") + "\n" + tooltip; blocksIcon.removeClass("none"); syncingIcon.addClass("none"); QWebElementCollection outOfSyncElements = documentFrame->findAllElements(".outofsync"); foreach(QWebElement outOfSync, outOfSyncElements) outOfSync.setStyleProperty("display", "none"); syncProgressBar.setAttribute("style", "display:none;"); } else { tooltip = tr("Catching up...") + "\n" + tooltip; blocksIcon.addClass("none"); syncingIcon.removeClass("none"); QWebElementCollection outOfSyncElements = documentFrame->findAllElements(".outofsync"); foreach(QWebElement outOfSync, outOfSyncElements) outOfSync.setStyleProperty("display", "inline"); syncProgressBar.removeAttribute("style"); } if (!text.isEmpty()) { tooltip += "\n"; tooltip += tr("Last received %1 was generated %2.").arg(sBlockType).arg(text); }; blocksIcon .setAttribute("title", tooltip); syncingIcon .setAttribute("title", tooltip); syncProgressBar.setAttribute("title", tooltip); syncProgressBar.setAttribute("value", QString::number(count)); syncProgressBar.setAttribute("max", QString::number(nTotalBlocks)); }