v29.4-roots.1 · Commit 5: [PATCH 05/13] product: establish Roots identity and Qt experience
src/qt/splashscreen.cpp
Before: src/qt/splashscreen.cpp · After: src/qt/splashscreen.cpp
File metadata
index ccaa201811f12b799f7fa37424df045b7fdd2f22..15843962e0c1a40a45421683794581afc9427938 100644
Download original patch · Release notes
Diff rows 1–188 of 188. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.
src/qt/splashscreen.cpp
CHANGED
|
@@ -18,109 +18,104 @@
|
|
| 18 |
|
| 19 |
#include <functional>
|
| 20 |
|
|
|
|
|
|
|
| 21 |
#include <QApplication>
|
| 22 |
#include <QCloseEvent>
|
|
|
|
| 23 |
#include <QPainter>
|
| 24 |
-
#include <QRadialGradient>
|
| 25 |
#include <QScreen>
|
| 26 |
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
-
SplashScreen::SplashScreen(const NetworkStyle* networkStyle)
|
| 29 |
-
: QWidget()
|
| 30 |
{
|
| 31 |
-
// set reference point, paddings
|
| 32 |
-
int paddingRight = 50;
|
| 33 |
-
int paddingTop = 50;
|
| 34 |
-
int titleVersionVSpace = 17;
|
| 35 |
-
int titleCopyrightVSpace = 40;
|
| 36 |
-
|
| 37 |
-
float fontFactor = 1.0;
|
| 38 |
-
float devicePixelRatio = 1.0;
|
| 39 |
-
devicePixelRatio = static_cast<QGuiApplication*>(QCoreApplication::instance())->devicePixelRatio();
|
| 40 |
-
|
| 41 |
-
// define text to place
|
| 42 |
-
QString titleText = CLIENT_NAME;
|
| 43 |
-
QString versionText = QString("Version %1").arg(QString::fromStdString(FormatFullVersion()));
|
| 44 |
-
QString copyrightText = QString::fromUtf8(CopyrightHolders(strprintf("\xc2\xA9 %u-%u ", 2009, COPYRIGHT_YEAR)).c_str());
|
| 45 |
-
const QString& titleAddText = networkStyle->getTitleAddText();
|
| 46 |
|
| 47 |
-
QString font = QApplication::font().toString();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
-
// create a bitmap according to device pixelratio
|
| 50 |
-
QSize splashSize(480*devicePixelRatio,320*devicePixelRatio);
|
| 51 |
-
pixmap = QPixmap(splashSize);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
|
| 53 |
-
// change to HiDPI if it makes sense
|
| 54 |
-
pixmap.setDevicePixelRatio(devicePixelRatio);
|
|
|
|
| 55 |
|
| 56 |
QPainter pixPaint(&pixmap);
|
| 57 |
-
pixPaint.setPen(QColor(100,100,100));
|
| 58 |
-
|
| 59 |
-
// draw a slightly radial gradient
|
| 60 |
-
QRadialGradient gradient(QPoint(0,0), splashSize.width()/devicePixelRatio);
|
| 61 |
-
gradient.setColorAt(0, Qt::white);
|
| 62 |
-
gradient.setColorAt(1, QColor(247,247,247));
|
| 63 |
-
QRect rGradient(QPoint(0,0), splashSize);
|
| 64 |
-
pixPaint.fillRect(rGradient, gradient);
|
| 65 |
-
|
| 66 |
-
// draw the bitcoin icon, expected size of PNG: 1024x1024
|
| 67 |
-
QRect rectIcon(QPoint(-150,-122), QSize(430,430));
|
| 68 |
-
|
| 69 |
-
const QSize requiredSize(1024,1024);
|
| 70 |
-
QPixmap icon(networkStyle->getAppIcon().pixmap(requiredSize));
|
| 71 |
-
|
| 72 |
-
pixPaint.drawPixmap(rectIcon, icon);
|
| 73 |
-
|
| 74 |
-
// check font size and drawing with
|
| 75 |
-
pixPaint.setFont(QFont(font, 33*fontFactor));
|
| 76 |
-
QFontMetrics fm = pixPaint.fontMetrics();
|
| 77 |
-
int titleTextWidth = GUIUtil::TextWidth(fm, titleText);
|
| 78 |
-
if (titleTextWidth > 176) {
|
| 79 |
-
fontFactor = fontFactor * 176 / titleTextWidth;
|
| 80 |
-
}
|
| 81 |
-
|
| 82 |
-
pixPaint.setFont(QFont(font, 33*fontFactor));
|
| 83 |
-
fm = pixPaint.fontMetrics();
|
| 84 |
-
titleTextWidth = GUIUtil::TextWidth(fm, titleText);
|
| 85 |
-
pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight,paddingTop,titleText);
|
| 86 |
-
|
| 87 |
-
pixPaint.setFont(QFont(font, 15*fontFactor));
|
| 88 |
-
|
| 89 |
-
// if the version string is too long, reduce size
|
| 90 |
-
fm = pixPaint.fontMetrics();
|
| 91 |
-
int versionTextWidth = GUIUtil::TextWidth(fm, versionText);
|
| 92 |
-
if(versionTextWidth > titleTextWidth+paddingRight-10) {
|
| 93 |
-
pixPaint.setFont(QFont(font, 10*fontFactor));
|
| 94 |
-
titleVersionVSpace -= 5;
|
| 95 |
-
}
|
| 96 |
-
pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight+2,paddingTop+titleVersionVSpace,versionText);
|
| 97 |
-
|
| 98 |
-
// draw copyright stuff
|
| 99 |
-
{
|
| 100 |
-
pixPaint.setFont(QFont(font, 10*fontFactor));
|
| 101 |
-
const int x = pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight;
|
| 102 |
-
const int y = paddingTop+titleCopyrightVSpace;
|
| 103 |
-
QRect copyrightRect(x, y, pixmap.width() - x - paddingRight, pixmap.height() - y);
|
| 104 |
-
pixPaint.drawText(copyrightRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, copyrightText);
|
| 105 |
-
}
|
| 106 |
-
|
| 107 |
-
// draw additional text if special network
|
| 108 |
-
if(!titleAddText.isEmpty()) {
|
| 109 |
-
QFont boldFont = QFont(font, 10*fontFactor);
|
| 110 |
-
boldFont.setWeight(QFont::Bold);
|
| 111 |
-
pixPaint.setFont(boldFont);
|
| 112 |
-
fm = pixPaint.fontMetrics();
|
| 113 |
-
int titleAddTextWidth = GUIUtil::TextWidth(fm, titleAddText);
|
| 114 |
-
pixPaint.drawText(pixmap.width()/devicePixelRatio-titleAddTextWidth-10,15,titleAddText);
|
| 115 |
}
|
| 116 |
|
| 117 |
pixPaint.end();
|
| 118 |
|
| 119 |
// Set window title
|
| 120 |
-
setWindowTitle(titleText + " " + titleAddText);
|
| 121 |
|
| 122 |
// Resize window and move to center of desktop, disallow resizing
|
| 123 |
-
QRect r(QPoint(), QSize(pixmap.size().width()/devicePixelRatio,pixmap.size().height()/devicePixelRatio));
|
| 124 |
resize(r.size());
|
| 125 |
setFixedSize(r.size());
|
| 126 |
move(QGuiApplication::primaryScreen()->geometry().center() - r.center());
|
|
|
|
| 18 |
|
| 19 |
#include <functional>
|
| 20 |
|
| 21 |
+
#include <Qt>
|
| 22 |
+
#include <QtGlobal>
|
| 23 |
#include <QApplication>
|
| 24 |
#include <QCloseEvent>
|
| 25 |
+
#include <QFontInfo>
|
| 26 |
#include <QPainter>
|
|
|
|
| 27 |
#include <QScreen>
|
| 28 |
|
| 29 |
+
namespace {
|
| 30 |
+
const QColor SPLASH_TEXT_COLOR{0x03, 0x0b, 0x20};
|
| 31 |
+
const QColor SPLASH_MUTED_TEXT_COLOR{0x4d, 0x55, 0x66};
|
| 32 |
|
| 33 |
+
const QString& SplashFontFamily()
|
|
|
|
| 34 |
{
|
| 35 |
+
static const QString family = [] {
|
| 36 |
+
const QStringList preferred_families{
|
| 37 |
+
QStringLiteral("Inter"),
|
| 38 |
+
QStringLiteral("Segoe UI"),
|
| 39 |
+
QStringLiteral("Arial"),
|
| 40 |
+
};
|
| 41 |
+
for (const QString& preferred_family : preferred_families) {
|
| 42 |
+
const QFontInfo resolved_font{QFont{preferred_family}};
|
| 43 |
+
if (resolved_font.family().compare(preferred_family, Qt::CaseInsensitive) == 0) return preferred_family;
|
| 44 |
+
}
|
| 45 |
+
return QApplication::font().family();
|
| 46 |
+
}();
|
| 47 |
+
return family;
|
| 48 |
+
}
|
|
|
|
| 49 |
|
| 50 |
+
QFont SplashFont(qreal point_size, QFont::Weight weight = QFont::Normal)
|
| 51 |
+
{
|
| 52 |
+
QFont font{SplashFontFamily()};
|
| 53 |
+
font.setStyleHint(QFont::SansSerif);
|
| 54 |
+
font.setPointSizeF(point_size);
|
| 55 |
+
font.setWeight(weight);
|
| 56 |
+
return font;
|
| 57 |
+
}
|
| 58 |
+
} // namespace
|
| 59 |
|
| 60 |
+
SplashScreen::SplashScreen(const NetworkStyle* networkStyle)
|
| 61 |
+
: QWidget()
|
| 62 |
+
{
|
| 63 |
+
const qreal device_pixel_ratio{
|
| 64 |
+
static_cast<QGuiApplication*>(QCoreApplication::instance())->devicePixelRatio()};
|
| 65 |
+
const QString title_text{CLIENT_NAME};
|
| 66 |
+
const QString version_text{QString("Version %1").arg(QString::fromStdString(FormatFullVersion()))};
|
| 67 |
+
const QString copyright_text{QString::fromUtf8(CopyrightHolders(strprintf("\xc2\xA9 %u-%u ", 2009, COPYRIGHT_YEAR)).c_str())};
|
| 68 |
+
const QString& title_add_text{networkStyle->getTitleAddText()};
|
| 69 |
|
| 70 |
+
const QSize splash_size{qRound(480 * device_pixel_ratio), qRound(320 * device_pixel_ratio)};
|
| 71 |
+
pixmap = QPixmap{splash_size};
|
| 72 |
+
pixmap.setDevicePixelRatio(device_pixel_ratio);
|
| 73 |
|
| 74 |
QPainter pixPaint(&pixmap);
|
| 75 |
+
pixPaint.fillRect(QRect{QPoint{}, QSize{480, 320}}, Qt::white);
|
| 76 |
+
pixPaint.setPen(SPLASH_TEXT_COLOR);
|
| 77 |
+
|
| 78 |
+
constexpr int icon_size{172};
|
| 79 |
+
const QRect icon_rect{QPoint{24, 55}, QSize{icon_size, icon_size}};
|
| 80 |
+
QPixmap icon{":/icons/splash"};
|
| 81 |
+
icon = icon.scaledToWidth(qRound(icon_size * device_pixel_ratio), Qt::SmoothTransformation);
|
| 82 |
+
pixPaint.drawPixmap(icon_rect, icon);
|
| 83 |
+
|
| 84 |
+
const QStringList title_parts{title_text.split(' ', Qt::SkipEmptyParts)};
|
| 85 |
+
const QString bitcoin_title{title_parts.value(0, title_text)};
|
| 86 |
+
const QString roots_title{title_parts.size() > 1 ? title_parts.mid(1).join(' ') : QString{}};
|
| 87 |
+
constexpr int text_left{218};
|
| 88 |
+
constexpr int text_width{236};
|
| 89 |
+
auto fit_font = [](QFont font, const QString& text, int max_width) {
|
| 90 |
+
const int width{GUIUtil::TextWidth(QFontMetrics{font}, text)};
|
| 91 |
+
if (width > max_width) font.setPointSizeF(font.pointSizeF() * max_width / width);
|
| 92 |
+
return font;
|
| 93 |
+
};
|
| 94 |
+
|
| 95 |
+
pixPaint.setFont(fit_font(SplashFont(30, QFont::Medium), bitcoin_title, text_width));
|
| 96 |
+
pixPaint.drawText(text_left, 105, bitcoin_title);
|
| 97 |
+
pixPaint.setFont(fit_font(SplashFont(43, QFont::DemiBold), roots_title, text_width));
|
| 98 |
+
pixPaint.drawText(text_left, 151, roots_title);
|
| 99 |
+
pixPaint.setFont(fit_font(SplashFont(11, QFont::Medium), version_text, text_width));
|
| 100 |
+
pixPaint.setPen(SPLASH_MUTED_TEXT_COLOR);
|
| 101 |
+
pixPaint.drawText(text_left, 181, version_text);
|
| 102 |
+
|
| 103 |
+
pixPaint.setFont(SplashFont(8));
|
| 104 |
+
pixPaint.drawText(QRect{text_left, 210, text_width, 70}, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, copyright_text);
|
| 105 |
+
|
| 106 |
+
if (!title_add_text.isEmpty()) {
|
| 107 |
+
pixPaint.setFont(SplashFont(9, QFont::DemiBold));
|
| 108 |
+
const int title_add_text_width{GUIUtil::TextWidth(pixPaint.fontMetrics(), title_add_text)};
|
| 109 |
+
pixPaint.drawText(470 - title_add_text_width, 20, title_add_text);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
}
|
| 111 |
|
| 112 |
pixPaint.end();
|
| 113 |
|
| 114 |
// Set window title
|
| 115 |
+
setWindowTitle(title_text + " " + title_add_text);
|
| 116 |
|
| 117 |
// Resize window and move to center of desktop, disallow resizing
|
| 118 |
+
QRect r{QPoint{}, QSize{qRound(pixmap.size().width() / device_pixel_ratio), qRound(pixmap.size().height() / device_pixel_ratio)}};
|
| 119 |
resize(r.size());
|
| 120 |
setFixedSize(r.size());
|
| 121 |
move(QGuiApplication::primaryScreen()->geometry().center() - r.center());
|