]> Git Repo - VerusCoin.git/blob - src/qt/splashscreen.cpp
Merge pull request #77 from jl777/acspeed
[VerusCoin.git] / src / qt / splashscreen.cpp
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.
4
5 #include "splashscreen.h"
6
7 #include "networkstyle.h"
8
9 #include "clientversion.h"
10 #include "init.h"
11 #include "util.h"
12 #include "ui_interface.h"
13 #include "version.h"
14
15 #ifdef ENABLE_WALLET
16 #include "wallet/wallet.h"
17 #endif
18
19 #include <QApplication>
20 #include <QCloseEvent>
21 #include <QDesktopWidget>
22 #include <QPainter>
23 #include <QRadialGradient>
24
25 SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle) :
26     QWidget(0, f), curAlignment(0)
27 {
28     // set reference point, paddings
29     int paddingRight            = 50;
30     int paddingTop              = 50;
31     int titleVersionVSpace      = 17;
32     int titleCopyrightVSpace    = 40;
33
34     float fontFactor            = 1.0;
35     float devicePixelRatio      = 1.0;
36 #if QT_VERSION > 0x050100
37     devicePixelRatio = ((QGuiApplication*)QCoreApplication::instance())->devicePixelRatio();
38 #endif
39
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();
45
46     QString font            = QApplication::font().toString();
47
48     // create a bitmap according to device pixelratio
49     QSize splashSize(480*devicePixelRatio,320*devicePixelRatio);
50     pixmap = QPixmap(splashSize);
51
52 #if QT_VERSION > 0x050100
53     // change to HiDPI if it makes sense
54     pixmap.setDevicePixelRatio(devicePixelRatio);
55 #endif
56
57     QPainter pixPaint(&pixmap);
58     pixPaint.setPen(QColor(100,100,100));
59
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);
66
67     // draw the bitcoin icon, expected size of PNG: 1024x1024
68     QRect rectIcon(QPoint(-150,-122), QSize(430,430));
69
70     const QSize requiredSize(1024,1024);
71     QPixmap icon(networkStyle->getAppIcon().pixmap(requiredSize));
72
73     pixPaint.drawPixmap(rectIcon, icon);
74
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
81         fontFactor = 0.75;
82     }
83
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);
88
89     pixPaint.setFont(QFont(font, 15*fontFactor));
90
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;
97     }
98     pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight+2,paddingTop+titleVersionVSpace,versionText);
99
100     // draw copyright stuff
101     pixPaint.setFont(QFont(font, 10*fontFactor));
102     pixPaint.drawText(pixmap.width()/devicePixelRatio-titleTextWidth-paddingRight,paddingTop+titleCopyrightVSpace,copyrightText);
103
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);
112     }
113
114     pixPaint.end();
115
116     // Set window title
117     setWindowTitle(titleText + " " + titleAddText);
118
119     // Resize window and move to center of desktop, disallow resizing
120     QRect r(QPoint(), QSize(pixmap.size().width()/devicePixelRatio,pixmap.size().height()/devicePixelRatio));
121     resize(r.size());
122     setFixedSize(r.size());
123     move(QApplication::desktop()->screenGeometry().center() - r.center());
124
125     subscribeToCoreSignals();
126 }
127
128 SplashScreen::~SplashScreen()
129 {
130     unsubscribeFromCoreSignals();
131 }
132
133 void SplashScreen::slotFinish(QWidget *mainWin)
134 {
135     Q_UNUSED(mainWin);
136     hide();
137 }
138
139 static void InitMessage(SplashScreen *splash, const std::string &message)
140 {
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)));
146 }
147
148 static void ShowProgress(SplashScreen *splash, const std::string &title, int nProgress)
149 {
150     InitMessage(splash, title + strprintf("%d", nProgress) + "%");
151 }
152
153 #ifdef ENABLE_WALLET
154 static void ConnectWallet(SplashScreen *splash, CWallet* wallet)
155 {
156     wallet->ShowProgress.connect(boost::bind(ShowProgress, splash, _1, _2));
157 }
158 #endif
159
160 void SplashScreen::subscribeToCoreSignals()
161 {
162     // Connect signals to client
163     uiInterface.InitMessage.connect(boost::bind(InitMessage, this, _1));
164     uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2));
165 #ifdef ENABLE_WALLET
166     uiInterface.LoadWallet.connect(boost::bind(ConnectWallet, this, _1));
167 #endif
168 }
169
170 void SplashScreen::unsubscribeFromCoreSignals()
171 {
172     // Disconnect signals from client
173     uiInterface.InitMessage.disconnect(boost::bind(InitMessage, this, _1));
174     uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
175 #ifdef ENABLE_WALLET
176     if(pwalletMain)
177         pwalletMain->ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
178 #endif
179 }
180
181 void SplashScreen::showMessage(const QString &message, int alignment, const QColor &color)
182 {
183     curMessage = message;
184     curAlignment = alignment;
185     curColor = color;
186     update();
187 }
188
189 void SplashScreen::paintEvent(QPaintEvent *event)
190 {
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);
196 }
197
198 void SplashScreen::closeEvent(QCloseEvent *event)
199 {
200     StartShutdown(); // allows an "emergency" shutdown during startup
201     event->ignore();
202 }
This page took 0.034132 seconds and 4 git commands to generate.