From f16e8b05b7dbd8d466b4bb4ad9d09c53ce3d8105 Mon Sep 17 00:00:00 2001 From: xdustinface Date: Tue, 26 May 2020 23:59:19 +0200 Subject: [PATCH 01/60] qt: Replaced QAction with QToolButton for BitcoinGUI toolbar buttons. This allows setting a size policy for the toolbar buttons so that they are stretched over the toolbar and resize on window size changes. --- src/qt/bitcoingui.cpp | 94 ++++++++++++++++++++++++++++--------------- src/qt/bitcoingui.h | 17 +++++--- 2 files changed, 73 insertions(+), 38 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index ef76c7aa7a6c..cb0fae6117b7 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -40,6 +40,7 @@ #include #include +#include #include #include #include @@ -55,6 +56,7 @@ #include #include #include +#include #include #include @@ -118,6 +120,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle * rpcConsole(0), helpMessageDialog(0), modalOverlay(0), + tabGroup(0), prevBlocks(0), spinnerFrame(0), platformStyle(_platformStyle) @@ -279,13 +282,15 @@ BitcoinGUI::~BitcoinGUI() #endif delete rpcConsole; + delete tabGroup; } void BitcoinGUI::createActions() { - QActionGroup *tabGroup = new QActionGroup(this); + tabGroup = new QButtonGroup(this); - overviewAction = new QAction(tr("&Overview"), this); + overviewAction = new QToolButton(this); + overviewAction->setText(tr("&Overview")); overviewAction->setStatusTip(tr("Show general overview of wallet")); overviewAction->setToolTip(overviewAction->statusTip()); overviewAction->setCheckable(true); @@ -294,9 +299,10 @@ void BitcoinGUI::createActions() #else overviewAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_1)); #endif - tabGroup->addAction(overviewAction); + tabGroup->addButton(overviewAction); - sendCoinsAction = new QAction(tr("&Send"), this); + sendCoinsAction = new QToolButton(this); + sendCoinsAction->setText(tr("&Send")); sendCoinsAction->setStatusTip(tr("Send coins to a Dash address")); sendCoinsAction->setToolTip(sendCoinsAction->statusTip()); sendCoinsAction->setCheckable(true); @@ -305,13 +311,14 @@ void BitcoinGUI::createActions() #else sendCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_2)); #endif - tabGroup->addAction(sendCoinsAction); + tabGroup->addButton(sendCoinsAction); sendCoinsMenuAction = new QAction(QIcon(":/icons/send"), sendCoinsAction->text(), this); sendCoinsMenuAction->setStatusTip(sendCoinsAction->statusTip()); sendCoinsMenuAction->setToolTip(sendCoinsMenuAction->statusTip()); - privateSendCoinsAction = new QAction(tr("&PrivateSend"), this); + privateSendCoinsAction = new QToolButton(this); + privateSendCoinsAction->setText(tr("&PrivateSend")); privateSendCoinsAction->setStatusTip(tr("PrivateSend coins to a Dash address")); privateSendCoinsAction->setToolTip(privateSendCoinsAction->statusTip()); privateSendCoinsAction->setCheckable(true); @@ -320,13 +327,14 @@ void BitcoinGUI::createActions() #else privateSendCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_3)); #endif - tabGroup->addAction(privateSendCoinsAction); + tabGroup->addButton(privateSendCoinsAction); privateSendCoinsMenuAction = new QAction(QIcon(":/icons/send"), privateSendCoinsAction->text(), this); privateSendCoinsMenuAction->setStatusTip(privateSendCoinsAction->statusTip()); privateSendCoinsMenuAction->setToolTip(privateSendCoinsMenuAction->statusTip()); - receiveCoinsAction = new QAction(tr("&Receive"), this); + receiveCoinsAction = new QToolButton(this); + receiveCoinsAction->setText(tr("&Receive")); receiveCoinsAction->setStatusTip(tr("Request payments (generates QR codes and dash: URIs)")); receiveCoinsAction->setToolTip(receiveCoinsAction->statusTip()); receiveCoinsAction->setCheckable(true); @@ -335,13 +343,14 @@ void BitcoinGUI::createActions() #else receiveCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_4)); #endif - tabGroup->addAction(receiveCoinsAction); + tabGroup->addButton(receiveCoinsAction); receiveCoinsMenuAction = new QAction(QIcon(":/icons/receiving_addresses"), receiveCoinsAction->text(), this); receiveCoinsMenuAction->setStatusTip(receiveCoinsAction->statusTip()); receiveCoinsMenuAction->setToolTip(receiveCoinsMenuAction->statusTip()); - historyAction = new QAction(tr("&Transactions"), this); + historyAction = new QToolButton(this); + historyAction->setText(tr("&Transactions")); historyAction->setStatusTip(tr("Browse transaction history")); historyAction->setToolTip(historyAction->statusTip()); historyAction->setCheckable(true); @@ -350,12 +359,13 @@ void BitcoinGUI::createActions() #else historyAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_5)); #endif - tabGroup->addAction(historyAction); + tabGroup->addButton(historyAction); #ifdef ENABLE_WALLET QSettings settings; if (settings.value("fShowMasternodesTab").toBool()) { - masternodeAction = new QAction(tr("&Masternodes"), this); + masternodeAction = new QToolButton(this); + masternodeAction->setText(tr("&Masternodes")); masternodeAction->setStatusTip(tr("Browse masternodes")); masternodeAction->setToolTip(masternodeAction->statusTip()); masternodeAction->setCheckable(true); @@ -364,29 +374,32 @@ void BitcoinGUI::createActions() #else masternodeAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_6)); #endif - tabGroup->addAction(masternodeAction); - connect(masternodeAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); - connect(masternodeAction, SIGNAL(triggered()), this, SLOT(gotoMasternodePage())); + tabGroup->addButton(masternodeAction); + connect(masternodeAction, SIGNAL(clicked()), this, SLOT(showNormalIfMinimized())); + connect(masternodeAction, SIGNAL(clicked()), this, SLOT(gotoMasternodePage())); } // These showNormalIfMinimized are needed because Send Coins and Receive Coins // can be triggered from the tray menu, and need to show the GUI to be useful. - connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); - connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage())); - connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); - connect(sendCoinsAction, SIGNAL(triggered()), this, SLOT(gotoSendCoinsPage())); + connect(overviewAction, SIGNAL(clicked()), this, SLOT(showNormalIfMinimized())); + connect(overviewAction, SIGNAL(clicked()), this, SLOT(gotoOverviewPage())); + connect(sendCoinsAction, SIGNAL(clicked()), this, SLOT(showNormalIfMinimized())); + connect(sendCoinsAction, SIGNAL(clicked()), this, SLOT(gotoSendCoinsPage())); connect(sendCoinsMenuAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(sendCoinsMenuAction, SIGNAL(triggered()), this, SLOT(gotoSendCoinsPage())); - connect(privateSendCoinsAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); - connect(privateSendCoinsAction, SIGNAL(triggered()), this, SLOT(gotoPrivateSendCoinsPage())); + connect(privateSendCoinsAction, SIGNAL(clicked()), this, SLOT(showNormalIfMinimized())); + connect(privateSendCoinsAction, SIGNAL(clicked()), this, SLOT(gotoPrivateSendCoinsPage())); connect(privateSendCoinsMenuAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(privateSendCoinsMenuAction, SIGNAL(triggered()), this, SLOT(gotoPrivateSendCoinsPage())); - connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); - connect(receiveCoinsAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage())); + connect(receiveCoinsAction, SIGNAL(clicked()), this, SLOT(showNormalIfMinimized())); + connect(receiveCoinsAction, SIGNAL(clicked()), this, SLOT(gotoReceiveCoinsPage())); connect(receiveCoinsMenuAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); connect(receiveCoinsMenuAction, SIGNAL(triggered()), this, SLOT(gotoReceiveCoinsPage())); - connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); - connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage())); + connect(historyAction, SIGNAL(clicked()), this, SLOT(showNormalIfMinimized())); + connect(historyAction, SIGNAL(clicked()), this, SLOT(gotoHistoryPage())); + + // Give the selected tab button a bolder font. + connect(tabGroup, SIGNAL(buttonToggled(QAbstractButton *, bool)), this, SLOT(highlightTabButton(QAbstractButton *, bool))); #endif // ENABLE_WALLET quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this); @@ -575,15 +588,25 @@ void BitcoinGUI::createToolBars() { QToolBar *toolbar = new QToolBar(tr("Tabs toolbar")); toolbar->setContextMenuPolicy(Qt::PreventContextMenu); - toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - toolbar->addAction(overviewAction); - toolbar->addAction(sendCoinsAction); - toolbar->addAction(privateSendCoinsAction); - toolbar->addAction(receiveCoinsAction); - toolbar->addAction(historyAction); + toolbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + toolbar->setToolButtonStyle(Qt::ToolButtonTextOnly); + + overviewAction->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + sendCoinsAction->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + privateSendCoinsAction->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + receiveCoinsAction->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + historyAction->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + + toolbar->addWidget(overviewAction); + toolbar->addWidget(sendCoinsAction); + toolbar->addWidget(privateSendCoinsAction); + toolbar->addWidget(receiveCoinsAction); + toolbar->addWidget(historyAction); + QSettings settings; if (settings.value("fShowMasternodesTab").toBool() && masternodeAction) { - toolbar->addAction(masternodeAction); + masternodeAction->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + toolbar->addWidget(masternodeAction); } toolbar->setMovable(false); // remove unused icon in upper left corner overviewAction->setChecked(true); @@ -909,6 +932,13 @@ void BitcoinGUI::openClicked() } } +void BitcoinGUI::highlightTabButton(QAbstractButton *button, bool checked) +{ + QFont font = button->font(); + font.setBold(checked); + button->setFont(font); +} + void BitcoinGUI::gotoOverviewPage() { overviewAction->setChecked(true); diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index e927210773ff..4083cf6a654d 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -40,6 +40,7 @@ QT_BEGIN_NAMESPACE class QAction; class QProgressBar; class QProgressDialog; +class QToolButton; QT_END_NAMESPACE /** @@ -95,20 +96,20 @@ class BitcoinGUI : public QMainWindow QProgressDialog *progressDialog; QMenuBar *appMenuBar; - QAction *overviewAction; - QAction *historyAction; - QAction *masternodeAction; + QToolButton *overviewAction; + QToolButton *historyAction; + QToolButton *masternodeAction; QAction *quitAction; - QAction *sendCoinsAction; + QToolButton *sendCoinsAction; QAction *sendCoinsMenuAction; - QAction *privateSendCoinsAction; + QToolButton *privateSendCoinsAction; QAction *privateSendCoinsMenuAction; QAction *usedSendingAddressesAction; QAction *usedReceivingAddressesAction; QAction *signMessageAction; QAction *verifyMessageAction; QAction *aboutAction; - QAction *receiveCoinsAction; + QToolButton *receiveCoinsAction; QAction *receiveCoinsMenuAction; QAction *optionsAction; QAction *toggleHideAction; @@ -136,6 +137,7 @@ class BitcoinGUI : public QMainWindow RPCConsole *rpcConsole; HelpMessageDialog *helpMessageDialog; ModalOverlay *modalOverlay; + QButtonGroup *tabGroup; #ifdef Q_OS_MAC CAppNapInhibitor* m_app_nap_inhibitor = nullptr; @@ -251,6 +253,9 @@ private Q_SLOTS: /** Show open dialog */ void openClicked(); + + /** Highlight checked tab button */ + void highlightTabButton(QAbstractButton *button, bool checked); #endif // ENABLE_WALLET /** Show configuration dialog */ void optionsClicked(); From 7224de87b9dae834be2e2cfc56691b94a1c958b9 Mon Sep 17 00:00:00 2001 From: xdustinface Date: Tue, 26 May 2020 23:59:39 +0200 Subject: [PATCH 02/60] qt: Give the BitcoinGUI's toolbar more style --- src/qt/res/css/dark.css | 5 ++++- src/qt/res/css/general.css | 31 ++++++++++++++++++------------- src/qt/res/css/light.css | 5 ++++- src/qt/res/css/trad.css | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/src/qt/res/css/dark.css b/src/qt/res/css/dark.css index 2769c999f27f..724d874b0265 100644 --- a/src/qt/res/css/dark.css +++ b/src/qt/res/css/dark.css @@ -295,7 +295,10 @@ QTextEdit { QToolBar / QToolButton ******************************************************/ -/***** No dark.css specific coloring here yet *****/ +QToolBar > QToolButton:checked { + background-color: #444; + color: #ccc; +} /****************************************************** QTreeWidget diff --git a/src/qt/res/css/general.css b/src/qt/res/css/general.css index ca68b0fe1caa..c2ebeb528e9e 100644 --- a/src/qt/res/css/general.css +++ b/src/qt/res/css/general.css @@ -626,26 +626,31 @@ QToolBar / QToolButton QToolBar { background-color: #008de4; - border: 0; + border: none; + width: 100%; padding: 0; margin: 0; + spacing: 0; + min-height: 50px; + max-height: 50px; } QToolBar > QToolButton { - background-color: #008de4; - border: 0; - font-size: 14px; - min-width: 70px; - min-height: 48%; - max-height: 48%; - padding: 0 10px; - margin: 0; - color: #f5f5f5; + background-color: transparent; + border: none; + min-height: 50px; + max-height: 50px; + font-size: 16px; + letter-spacing: 3px; + color: #ffffff; + width: 100%; + padding: 1px; + text-align: center; } -QToolBar > QToolButton:checked { - border: 0; - font-weight: bold; +QToolBar > QToolButton:hover:!checked { + background-color: #005e98; + color: #DCDCDC; } QToolBar > QToolButton:disabled { diff --git a/src/qt/res/css/light.css b/src/qt/res/css/light.css index 882d68f1b98c..b8e62b15c46f 100644 --- a/src/qt/res/css/light.css +++ b/src/qt/res/css/light.css @@ -291,7 +291,10 @@ QTextEdit { QToolBar / QToolButton ******************************************************/ -/***** No light.css specific coloring here yet *****/ +QToolBar > QToolButton:checked { + background-color: #f6f6f6; + color: #333333; +} /****************************************************** QTreeWidget diff --git a/src/qt/res/css/trad.css b/src/qt/res/css/trad.css index 49c8152e072c..95c0e1977a90 100644 --- a/src/qt/res/css/trad.css +++ b/src/qt/res/css/trad.css @@ -25,6 +25,43 @@ Loaded in GUIUtil::loadStyleSheet() in guitil.cpp. */ +/****************************************************** +QToolBar / QToolButton +******************************************************/ + +QToolBar { + border: none; + width: 100%; + padding: 0; + margin: 0; + spacing: 0; +} + +QToolBar > QToolButton { + background-color: #008de4; + border: none; + min-height: 50px; + font-size: 16px; + color: #fff; + width: 100%; + padding: 1px; + text-align: center; +} + +QToolBar > QToolButton:hover:!checked { + background-color: #005e98; + color: #DCDCDC; +} + +QToolBar > QToolButton:checked { + background-color: #00000000; + color: #333; +} + +QToolBar > QToolButton:disabled { + color: #444; +} + /****************************************************** ModalOverlay ******************************************************/ From 7dee67112100f8618325264ed1b253ef81e9a831 Mon Sep 17 00:00:00 2001 From: xdustinface Date: Wed, 27 May 2020 00:24:44 +0200 Subject: [PATCH 03/60] qt: Give the toolbar logo a higher resolution This also removes the blue logo because its not longer used. --- src/Makefile.qt.include | 1 - src/qt/bitcoingui.cpp | 13 ++----------- src/qt/dash.qrc | 1 - src/qt/res/css/general.css | 7 ++++--- src/qt/res/css/trad.css | 7 +++++++ src/qt/res/images/dash_logo_toolbar.png | Bin 1732 -> 9493 bytes src/qt/res/images/dash_logo_toolbar_blue.png | Bin 2479 -> 0 bytes 7 files changed, 13 insertions(+), 16 deletions(-) delete mode 100644 src/qt/res/images/dash_logo_toolbar_blue.png diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 854257d03cf1..c76ade2fd2d3 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -337,7 +337,6 @@ RES_IMAGES = \ qt/res/images/checkbox_partly_checked_disabled.png \ qt/res/images/dash_logo_horizontal.png \ qt/res/images/dash_logo_toolbar.png \ - qt/res/images/dash_logo_toolbar_blue.png \ qt/res/images/radio_normal.png \ qt/res/images/radio_normal_hover.png \ qt/res/images/radio_normal_pressed.png \ diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index cb0fae6117b7..7e67ea6c4f3b 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -611,19 +611,10 @@ void BitcoinGUI::createToolBars() toolbar->setMovable(false); // remove unused icon in upper left corner overviewAction->setChecked(true); - // Add Dash logo on the right side - QWidget* spacer = new QWidget(); - spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - toolbar->addWidget(spacer); - QLabel *logoLabel = new QLabel(); - QString logoImage = ":/images/dash_logo_toolbar"; - if (!GUIUtil::dashThemeActive()) { - logoImage = ":/images/dash_logo_toolbar_blue"; - } + logoLabel->setObjectName("lblToolbarLogo"); + logoLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - QPixmap logoPixmap(logoImage); - logoLabel->setPixmap(logoPixmap); toolbar->addWidget(logoLabel); /** Create additional container for toolbar and walletFrame and make it the central widget. diff --git a/src/qt/dash.qrc b/src/qt/dash.qrc index b66c470d61ac..05c12c995c3a 100644 --- a/src/qt/dash.qrc +++ b/src/qt/dash.qrc @@ -98,7 +98,6 @@ res/images/checkbox_partly_checked_disabled.png res/images/dash_logo_horizontal.png res/images/dash_logo_toolbar.png - res/images/dash_logo_toolbar_blue.png res/images/radio_normal.png res/images/radio_normal_hover.png res/images/radio_normal_pressed.png diff --git a/src/qt/res/css/general.css b/src/qt/res/css/general.css index c2ebeb528e9e..96492f481634 100644 --- a/src/qt/res/css/general.css +++ b/src/qt/res/css/general.css @@ -657,9 +657,10 @@ QToolBar > QToolButton:disabled { color: #444; } -QToolBar > QLabel { - border: 0; - margin: 10px 0 0 0; +QToolBar QLabel#lblToolbarLogo { + padding: 12px; + image: url(':/images/dash_logo_toolbar'); + height: 2.5em; } /****************************************************** diff --git a/src/qt/res/css/trad.css b/src/qt/res/css/trad.css index 95c0e1977a90..84bd8c2808eb 100644 --- a/src/qt/res/css/trad.css +++ b/src/qt/res/css/trad.css @@ -62,6 +62,13 @@ QToolBar > QToolButton:disabled { color: #444; } +QToolBar QLabel#lblToolbarLogo { + background-color: #008de4; + padding: 12px; + image: url(':/images/dash_logo_toolbar'); + height: 2.5em; +} + /****************************************************** ModalOverlay ******************************************************/ diff --git a/src/qt/res/images/dash_logo_toolbar.png b/src/qt/res/images/dash_logo_toolbar.png index 2f58e83e7072372cd33929b658112749f191de51..46322307b75ce6db4db3b788e30f14c5cea28750 100644 GIT binary patch literal 9493 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 literal 1732 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 Date: Sat, 27 Jun 2020 20:18:53 +0200 Subject: [PATCH 04/60] qt: Restore the traditional themes toolbar previous styles and logo --- src/Makefile.qt.include | 1 + src/qt/dash.qrc | 1 + src/qt/res/css/trad.css | 36 +------------------ src/qt/res/images/dash_logo_toolbar_blue.png | Bin 0 -> 34912 bytes 4 files changed, 3 insertions(+), 35 deletions(-) create mode 100644 src/qt/res/images/dash_logo_toolbar_blue.png diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index c76ade2fd2d3..854257d03cf1 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -337,6 +337,7 @@ RES_IMAGES = \ qt/res/images/checkbox_partly_checked_disabled.png \ qt/res/images/dash_logo_horizontal.png \ qt/res/images/dash_logo_toolbar.png \ + qt/res/images/dash_logo_toolbar_blue.png \ qt/res/images/radio_normal.png \ qt/res/images/radio_normal_hover.png \ qt/res/images/radio_normal_pressed.png \ diff --git a/src/qt/dash.qrc b/src/qt/dash.qrc index 05c12c995c3a..b66c470d61ac 100644 --- a/src/qt/dash.qrc +++ b/src/qt/dash.qrc @@ -98,6 +98,7 @@ res/images/checkbox_partly_checked_disabled.png res/images/dash_logo_horizontal.png res/images/dash_logo_toolbar.png + res/images/dash_logo_toolbar_blue.png res/images/radio_normal.png res/images/radio_normal_hover.png res/images/radio_normal_pressed.png diff --git a/src/qt/res/css/trad.css b/src/qt/res/css/trad.css index 84bd8c2808eb..23d618ff5013 100644 --- a/src/qt/res/css/trad.css +++ b/src/qt/res/css/trad.css @@ -29,43 +29,9 @@ Loaded in GUIUtil::loadStyleSheet() in guitil.cpp. QToolBar / QToolButton ******************************************************/ -QToolBar { - border: none; - width: 100%; - padding: 0; - margin: 0; - spacing: 0; -} - -QToolBar > QToolButton { - background-color: #008de4; - border: none; - min-height: 50px; - font-size: 16px; - color: #fff; - width: 100%; - padding: 1px; - text-align: center; -} - -QToolBar > QToolButton:hover:!checked { - background-color: #005e98; - color: #DCDCDC; -} - -QToolBar > QToolButton:checked { - background-color: #00000000; - color: #333; -} - -QToolBar > QToolButton:disabled { - color: #444; -} - QToolBar QLabel#lblToolbarLogo { - background-color: #008de4; padding: 12px; - image: url(':/images/dash_logo_toolbar'); + image: url(':/images/dash_logo_toolbar_blue'); height: 2.5em; } diff --git a/src/qt/res/images/dash_logo_toolbar_blue.png b/src/qt/res/images/dash_logo_toolbar_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..3c932d1d69cedff2f1f80966e8045e8d15a20453 GIT binary patch literal 34912 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 W9=r!C1$q1wJD8n~gLSPHCiy>M#t)$Y literal 0 HcmV?d00001 From daf60f212afdcee0e23f5c8d5038e1f67288c352 Mon Sep 17 00:00:00 2001 From: xdustinface Date: Fri, 29 May 2020 10:16:08 +0200 Subject: [PATCH 05/60] qt: Add Montserrat (picked in Dash Style Guide) as application font Includes the following methods - GUIUtil::loadFonts to load the fonts into the application's font database - GUIUtil::setApplicationFont to set the application font depending on the active theme - GUIUtil::setFont to set a specific font variation for a vector of widgets (Montserrat for dash themes, system default for traditional theme). - GUIUtil::getFont to get a specific montserrat variation as QFont (Montserrat for dash themes, system default for traditional theme). - GUIUtil::getFontWeightNormal to get the font weight to be used for normal text - GUIUtil::getFontWeightBold to get the font weight to be used for bolder text - GUIUtil::getFontNormal to get the default normal weighted QFont - GUIUtil::getFontBold to get the default bold weighted QFont There is a Qt bug on macOS (at least with macOS 10.15.4 and Qt 5.7.1) which leads to not mapping the font weights correctly to the different font types so that they can be selected by the appropriate methods to set the font weight. As result there is now way to properly select the different font styles from stylesheet or with QFont::setWeight() for the font Montserrat. There are only two different weights selectable over the full range of possible weight values. One very bold one and the "ExtraLight" version. As workaround its possible to select the fonts by using the font style string (QFont::setStyleName) as the Montserrat font becomes loaded as one family with one "font style" for each font file. The font wrapper added by this commit are taking care of this behaviour for all operating systems so there should be no other usage of QFont outside of GUIUtil and no more font changes in stylesheets. --- src/Makefile.qt.include | 24 +- src/qt/dash.cpp | 4 + src/qt/dash.qrc | 20 ++ src/qt/guiutil.cpp | 210 +++++++++++++++++- src/qt/guiutil.h | 34 +++ .../res/fonts/Montserrat/Montserrat-Black.otf | Bin 0 -> 230124 bytes .../Montserrat/Montserrat-BlackItalic.otf | Bin 0 -> 236868 bytes .../res/fonts/Montserrat/Montserrat-Bold.otf | Bin 0 -> 235192 bytes .../Montserrat/Montserrat-BoldItalic.otf | Bin 0 -> 243084 bytes .../fonts/Montserrat/Montserrat-ExtraBold.otf | Bin 0 -> 234432 bytes .../Montserrat/Montserrat-ExtraBoldItalic.otf | Bin 0 -> 242800 bytes .../Montserrat/Montserrat-ExtraLight.otf | Bin 0 -> 226772 bytes .../Montserrat-ExtraLightItalic.otf | Bin 0 -> 236444 bytes .../fonts/Montserrat/Montserrat-Italic.otf | Bin 0 -> 237828 bytes .../res/fonts/Montserrat/Montserrat-Light.otf | Bin 0 -> 228068 bytes .../Montserrat/Montserrat-LightItalic.otf | Bin 0 -> 237832 bytes .../fonts/Montserrat/Montserrat-Medium.otf | Bin 0 -> 230356 bytes .../Montserrat/Montserrat-MediumItalic.otf | Bin 0 -> 239660 bytes .../fonts/Montserrat/Montserrat-Regular.otf | Bin 0 -> 228620 bytes .../fonts/Montserrat/Montserrat-SemiBold.otf | Bin 0 -> 234056 bytes .../Montserrat/Montserrat-SemiBoldItalic.otf | Bin 0 -> 242672 bytes .../res/fonts/Montserrat/Montserrat-Thin.otf | Bin 0 -> 217636 bytes .../Montserrat/Montserrat-ThinItalic.otf | Bin 0 -> 227984 bytes src/qt/res/fonts/Montserrat/OFL.txt | 93 ++++++++ .../Montserrat/SIL Open Font License.txt | 43 ++++ 25 files changed, 425 insertions(+), 3 deletions(-) create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-Black.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-BlackItalic.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-Bold.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-BoldItalic.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-ExtraBold.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-ExtraBoldItalic.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-ExtraLight.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-ExtraLightItalic.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-Italic.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-Light.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-LightItalic.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-Medium.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-MediumItalic.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-Regular.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-SemiBold.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-SemiBoldItalic.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-Thin.otf create mode 100644 src/qt/res/fonts/Montserrat/Montserrat-ThinItalic.otf create mode 100644 src/qt/res/fonts/Montserrat/OFL.txt create mode 100644 src/qt/res/fonts/Montserrat/SIL Open Font License.txt diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 854257d03cf1..8561587c1fc1 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -355,6 +355,26 @@ RES_CSS = \ qt/res/css/scrollbars.css \ qt/res/css/trad.css +RES_FONTS = \ + qt/res/fonts/Montserrat/Montserrat-Black.otf \ + qt/res/fonts/Montserrat/Montserrat-BlackItalic.otf \ + qt/res/fonts/Montserrat/Montserrat-Bold.otf \ + qt/res/fonts/Montserrat/Montserrat-BoldItalic.otf \ + qt/res/fonts/Montserrat/Montserrat-ExtraBold.otf \ + qt/res/fonts/Montserrat/Montserrat-ExtraBoldItalic.otf \ + qt/res/fonts/Montserrat/Montserrat-ExtraLight.otf \ + qt/res/fonts/Montserrat/Montserrat-ExtraLightItalic.otf \ + qt/res/fonts/Montserrat/Montserrat-Italic.otf \ + qt/res/fonts/Montserrat/Montserrat-Light.otf \ + qt/res/fonts/Montserrat/Montserrat-LightItalic.otf \ + qt/res/fonts/Montserrat/Montserrat-Medium.otf \ + qt/res/fonts/Montserrat/Montserrat-MediumItalic.otf \ + qt/res/fonts/Montserrat/Montserrat-Regular.otf \ + qt/res/fonts/Montserrat/Montserrat-SemiBold.otf \ + qt/res/fonts/Montserrat/Montserrat-SemiBoldItalic.otf \ + qt/res/fonts/Montserrat/Montserrat-Thin.otf \ + qt/res/fonts/Montserrat/Montserrat-ThinItalic.otf + RES_MOVIES = $(wildcard $(srcdir)/qt/res/movies/spinner-*.png) BITCOIN_RC = qt/res/dash-qt-res.rc @@ -367,7 +387,7 @@ qt_libdashqt_a_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS) qt_libdashqt_a_OBJCXXFLAGS = $(AM_OBJCXXFLAGS) $(QT_PIE_FLAGS) qt_libdashqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ - $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_CSS) $(RES_MOVIES) + $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_CSS) $(RES_FONTS) $(RES_MOVIES) nodist_qt_libdashqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \ $(PROTOBUF_H) $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP) @@ -430,7 +450,7 @@ $(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM) $(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@ @rm $(@D)/temp_$( $@ diff --git a/src/qt/dash.cpp b/src/qt/dash.cpp index fee5ad059fa4..8c14ee5b65d8 100644 --- a/src/qt/dash.cpp +++ b/src/qt/dash.cpp @@ -272,6 +272,10 @@ bool BitcoinCore::baseInitialize() { return false; } + if (!GUIUtil::loadFonts()) + { + return false; + } return true; } diff --git a/src/qt/dash.qrc b/src/qt/dash.qrc index b66c470d61ac..2d4ba4a8c4aa 100644 --- a/src/qt/dash.qrc +++ b/src/qt/dash.qrc @@ -58,6 +58,26 @@ res/css/general.css res/css/scrollbars.css + + res/fonts/Montserrat/Montserrat-Black.otf + res/fonts/Montserrat/Montserrat-BlackItalic.otf + res/fonts/Montserrat/Montserrat-Bold.otf + res/fonts/Montserrat/Montserrat-BoldItalic.otf + res/fonts/Montserrat/Montserrat-ExtraBold.otf + res/fonts/Montserrat/Montserrat-ExtraBoldItalic.otf + res/fonts/Montserrat/Montserrat-ExtraLight.otf + res/fonts/Montserrat/Montserrat-ExtraLightItalic.otf + res/fonts/Montserrat/Montserrat-Italic.otf + res/fonts/Montserrat/Montserrat-Light.otf + res/fonts/Montserrat/Montserrat-LightItalic.otf + res/fonts/Montserrat/Montserrat-Medium.otf + res/fonts/Montserrat/Montserrat-MediumItalic.otf + res/fonts/Montserrat/Montserrat-Regular.otf + res/fonts/Montserrat/Montserrat-SemiBold.otf + res/fonts/Montserrat/Montserrat-SemiBoldItalic.otf + res/fonts/Montserrat/Montserrat-Thin.otf + res/fonts/Montserrat/Montserrat-ThinItalic.otf + res/css/dark.css res/css/light.css diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 9f69e9dd9835..433f609d09a3 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -16,6 +16,7 @@ #include #include