Skip to content
Bitcoin Roots

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());