1 // Copyright (c) 2011-2014 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #include "splashscreen.h"
7 #include "networkstyle.h"
9 #include "clientversion.h"
12 #include "ui_interface.h"
16 #include "wallet/wallet.h"
19 #include <QApplication>
20 #include <QCloseEvent>
21 #include <QDesktopWidget>
23 #include <QRadialGradient>
25 SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle) :
26 QWidget(0, f), curAlignment(0)
28 // set reference point, paddings
29 int paddingRight = 50;
31 int titleVersionVSpace = 17;
32 int titleCopyrightVSpace = 40;
34 float fontFactor = 1.0;
35 float devicePixelRatio = 1.0;
36 #if QT_VERSION > 0x050100
37 devicePixelRatio = ((QGuiApplication*)QCoreApplication::instance())->devicePixelRatio();
40 // define text to place
41 QString titleText = tr("Bitcoin Core");
42 QString versionText = QString("Version %1").arg(QString::fromStdString(FormatFullVersion()));
43 QString copyrightText = QChar(0xA9)+QString(" 2009-%1 ").arg(COPYRIGHT_YEAR) + QString(tr("The Bitcoin Core developers"));
44 QString titleAddText = networkStyle->getTitleAddText();
46 QString font = QApplication::font().toString();
48 // create a bitmap according to device pixelratio
49 QSize splashSize(480*devicePixelRatio,320*devicePixelRatio);
50 pixmap = QPixmap(splashSize);
52 #if QT_VERSION > 0x050100
53 // change to HiDPI if it makes sense
54 pixmap.setDevicePixelRatio(devicePixelRatio);
57 QPainter pixPaint(&pixmap);
58 pixPaint.setPen(QColor(100,100,100));
60 // draw a slightly radial gradient
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);
67 // draw the bitcoin icon, expected size of PNG: 1024x1024
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);
75 // check font size and drawing with
76 pixPaint.setFont(QFont(font, 33*fontFactor));
77 QFontMetrics fm = pixPaint.fontMetrics();
78 int titleTextWidth = fm.width(titleText);
79 if(titleTextWidth > 160) {
80 // strange font rendering, Arial probably not found
84 pixPaint.setFont(QFont(font, 33*fontFactor));
85 fm = pixPaint.fontMetrics();
86 titleTextWidth = fm.width(titleText);
87 pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight,paddingTop,titleText);
89 pixPaint.setFont(QFont(font, 15*fontFactor));
91 // if the version string is to long, reduce size
92 fm = pixPaint.fontMetrics();
93 int versionTextWidth = fm.width(versionText);
94 if(versionTextWidth > titleTextWidth+paddingRight-10) {
95 pixPaint.setFont(QFont(font, 10*fontFactor));
96 titleVersionVSpace -= 5;
98 pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight+2,paddingTop+titleVersionVSpace,versionText);
100 // draw copyright stuff
101 pixPaint.setFont(QFont(font, 10*fontFactor));
102 pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight,paddingTop+titleCopyrightVSpace,copyrightText);
104 // draw additional text if special network
105 if(!titleAddText.isEmpty()) {
106 QFont boldFont = QFont(font, 10*fontFactor);
107 boldFont.setWeight(QFont::Bold);
108 pixPaint.setFont(boldFont);
109 fm = pixPaint.fontMetrics();
110 int titleAddTextWidth = fm.width(titleAddText);
111 pixPaint.drawText(pixmap.width()/devicePixelRatio-titleAddTextWidth-10,15,titleAddText);
117 setWindowTitle(titleText + " " + titleAddText);
119 // Resize window and move to center of desktop, disallow resizing
120 QRect r(QPoint(), QSize(pixmap.size().width()/devicePixelRatio,pixmap.size().height()/devicePixelRatio));
122 setFixedSize(r.size());
123 move(QApplication::desktop()->screenGeometry().center() - r.center());
125 subscribeToCoreSignals();
128 SplashScreen::~SplashScreen()
130 unsubscribeFromCoreSignals();
133 void SplashScreen::slotFinish(QWidget *mainWin)
139 static void InitMessage(SplashScreen *splash, const std::string &message)
141 QMetaObject::invokeMethod(splash, "showMessage",
142 Qt::QueuedConnection,
143 Q_ARG(QString, QString::fromStdString(message)),
144 Q_ARG(int, Qt::AlignBottom|Qt::AlignHCenter),
145 Q_ARG(QColor, QColor(55,55,55)));
148 static void ShowProgress(SplashScreen *splash, const std::string &title, int nProgress)
150 InitMessage(splash, title + strprintf("%d", nProgress) + "%");
154 static void ConnectWallet(SplashScreen *splash, CWallet* wallet)
156 wallet->ShowProgress.connect(boost::bind(ShowProgress, splash, _1, _2));
160 void SplashScreen::subscribeToCoreSignals()
162 // Connect signals to client
163 uiInterface.InitMessage.connect(boost::bind(InitMessage, this, _1));
164 uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2));
166 uiInterface.LoadWallet.connect(boost::bind(ConnectWallet, this, _1));
170 void SplashScreen::unsubscribeFromCoreSignals()
172 // Disconnect signals from client
173 uiInterface.InitMessage.disconnect(boost::bind(InitMessage, this, _1));
174 uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
177 pwalletMain->ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
181 void SplashScreen::showMessage(const QString &message, int alignment, const QColor &color)
183 curMessage = message;
184 curAlignment = alignment;
189 void SplashScreen::paintEvent(QPaintEvent *event)
191 QPainter painter(this);
192 painter.drawPixmap(0, 0, pixmap);
193 QRect r = rect().adjusted(5, 5, -5, -5);
194 painter.setPen(curColor);
195 painter.drawText(r, curAlignment, curMessage);
198 void SplashScreen::closeEvent(QCloseEvent *event)
200 StartShutdown(); // allows an "emergency" shutdown during startup