5#include <bitcoin-build-config.h>
22#include <QApplication>
25#include <QRadialGradient>
33 int paddingRight = 50;
35 int titleVersionVSpace = 17;
36 int titleCopyrightVSpace = 40;
38 float fontFactor = 1.0;
39 float devicePixelRatio = 1.0;
40 devicePixelRatio =
static_cast<QGuiApplication*
>(QCoreApplication::instance())->devicePixelRatio();
43 QString titleText = CLIENT_NAME;
44 QString versionText = QString(
"Version %1").arg(QString::fromStdString(
FormatFullVersion()));
48 QString font = QApplication::font().toString();
51 QSize splashSize(480*devicePixelRatio,320*devicePixelRatio);
52 pixmap = QPixmap(splashSize);
55 pixmap.setDevicePixelRatio(devicePixelRatio);
57 QPainter pixPaint(&
pixmap);
58 pixPaint.setPen(QColor(100,100,100));
61 QRadialGradient gradient(QPoint(0,0), splashSize.width()/devicePixelRatio);
62 gradient.setColorAt(0, Qt::white);
63 gradient.setColorAt(1, QColor(247,247,247));
64 QRect rGradient(QPoint(0,0), splashSize);
65 pixPaint.fillRect(rGradient, gradient);
68 QRect rectIcon(QPoint(-150,-122), QSize(430,430));
70 const QSize requiredSize(1024,1024);
71 QPixmap icon(networkStyle->
getAppIcon().pixmap(requiredSize));
73 pixPaint.drawPixmap(rectIcon, icon);
76 pixPaint.setFont(QFont(font, 33*fontFactor));
77 QFontMetrics fm = pixPaint.fontMetrics();
79 if (titleTextWidth > 176) {
80 fontFactor = fontFactor * 176 / titleTextWidth;
83 pixPaint.setFont(QFont(font, 33*fontFactor));
84 fm = pixPaint.fontMetrics();
86 pixPaint.drawText(
pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight,paddingTop,titleText);
88 pixPaint.setFont(QFont(font, 15*fontFactor));
91 fm = pixPaint.fontMetrics();
93 if(versionTextWidth > titleTextWidth+paddingRight-10) {
94 pixPaint.setFont(QFont(font, 10*fontFactor));
95 titleVersionVSpace -= 5;
97 pixPaint.drawText(
pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight+2,paddingTop+titleVersionVSpace,versionText);
101 pixPaint.setFont(QFont(font, 10*fontFactor));
102 const int x =
pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight;
103 const int y = paddingTop+titleCopyrightVSpace;
104 QRect copyrightRect(x, y,
pixmap.width() - x - paddingRight,
pixmap.height() - y);
105 pixPaint.drawText(copyrightRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, copyrightText);
109 if(!titleAddText.isEmpty()) {
110 QFont boldFont = QFont(font, 10*fontFactor);
111 boldFont.setWeight(QFont::Bold);
112 pixPaint.setFont(boldFont);
113 fm = pixPaint.fontMetrics();
115 pixPaint.drawText(
pixmap.width()/devicePixelRatio-titleAddTextWidth-10,15,titleAddText);
121 setWindowTitle(titleText +
" " + titleAddText);
124 QRect r(QPoint(), QSize(
pixmap.size().width()/devicePixelRatio,
pixmap.size().height()/devicePixelRatio));
126 setFixedSize(r.size());
127 move(QGuiApplication::primaryScreen()->geometry().center() - r.center());
129 installEventFilter(
this);
154 if (ev->type() == QEvent::KeyPress) {
155 QKeyEvent *keyEvent =
static_cast<QKeyEvent *
>(ev);
156 if (keyEvent->key() == Qt::Key_Q) {
160 return QObject::eventFilter(obj, ev);
165 bool invoked = QMetaObject::invokeMethod(splash,
"showMessage",
166 Qt::QueuedConnection,
167 Q_ARG(QString, QString::fromStdString(message)),
168 Q_ARG(
int, Qt::AlignBottom|Qt::AlignHCenter),
169 Q_ARG(QColor, QColor(55,55,55)));
176 (resume_possible ? SplashScreen::tr(
"(press q to shutdown and continue later)").toStdString()
177 : SplashScreen::tr(
"press q to shutdown").toStdString()) +
199 ShowProgress(this, title, nProgress, false);
228 QPainter painter(
this);
229 painter.drawPixmap(0, 0,
pixmap);
230 QRect r = rect().adjusted(5, 5, -5, -5);
const QIcon & getAppIcon() const
const QString & getTitleAddText() const
Class for the splashscreen with information of the running client.
void shutdown()
Initiate shutdown.
std::unique_ptr< interfaces::Handler > m_handler_show_progress
void showMessage(const QString &message, int alignment, const QColor &color)
Show message and progress.
void unsubscribeFromCoreSignals()
Disconnect core signals to splash screen.
std::list< std::unique_ptr< interfaces::Wallet > > m_connected_wallets
void subscribeToCoreSignals()
Connect core signals to splash screen.
std::unique_ptr< interfaces::Handler > m_handler_init_wallet
std::list< std::unique_ptr< interfaces::Handler > > m_connected_wallet_handlers
std::unique_ptr< interfaces::Handler > m_handler_init_message
void paintEvent(QPaintEvent *event) override
void closeEvent(QCloseEvent *event) override
void handleLoadWallet()
Handle wallet load notifications.
void setNode(interfaces::Node &node)
bool eventFilter(QObject *obj, QEvent *ev) override
SplashScreen(const NetworkStyle *networkStyle)
std::unique_ptr< interfaces::Handler > m_handler_load_wallet
interfaces::Node * m_node
static bool isWalletEnabled()
Top-level interface for a bitcoin node (bitcoind process).
virtual std::unique_ptr< Handler > handleInitMessage(InitMessageFn fn)=0
virtual std::unique_ptr< Handler > handleShowProgress(ShowProgressFn fn)=0
virtual void startShutdown()=0
Start shutdown.
virtual std::unique_ptr< Handler > handleInitWallet(InitWalletFn fn)=0
virtual WalletLoader & walletLoader()=0
Get wallet loader.
virtual std::unique_ptr< Handler > handleLoadWallet(LoadWalletFn fn)=0
std::string FormatFullVersion()
std::string CopyrightHolders(const std::string &strPrefix)
void handleCloseWindowShortcut(QWidget *w)
int TextWidth(const QFontMetrics &fm, const QString &text)
Returns the distance in pixels appropriate for drawing a subsequent character after text.
bool(* handler)(const std::any &context, HTTPRequest *req, const std::string &strReq)
static void ShowProgress(SplashScreen *splash, const std::string &title, int nProgress, bool resume_possible)
static void InitMessage(SplashScreen *splash, const std::string &message)