From 690cb58f8085aeef621e3e0ff4bf79f890ba4081 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Thu, 7 Sep 2017 17:59:00 +0200 Subject: [PATCH] Backport Bitcoin Qt/Gui changes up to 0.14.x part 1 (#1614) * Merge pull request #7154 a3c3ddb [Qt] add InMempool() info to transaction details (Jonas Schnelli) * Merge pull request #7218 fa5769e [qt] Fix misleading translation (MarcoFalke) fa8c8d7 torcontrol debug: Change to a blanket message that covers both cases (MarcoFalke) * Merge pull request #7255 6fd0a07 Remove hardcoded fee from CoinControl ToolTip (fanquake) 5fdf32d Replace some instances of formatWithUnit with formatHtmlWithUnit (fanquake) * Merge pull request #7263 a5a0831 Double semicolon cleanup. (21E14) * Merge pull request #7334 fa989fb [qt] coincontrol workaround is still needed in qt5.4 (fixed in qt5.5) (MarcoFalke) * Merge pull request #7329 9d263bd Typo fixes in comments (Chris Wheeler) * Merge #7396: [Qt] Add option to increase/decrease font size in the console window 43abb02 [Qt] Add a new chevron/arrow icon for the console prompt line (Jonas Schnelli) 56c9e66 [Qt] keep scroll position in GUI console after changing font size (Jonas Schnelli) 3a3a927 [Qt] Add option to increase/decrease font size in the console window (Jonas Schnelli) * Merge #7628: QT: Add 'copy full transaction details' option b51ed40 QT: Add 'copy full transaction details' option (Eric Shaw) * Merge #7668: Fix history deletion bug after font size change 21e45a0 Fix history deletion bug after font change (Andrew C) * Copy/Move font size related icons into theme folders * Use formatTxDate for date/time in TxPlainTextRole --- contrib/debian/copyright | 3 + qa/rpc-tests/merkle_blocks.py | 2 +- src/Makefile.qt.include | 11 +- src/net.cpp | 4 +- src/netbase.cpp | 2 +- src/policy/fees.cpp | 2 +- src/policy/fees.h | 6 +- src/qt/bantablemodel.cpp | 4 +- src/qt/clientmodel.cpp | 2 +- src/qt/coincontroldialog.cpp | 10 +- src/qt/dash.qrc | 9 ++ src/qt/forms/debugwindow.ui | 159 +++++++++++++++++++--- src/qt/guiutil.cpp | 2 +- src/qt/locale/dash_en.ts | 4 +- src/qt/peertablemodel.cpp | 2 +- src/qt/res/icons/chevron.png | Bin 0 -> 1923 bytes src/qt/res/icons/crownium/fontbigger.png | Bin 0 -> 1180 bytes src/qt/res/icons/crownium/fontsmaller.png | Bin 0 -> 951 bytes src/qt/res/icons/drkblue/fontbigger.png | Bin 0 -> 1180 bytes src/qt/res/icons/drkblue/fontsmaller.png | Bin 0 -> 951 bytes src/qt/res/icons/light/fontbigger.png | Bin 0 -> 1180 bytes src/qt/res/icons/light/fontsmaller.png | Bin 0 -> 951 bytes src/qt/res/icons/trad/fontbigger.png | Bin 0 -> 1180 bytes src/qt/res/icons/trad/fontsmaller.png | Bin 0 -> 951 bytes src/qt/rpcconsole.cpp | 69 ++++++++-- src/qt/rpcconsole.h | 6 +- src/qt/sendcoinsdialog.cpp | 2 +- src/qt/transactiondesc.cpp | 2 + src/qt/transactiontablemodel.cpp | 27 ++++ src/qt/transactiontablemodel.h | 2 + src/qt/transactionview.cpp | 16 ++- src/qt/transactionview.h | 1 + src/qt/utilitydialog.cpp | 2 +- src/test/merkle_tests.cpp | 2 +- src/test/rpc_tests.cpp | 4 +- src/torcontrol.cpp | 2 +- src/wallet/rpcwallet.cpp | 2 +- src/wallet/wallet_ismine.h | 2 +- 38 files changed, 292 insertions(+), 69 deletions(-) create mode 100644 src/qt/res/icons/chevron.png create mode 100644 src/qt/res/icons/crownium/fontbigger.png create mode 100644 src/qt/res/icons/crownium/fontsmaller.png create mode 100644 src/qt/res/icons/drkblue/fontbigger.png create mode 100644 src/qt/res/icons/drkblue/fontsmaller.png create mode 100644 src/qt/res/icons/light/fontbigger.png create mode 100644 src/qt/res/icons/light/fontsmaller.png create mode 100644 src/qt/res/icons/trad/fontbigger.png create mode 100644 src/qt/res/icons/trad/fontsmaller.png diff --git a/contrib/debian/copyright b/contrib/debian/copyright index bbaa5b163..c039a7bae 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -21,6 +21,7 @@ License: GPL-3+ Files: src/qt/res/icons/add.png src/qt/res/icons/address-book.png + src/qt/res/icons/chevron.png src/qt/res/icons/configure.png src/qt/res/icons/debugwindow.png src/qt/res/icons/edit.png @@ -56,6 +57,8 @@ Comment: Inspired by Stephan Hutchings Typicons Files: src/qt/res/icons/tx_mined.png src/qt/res/src/mine.svg + src/qt/res/icons/fontbigger.png + src/qt/res/icons/fontsmaller.png Copyright: Jonas Schnelli License: Expat Comment: diff --git a/qa/rpc-tests/merkle_blocks.py b/qa/rpc-tests/merkle_blocks.py index a52e50675..a11608777 100755 --- a/qa/rpc-tests/merkle_blocks.py +++ b/qa/rpc-tests/merkle_blocks.py @@ -70,7 +70,7 @@ class MerkleBlockTest(BitcoinTestFramework): txid_spent = txin_spent["txid"] txid_unspent = txid1 if txin_spent["txid"] != txid1 else txid2 - # We cant find the block from a fully-spent tx + # We can't find the block from a fully-spent tx # Doesn't apply to Dash Core - we have txindex always on # assert_raises(JSONRPCException, self.nodes[2].gettxoutproof, [txid_spent]) # ...but we can if we specify the block diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 992aae2f2..1408a2bea 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -167,6 +167,7 @@ BITCOIN_QT_H = \ RES_ICONS = \ qt/res/icons/bitcoin.ico \ qt/res/icons/bitcoin.png \ + qt/res/icons/chevron.png \ qt/res/icons/drkblue/add.png \ qt/res/icons/drkblue/address-book.png \ qt/res/icons/drkblue/browse.png \ @@ -217,6 +218,8 @@ RES_ICONS = \ qt/res/icons/drkblue/about.png \ qt/res/icons/drkblue/about_qt.png \ qt/res/icons/drkblue/verify.png \ + qt/res/icons/drkblue/fontbigger.png \ + qt/res/icons/drkblue/fontsmaller.png \ qt/res/icons/crownium/add.png \ qt/res/icons/crownium/address-book.png \ qt/res/icons/crownium/browse.png \ @@ -267,6 +270,8 @@ RES_ICONS = \ qt/res/icons/crownium/about.png \ qt/res/icons/crownium/about_qt.png \ qt/res/icons/crownium/verify.png \ + qt/res/icons/crownium/fontbigger.png \ + qt/res/icons/crownium/fontsmaller.png \ qt/res/icons/light/add.png \ qt/res/icons/light/address-book.png \ qt/res/icons/light/browse.png \ @@ -317,6 +322,8 @@ RES_ICONS = \ qt/res/icons/light/about.png \ qt/res/icons/light/about_qt.png \ qt/res/icons/light/verify.png \ + qt/res/icons/light/fontbigger.png \ + qt/res/icons/light/fontsmaller.png \ qt/res/icons/trad/add.png \ qt/res/icons/trad/address-book.png \ qt/res/icons/trad/browse.png \ @@ -366,7 +373,9 @@ RES_ICONS = \ qt/res/icons/trad/tx_mined.png \ qt/res/icons/trad/about.png \ qt/res/icons/trad/about_qt.png \ - qt/res/icons/trad/verify.png + qt/res/icons/trad/verify.png \ + qt/res/icons/trad/fontbigger.png \ + qt/res/icons/trad/fontsmaller.png BITCOIN_QT_CPP = \ qt/bantablemodel.cpp \ diff --git a/src/net.cpp b/src/net.cpp index 5a3677f8d..90e794b69 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1447,7 +1447,7 @@ void ThreadMapPort() LogPrintf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", port, port, lanaddr, r, strupnperror(r)); else - LogPrintf("UPnP Port Mapping successful.\n");; + LogPrintf("UPnP Port Mapping successful.\n"); MilliSleep(20*60*1000); // Refresh every 20 minutes } @@ -2572,7 +2572,7 @@ bool CConnman::OutboundTargetReached(bool historicalBlockServingLimit) if (historicalBlockServingLimit) { - // keep a large enought buffer to at least relay each block once + // keep a large enough buffer to at least relay each block once uint64_t timeLeftInCycle = GetMaxOutboundTimeLeftInCycle(); uint64_t buffer = timeLeftInCycle / 600 * MAX_BLOCK_SIZE; if (buffer >= nMaxOutboundLimit || nMaxOutboundTotalBytesSentInCycle >= nMaxOutboundLimit - buffer) diff --git a/src/netbase.cpp b/src/netbase.cpp index cfd93eb2b..3cec7857b 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -133,7 +133,7 @@ bool static LookupIntern(const char *pszName, std::vector& vIP, unsign return false; do { - // Should set the timeout limit to a resonable value to avoid + // Should set the timeout limit to a reasonable value to avoid // generating unnecessary checking call during the polling loop, // while it can still response to stop request quick enough. // 2 seconds looks fine in our situation. diff --git a/src/policy/fees.cpp b/src/policy/fees.cpp index 98782d41e..332a4ac5b 100644 --- a/src/policy/fees.cpp +++ b/src/policy/fees.cpp @@ -87,7 +87,7 @@ double TxConfirmStats::EstimateMedianVal(int confTarget, double sufficientTxVal, int maxbucketindex = buckets.size() - 1; // requireGreater means we are looking for the lowest fee/priority such that all higher - // values pass, so we start at maxbucketindex (highest fee) and look at succesively + // values pass, so we start at maxbucketindex (highest fee) and look at successively // smaller buckets until we reach failure. Otherwise, we are looking for the highest // fee/priority such that all lower values fail, and we go in the opposite direction. unsigned int startbucket = requireGreater ? maxbucketindex : 0; diff --git a/src/policy/fees.h b/src/policy/fees.h index f4a241575..db1887a78 100644 --- a/src/policy/fees.h +++ b/src/policy/fees.h @@ -29,7 +29,7 @@ class CTxMemPool; * included in blocks before transactions of lower fee/priority. So for * example if you wanted to know what fee you should put on a transaction to * be included in a block within the next 5 blocks, you would start by looking - * at the bucket with with the highest fee transactions and verifying that a + * at the bucket with the highest fee transactions and verifying that a * sufficiently high percentage of them were confirmed within 5 blocks and * then you would look at the next highest fee bucket, and so on, stopping at * the last bucket to pass the test. The average fee of transactions in this @@ -87,13 +87,13 @@ private: // Count the total # of txs in each bucket // Track the historical moving average of this total over blocks std::vector txCtAvg; - // and calcuate the total for the current block to update the moving average + // and calculate the total for the current block to update the moving average std::vector curBlockTxCt; // Count the total # of txs confirmed within Y blocks in each bucket // Track the historical moving average of theses totals over blocks std::vector > confAvg; // confAvg[Y][X] - // and calcuate the totals for the current block to update the moving averages + // and calculate the totals for the current block to update the moving averages std::vector > curBlockConf; // curBlockConf[Y][X] // Sum the total priority/fee of all tx's in each bucket diff --git a/src/qt/bantablemodel.cpp b/src/qt/bantablemodel.cpp index 06bb23ba2..6e11e2390 100644 --- a/src/qt/bantablemodel.cpp +++ b/src/qt/bantablemodel.cpp @@ -104,7 +104,7 @@ int BanTableModel::rowCount(const QModelIndex &parent) const int BanTableModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); - return columns.length();; + return columns.length(); } QVariant BanTableModel::data(const QModelIndex &index, int role) const @@ -179,4 +179,4 @@ bool BanTableModel::shouldShow() if (priv->size() > 0) return true; return false; -} \ No newline at end of file +} diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index ded52e2d0..22e19bf49 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -143,7 +143,7 @@ double ClientModel::getVerificationProgress(const CBlockIndex *tipIn) const void ClientModel::updateTimer() { // no locking required at this point - // the following calls will aquire the required lock + // the following calls will acquire the required lock Q_EMIT mempoolSizeChanged(getMempoolSize(), getMempoolDynamicUsage()); Q_EMIT bytesChanged(getTotalBytesRecv(), getTotalBytesSent()); } diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index cf6307024..adb4522d0 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -141,7 +141,7 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *platformStyle, QWidget ui->treeWidget->setColumnWidth(COLUMN_DATE, 80); ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 100); ui->treeWidget->setColumnWidth(COLUMN_PRIORITY, 100); - ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transacton hash in this column, but don't show it + ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transaction hash in this column, but don't show it ui->treeWidget->setColumnHidden(COLUMN_VOUT_INDEX, true); // store vout index in this column, but don't show it ui->treeWidget->setColumnHidden(COLUMN_AMOUNT_INT64, true); // store amount int64 in this column, but don't show it ui->treeWidget->setColumnHidden(COLUMN_PRIORITY_INT64, true); // store priority int64 in this column, but don't show it @@ -464,10 +464,8 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column) CoinControlDialog::updateLabels(model, this); } - // todo: this is a temporary qt5 fix: when clicking a parent node in tree mode, the parent node - // including all children are partially selected. But the parent node should be fully selected - // as well as the children. Children should never be partially selected in the first place. - // Please remove this ugly fix, once the bug is solved upstream. + // TODO: Remove this temporary qt5 fix after Qt5.3 and Qt5.4 are no longer used. + // Fixed in Qt5.5 and above: https://bugreports.qt.io/browse/QTBUG-43473 #if QT_VERSION >= 0x050000 else if (column == COLUMN_CHECKBOX && item->childCount() > 0) { @@ -712,7 +710,7 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) toolTip2 += tr("This label turns red if the priority is smaller than \"medium\".") + "

"; toolTip2 += tr("This means a fee of at least %1 per kB is required.").arg(BitcoinUnits::formatHtmlWithUnit(nDisplayUnit, CWallet::GetRequiredFee(1000))); - QString toolTip3 = tr("This label turns red if any recipient receives an amount smaller than %1.").arg(BitcoinUnits::formatHtmlWithUnit(nDisplayUnit, ::minRelayTxFee.GetFee(546))); + QString toolTip3 = tr("This label turns red if any recipient receives an amount smaller than the current dust threshold."); // how many satoshis the estimated fee can vary per byte we guess wrong double dFeeVary; diff --git a/src/qt/dash.qrc b/src/qt/dash.qrc index 29d6025c9..2ba93024c 100644 --- a/src/qt/dash.qrc +++ b/src/qt/dash.qrc @@ -1,6 +1,7 @@ res/icons/bitcoin.png + res/icons/chevron.png res/icons/drkblue/address-book.png @@ -53,6 +54,8 @@ res/icons/drkblue/verify.png res/icons/drkblue/hd_enabled.png res/icons/drkblue/hd_disabled.png + res/icons/drkblue/fontbigger.png + res/icons/drkblue/fontsmaller.png res/icons/crownium/address-book.png @@ -105,6 +108,8 @@ res/icons/crownium/verify.png res/icons/crownium/hd_enabled.png res/icons/crownium/hd_disabled.png + res/icons/crownium/fontbigger.png + res/icons/crownium/fontsmaller.png res/icons/light/address-book.png @@ -157,6 +162,8 @@ res/icons/light/verify.png res/icons/light/hd_enabled.png res/icons/light/hd_disabled.png + res/icons/light/fontbigger.png + res/icons/light/fontsmaller.png res/icons/trad/address-book.png @@ -209,6 +216,8 @@ res/icons/trad/verify.png res/icons/trad/hd_enabled.png res/icons/trad/hd_disabled.png + res/icons/trad/fontbigger.png + res/icons/trad/fontsmaller.png res/css/drkblue.css diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui index ea9ac14ee..f2275ac7f 100644 --- a/src/qt/forms/debugwindow.ui +++ b/src/qt/forms/debugwindow.ui @@ -438,6 +438,125 @@ 3 + + 5 + + + + + 4 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + 24 + + + + + + + Decrease font size + + + + :/icons/fontsmaller:/icons/fontsmaller + + + + 24 + 16 + + + + false + + + true + + + + + + + + 24 + 24 + + + + Increase font size + + + + + + + :/icons/fontbigger:/icons/fontbigger + + + + 24 + 16 + + + + false + + + true + + + + + + + + 24 + 24 + + + + Clear console + + + Qt::LeftToRight + + + + + + + :/icons/remove:/icons/remove + + + Ctrl+L + + + false + + + true + + + + + @@ -458,44 +577,48 @@ - + 3 - - - > + + + false - - - - - - - - 24 + 16 24 - - Clear console - - :/icons/drkblue/remove:/icons/drkblue/remove + :/icons/prompticon + :/icons/prompticon:/icons/prompticon - - Ctrl+L + + + 14 + 14 + false + + true + + + + + + + + diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index afc0c5da2..f8d67fe6a 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -235,7 +235,7 @@ QString formatBitcoinURI(const SendCoinsRecipient &info) if (!info.message.isEmpty()) { - QString msg(QUrl::toPercentEncoding(info.message));; + QString msg(QUrl::toPercentEncoding(info.message)); ret += QString("%1message=%2").arg(paramCount == 0 ? "?" : "&").arg(msg); paramCount++; } diff --git a/src/qt/locale/dash_en.ts b/src/qt/locale/dash_en.ts index 2f124839a..69b160770 100644 --- a/src/qt/locale/dash_en.ts +++ b/src/qt/locale/dash_en.ts @@ -1371,8 +1371,8 @@ - Reset all settings changes made over the GUI - Reset all settings changes made over the GUI + Reset all settings changed in the GUI + Reset all settings changed in the GUI diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp index 90899347f..d1a8e384d 100644 --- a/src/qt/peertablemodel.cpp +++ b/src/qt/peertablemodel.cpp @@ -147,7 +147,7 @@ int PeerTableModel::rowCount(const QModelIndex &parent) const int PeerTableModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); - return columns.length();; + return columns.length(); } QVariant PeerTableModel::data(const QModelIndex &index, int role) const diff --git a/src/qt/res/icons/chevron.png b/src/qt/res/icons/chevron.png new file mode 100644 index 0000000000000000000000000000000000000000..ac985052c1527a9a687cc1acbb53f940a7df375b GIT binary patch literal 1923 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 #include #include +#include #include #include #include @@ -44,7 +45,8 @@ // TODO: receive errors and debug messages through ClientModel const int CONSOLE_HISTORY = 50; -const QSize ICON_SIZE(24, 24); +const QSize FONT_RANGE(4, 40); +const char fontSizeSettingsKey[] = "consoleFontSize"; const TrafficGraphData::GraphRange INITIAL_TRAFFIC_GRAPH_SETTING = TrafficGraphData::Range_30m; @@ -256,7 +258,8 @@ RPCConsole::RPCConsole(const PlatformStyle *platformStyle, QWidget *parent) : cachedNodeid(-1), platformStyle(platformStyle), peersTableContextMenu(0), - banTableContextMenu(0) + banTableContextMenu(0), + consoleFontSize(0) { ui->setupUi(this); GUIUtil::restoreWindowGeometry("nRPCConsoleWindow", this->size(), this); @@ -266,12 +269,16 @@ RPCConsole::RPCConsole(const PlatformStyle *platformStyle, QWidget *parent) : } // Needed on Mac also ui->clearButton->setIcon(QIcon(":/icons/" + theme + "/remove")); + ui->fontBiggerButton->setIcon(QIcon(":/icons/" + theme + "/fontbigger")); + ui->fontSmallerButton->setIcon(QIcon(":/icons/" + theme + "/fontsmaller")); // Install event filter for up and down arrow ui->lineEdit->installEventFilter(this); ui->messagesWidget->installEventFilter(this); connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear())); + connect(ui->fontBiggerButton, SIGNAL(clicked()), this, SLOT(fontBigger())); + connect(ui->fontSmallerButton, SIGNAL(clicked()), this, SLOT(fontSmaller())); connect(ui->btnClearTrafficGraph, SIGNAL(clicked()), ui->trafficGraph, SLOT(clear())); // Wallet Repair Buttons @@ -303,6 +310,8 @@ RPCConsole::RPCConsole(const PlatformStyle *platformStyle, QWidget *parent) : ui->peerHeading->setText(tr("Select a peer to view detailed information.")); + QSettings settings; + consoleFontSize = settings.value(fontSizeSettingsKey, QFontInfo(QFont()).pointSize()).toInt(); clear(); } @@ -491,6 +500,41 @@ static QString categoryClass(int category) } } +void RPCConsole::fontBigger() +{ + setFontSize(consoleFontSize+1); +} + +void RPCConsole::fontSmaller() +{ + setFontSize(consoleFontSize-1); +} + +void RPCConsole::setFontSize(int newSize) +{ + QSettings settings; + + //don't allow a insane font size + if (newSize < FONT_RANGE.width() || newSize > FONT_RANGE.height()) + return; + + // temp. store the console content + QString str = ui->messagesWidget->toHtml(); + + // replace font tags size in current content + str.replace(QString("font-size:%1pt").arg(consoleFontSize), QString("font-size:%1pt").arg(newSize)); + + // store the new font size + consoleFontSize = newSize; + settings.setValue(fontSizeSettingsKey, consoleFontSize); + + // clear console (reset icon sizes, default stylesheet) and re-add the content + float oldPosFactor = 1.0 / ui->messagesWidget->verticalScrollBar()->maximum() * ui->messagesWidget->verticalScrollBar()->value(); + clear(false); + ui->messagesWidget->setHtml(str); + ui->messagesWidget->verticalScrollBar()->setValue(oldPosFactor * ui->messagesWidget->verticalScrollBar()->maximum()); +} + /** Restart wallet with "-salvagewallet" */ void RPCConsole::walletSalvage() { @@ -549,11 +593,14 @@ void RPCConsole::buildParameterlist(QString arg) Q_EMIT handleRestart(args); } -void RPCConsole::clear() +void RPCConsole::clear(bool clearHistory) { ui->messagesWidget->clear(); - history.clear(); - historyPtr = 0; + if(clearHistory) + { + history.clear(); + historyPtr = 0; + } ui->lineEdit->clear(); ui->lineEdit->setFocus(); @@ -568,26 +615,20 @@ void RPCConsole::clear() ui->messagesWidget->document()->addResource( QTextDocument::ImageResource, QUrl(ICON_MAPPING[i].url), - QImage(iconPath + iconName).scaled(ICON_SIZE, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + QImage(iconPath + iconName).scaled(QSize(consoleFontSize*2, consoleFontSize*2), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); } // Set default style sheet QFontInfo fixedFontInfo(GUIUtil::fixedPitchFont()); - // Try to make fixed font adequately large on different OS -#ifdef WIN32 - QString ptSize = QString("%1pt").arg(QFontInfo(QFont()).pointSize() * 10 / 8); -#else - QString ptSize = QString("%1pt").arg(QFontInfo(QFont()).pointSize() * 8.5 / 9); -#endif ui->messagesWidget->document()->setDefaultStyleSheet( QString( "table { }" - "td.time { color: #808080; padding-top: 3px; } " + "td.time { color: #808080; font-size: %2; padding-top: 3px; } " "td.message { font-family: %1; font-size: %2; white-space:pre-wrap; } " "td.cmd-request { color: #006060; } " "td.cmd-error { color: red; } " "b { color: #006060; } " - ).arg(fixedFontInfo.family(), ptSize) + ).arg(fixedFontInfo.family(), QString("%1pt").arg(consoleFontSize)) ); message(CMD_REPLY, (tr("Welcome to the Dash Core RPC console.") + "
" + diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h index 3f21ba0b9..4e53ee6eb 100644 --- a/src/qt/rpcconsole.h +++ b/src/qt/rpcconsole.h @@ -80,7 +80,10 @@ private Q_SLOTS: void clearSelectedNode(); public Q_SLOTS: - void clear(); + void clear(bool clearHistory = true); + void fontBigger(); + void fontSmaller(); + void setFontSize(int newSize); /** Wallet repair options */ void walletSalvage(); @@ -152,6 +155,7 @@ private: RPCTimerInterface *rpcTimerInterface; QMenu *peersTableContextMenu; QMenu *banTableContextMenu; + int consoleFontSize; QCompleter *autoCompleter; }; diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index bf6db8b56..847fdb1cd 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -904,7 +904,7 @@ void SendCoinsDialog::coinControlUpdateLabels() if (model->getOptionsModel()->getCoinControlFeatures()) { - // enable minium absolute fee UI controls + // enable minimum absolute fee UI controls ui->radioCustomAtLeast->setVisible(true); // only enable the feature if inputs are selected diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index 55e05d4ad..b8d21851e 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -44,6 +44,8 @@ QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx) if (fOffline) { strTxStatus = tr("%1/offline").arg(nDepth); + } else if (nDepth == 0) { + strTxStatus = tr("0/unconfirmed, %1").arg((wtx.InMempool() ? tr("in memory pool") : tr("not in memory pool"))); } else if (nDepth < 6) { strTxStatus = tr("%1/unconfirmed").arg(nDepth); } else { diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index 1147a8236..497e374f6 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -634,6 +634,33 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const return QString::fromStdString(rec->hash.ToString()); case TxHexRole: return priv->getTxHex(rec); + case TxPlainTextRole: + { + QString details; + QString txLabel = walletModel->getAddressTableModel()->labelForAddress(QString::fromStdString(rec->address)); + + details.append(formatTxDate(rec)); + details.append(" "); + details.append(formatTxStatus(rec)); + details.append(". "); + if(!formatTxType(rec).isEmpty()) { + details.append(formatTxType(rec)); + details.append(" "); + } + if(!rec->address.empty()) { + if(txLabel.isEmpty()) + details.append(tr("(no label)") + " "); + else { + details.append("("); + details.append(txLabel); + details.append(") "); + } + details.append(QString::fromStdString(rec->address)); + details.append(" "); + } + details.append(formatTxAmount(rec, false, BitcoinUnits::separatorNever)); + return details; + } case ConfirmedRole: return rec->status.countsForBalance; case FormattedAmountRole: diff --git a/src/qt/transactiontablemodel.h b/src/qt/transactiontablemodel.h index fe59a15f6..6932646e1 100644 --- a/src/qt/transactiontablemodel.h +++ b/src/qt/transactiontablemodel.h @@ -62,6 +62,8 @@ public: TxHashRole, /** Transaction data, hex-encoded */ TxHexRole, + /** Whole transaction as plain text */ + TxPlainTextRole, /** Is transaction confirmed? */ ConfirmedRole, /** Formatted amount, without brackets when unconfirmed */ diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp index d696cdc37..27e6be30a 100644 --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -156,6 +156,7 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa QAction *copyAmountAction = new QAction(tr("Copy amount"), this); QAction *copyTxIDAction = new QAction(tr("Copy transaction ID"), this); QAction *copyTxHexAction = new QAction(tr("Copy raw transaction"), this); + QAction *copyTxPlainText = new QAction(tr("Copy full transaction details"), this); QAction *editLabelAction = new QAction(tr("Edit label"), this); QAction *showDetailsAction = new QAction(tr("Show transaction details"), this); @@ -165,6 +166,7 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa contextMenu->addAction(copyAmountAction); contextMenu->addAction(copyTxIDAction); contextMenu->addAction(copyTxHexAction); + contextMenu->addAction(copyTxPlainText); contextMenu->addAction(editLabelAction); contextMenu->addAction(showDetailsAction); @@ -188,6 +190,7 @@ TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *pa connect(copyAmountAction, SIGNAL(triggered()), this, SLOT(copyAmount())); connect(copyTxIDAction, SIGNAL(triggered()), this, SLOT(copyTxID())); connect(copyTxHexAction, SIGNAL(triggered()), this, SLOT(copyTxHex())); + connect(copyTxPlainText, SIGNAL(triggered()), this, SLOT(copyTxPlainText())); connect(editLabelAction, SIGNAL(triggered()), this, SLOT(editLabel())); connect(showDetailsAction, SIGNAL(triggered()), this, SLOT(showDetails())); } @@ -427,6 +430,11 @@ void TransactionView::copyTxHex() GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::TxHexRole); } +void TransactionView::copyTxPlainText() +{ + GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::TxPlainTextRole); +} + void TransactionView::editLabel() { if(!transactionView->selectionModel() ||!model) @@ -597,12 +605,8 @@ bool TransactionView::eventFilter(QObject *obj, QEvent *event) QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_C && ke->modifiers().testFlag(Qt::ControlModifier)) { - QModelIndex i = this->transactionView->currentIndex(); - if (i.isValid() && i.column() == TransactionTableModel::Amount) - { - GUIUtil::setClipboard(i.data(TransactionTableModel::FormattedAmountRole).toString()); - return true; - } + GUIUtil::copyEntryData(transactionView, 0, TransactionTableModel::TxPlainTextRole); + return true; } } return QWidget::eventFilter(obj, event); diff --git a/src/qt/transactionview.h b/src/qt/transactionview.h index 4f416b80a..5dd896314 100644 --- a/src/qt/transactionview.h +++ b/src/qt/transactionview.h @@ -94,6 +94,7 @@ private Q_SLOTS: void copyAmount(); void copyTxID(); void copyTxHex(); + void copyTxPlainText(); void openThirdPartyTxUrl(QString url); void updateWatchOnlyColumn(bool fHaveWatchOnly); diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp index a93f4c638..4e4bf7c53 100644 --- a/src/qt/utilitydialog.cpp +++ b/src/qt/utilitydialog.cpp @@ -86,7 +86,7 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, HelpMode helpMode) : strUsage += HelpMessageOpt("-min", tr("Start minimized").toStdString()); strUsage += HelpMessageOpt("-rootcertificates=", tr("Set SSL root certificates for payment request (default: -system-)").toStdString()); strUsage += HelpMessageOpt("-splash", strprintf(tr("Show splash screen on startup (default: %u)").toStdString(), DEFAULT_SPLASHSCREEN)); - strUsage += HelpMessageOpt("-resetguisettings", tr("Reset all settings changes made over the GUI").toStdString()); + strUsage += HelpMessageOpt("-resetguisettings", tr("Reset all settings changed in the GUI").toStdString()); if (showDebug) { strUsage += HelpMessageOpt("-uiplatform", strprintf("Select platform to customize UI for (one of windows, macosx, other; default: %s)", BitcoinGUI::DEFAULT_UIPLATFORM)); } diff --git a/src/test/merkle_tests.cpp b/src/test/merkle_tests.cpp index 51e762093..e352dd7a9 100644 --- a/src/test/merkle_tests.cpp +++ b/src/test/merkle_tests.cpp @@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE(merkle_test) int duplicate2 = mutate >= 2 ? 1 << ctz(ntx1) : 0; // Likewise for the second mutation. if (duplicate2 >= ntx1) break; int ntx2 = ntx1 + duplicate2; - int duplicate3 = mutate >= 3 ? 1 << ctz(ntx2) : 0; // And for the the third mutation. + int duplicate3 = mutate >= 3 ? 1 << ctz(ntx2) : 0; // And for the third mutation. if (duplicate3 >= ntx2) break; int ntx3 = ntx2 + duplicate3; // Build a block with ntx different transactions. diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp index 56ce1d3c7..fb407fb45 100644 --- a/src/test/rpc_tests.cpp +++ b/src/test/rpc_tests.cpp @@ -236,7 +236,7 @@ BOOST_AUTO_TEST_CASE(rpc_ban) UniValue o1 = ar[0].get_obj(); UniValue adr = find_value(o1, "address"); BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/32"); - BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0 remove")));; + BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0 remove"))); BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned"))); ar = r.get_array(); BOOST_CHECK_EQUAL(ar.size(), 0); @@ -266,7 +266,7 @@ BOOST_AUTO_TEST_CASE(rpc_ban) // must throw an exception because 127.0.0.1 is in already banned suubnet range BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.0.1 add")), runtime_error); - BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0/24 remove")));; + BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0/24 remove"))); BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned"))); ar = r.get_array(); BOOST_CHECK_EQUAL(ar.size(), 0); diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index 01035c7bd..d10b3e00a 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -304,7 +304,7 @@ static std::map ParseTorReplyMapping(const std::string /** Read full contents of a file and return them in a std::string. * Returns a pair . - * If an error occured, status will be false, otherwise status will be true and the data will be returned in string. + * If an error occurred, status will be false, otherwise status will be true and the data will be returned in string. * * @param maxsize Puts a maximum size limit on the file that is read. If the file is larger than this, truncated data * (with len > maxsize) will be returned. diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 44c3b0e79..1e079be53 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -1541,7 +1541,7 @@ UniValue listtransactions(const UniValue& params, bool fHelp) " 'send' category of transactions.\n" " \"confirmations\": n, (numeric) The number of confirmations for the transaction. Available for 'send' and \n" " 'receive' category of transactions. Negative confirmations indicate the\n" - " transation conflicts with the block chain\n" + " transaction conflicts with the block chain\n" " \"bcconfirmations\": n, (numeric) The number of blockchain confirmations for the transaction. Available for 'send' and \n" " 'receive' category of transactions. Negative confirmations indicate the\n" " transation conflicts with the block chain\n" diff --git a/src/wallet/wallet_ismine.h b/src/wallet/wallet_ismine.h index 93cdf6ab8..51afd1b14 100644 --- a/src/wallet/wallet_ismine.h +++ b/src/wallet/wallet_ismine.h @@ -17,7 +17,7 @@ class CScript; enum isminetype { ISMINE_NO = 0, - //! Indicates that we dont know how to create a scriptSig that would solve this if we were given the appropriate private keys + //! Indicates that we don't know how to create a scriptSig that would solve this if we were given the appropriate private keys ISMINE_WATCH_UNSOLVABLE = 1, //! Indicates that we know how to create a scriptSig that would solve this if we were given the appropriate private keys ISMINE_WATCH_SOLVABLE = 2,