Dash Core  0.12.2.1
P2P Digital Currency
splashscreen.cpp
Go to the documentation of this file.
1 // Copyright (c) 2011-2015 The Bitcoin Core developers
2 // Copyright (c) 2014-2017 The Dash Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #include "splashscreen.h"
7 
8 #include "guiutil.h"
9 #include "networkstyle.h"
10 
11 #include "clientversion.h"
12 #include "init.h"
13 #include "util.h"
14 #include "ui_interface.h"
15 #include "version.h"
16 #ifdef ENABLE_WALLET
17 #include "wallet/wallet.h"
18 #endif
19 
20 #include <QApplication>
21 #include <QCloseEvent>
22 #include <QDesktopWidget>
23 #include <QPainter>
24 
25 SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle) :
26  QWidget(0, f), curAlignment(0)
27 {
28 
29  // transparent background
30  setAttribute(Qt::WA_TranslucentBackground);
31  setStyleSheet("background:transparent;");
32 
33  // no window decorations
34  setWindowFlags(Qt::FramelessWindowHint);
35 
36  // set reference point, paddings
37  int paddingLeft = 14;
38  int paddingTop = 470;
39  int titleVersionVSpace = 17;
40  int titleCopyrightVSpace = 32;
41 
42  float fontFactor = 1.0;
43 
44  // define text to place
45  QString titleText = tr("Dash Core");
46  QString versionText = QString(tr("Version %1")).arg(QString::fromStdString(FormatFullVersion()));
47  QString copyrightTextBtc = QChar(0xA9)+QString(" 2009-%1 ").arg(COPYRIGHT_YEAR) + QString(tr("The Bitcoin Core developers"));
48  QString copyrightTextDash = QChar(0xA9)+QString(" 2014-%1 ").arg(COPYRIGHT_YEAR) + QString(tr("The Dash Core developers"));
49  QString titleAddText = networkStyle->getTitleAddText();
50  // networkstyle.cpp can't (yet) read themes, so we do it here to get the correct Splash-screen
51  QString splashScreenPath = ":/images/" + GUIUtil::getThemeName() + "/splash";
52  if(GetBoolArg("-regtest", false))
53  splashScreenPath = ":/images/" + GUIUtil::getThemeName() + "/splash_testnet";
54  if(GetBoolArg("-testnet", false))
55  splashScreenPath = ":/images/" + GUIUtil::getThemeName() + "/splash_testnet";
56 
57  QString font = QApplication::font().toString();
58 
59  // load the bitmap for writing some text over it
60  pixmap = QPixmap(splashScreenPath);
61 
62  QPainter pixPaint(&pixmap);
63  pixPaint.setPen(QColor(100,100,100));
64 
65  // check font size and drawing with
66  pixPaint.setFont(QFont(font, 28*fontFactor));
67  QFontMetrics fm = pixPaint.fontMetrics();
68  int titleTextWidth = fm.width(titleText);
69  if(titleTextWidth > 160) {
70  // strange font rendering, Arial probably not found
71  fontFactor = 0.75;
72  }
73 
74  pixPaint.setFont(QFont(font, 28*fontFactor));
75  fm = pixPaint.fontMetrics();
76  titleTextWidth = fm.width(titleText);
77  pixPaint.drawText(paddingLeft,paddingTop,titleText);
78 
79  pixPaint.setFont(QFont(font, 15*fontFactor));
80  pixPaint.drawText(paddingLeft,paddingTop+titleVersionVSpace,versionText);
81 
82  // draw copyright stuff
83  pixPaint.setFont(QFont(font, 10*fontFactor));
84  pixPaint.drawText(paddingLeft,paddingTop+titleCopyrightVSpace,copyrightTextBtc);
85  pixPaint.drawText(paddingLeft,paddingTop+titleCopyrightVSpace+12,copyrightTextDash);
86 
87  // draw additional text if special network
88  if(!titleAddText.isEmpty()) {
89  QFont boldFont = QFont(font, 10*fontFactor);
90  boldFont.setWeight(QFont::Bold);
91  pixPaint.setFont(boldFont);
92  fm = pixPaint.fontMetrics();
93  int titleAddTextWidth = fm.width(titleAddText);
94  pixPaint.drawText(pixmap.width()-titleAddTextWidth-10,pixmap.height()-25,titleAddText);
95  }
96 
97  pixPaint.end();
98 
99  // Resize window and move to center of desktop, disallow resizing
100  QRect r(QPoint(), pixmap.size());
101  resize(r.size());
102  setFixedSize(r.size());
103  move(QApplication::desktop()->screenGeometry().center() - r.center());
104 
106 }
107 
109 {
111 }
112 
113 void SplashScreen::slotFinish(QWidget *mainWin)
114 {
115  Q_UNUSED(mainWin);
116 
117  /* If the window is minimized, hide() will be ignored. */
118  /* Make sure we de-minimize the splashscreen window before hiding */
119  if (isMinimized())
120  showNormal();
121  hide();
122  deleteLater(); // No more need for this
123 }
124 
125 static void InitMessage(SplashScreen *splash, const std::string &message)
126 {
127  QMetaObject::invokeMethod(splash, "showMessage",
128  Qt::QueuedConnection,
129  Q_ARG(QString, QString::fromStdString(message)),
130  Q_ARG(int, Qt::AlignBottom|Qt::AlignHCenter),
131  Q_ARG(QColor, QColor(55,55,55)));
132 }
133 
134 static void ShowProgress(SplashScreen *splash, const std::string &title, int nProgress)
135 {
136  InitMessage(splash, title + strprintf("%d", nProgress) + "%");
137 }
138 
139 #ifdef ENABLE_WALLET
140 static void ConnectWallet(SplashScreen *splash, CWallet* wallet)
141 {
142  wallet->ShowProgress.connect(boost::bind(ShowProgress, splash, _1, _2));
143 }
144 #endif
145 
147 {
148  // Connect signals to client
149  uiInterface.InitMessage.connect(boost::bind(InitMessage, this, _1));
150  uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2));
151 #ifdef ENABLE_WALLET
152  uiInterface.LoadWallet.connect(boost::bind(ConnectWallet, this, _1));
153 #endif
154 }
155 
157 {
158  // Disconnect signals from client
159  uiInterface.InitMessage.disconnect(boost::bind(InitMessage, this, _1));
160  uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
161 #ifdef ENABLE_WALLET
162  if(pwalletMain)
163  pwalletMain->ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2));
164 #endif
165 }
166 
167 void SplashScreen::showMessage(const QString &message, int alignment, const QColor &color)
168 {
169  curMessage = message;
170  curAlignment = alignment;
171  curColor = color;
172  update();
173 }
174 
175 void SplashScreen::paintEvent(QPaintEvent *event)
176 {
177  QPainter painter(this);
178  painter.drawPixmap(0, 0, pixmap);
179  QRect r = rect().adjusted(5, 5, -5, -5);
180  painter.setPen(curColor);
181  painter.drawText(r, curAlignment, curMessage);
182 }
183 
184 void SplashScreen::closeEvent(QCloseEvent *event)
185 {
186  StartShutdown(); // allows an "emergency" shutdown during startup
187  event->ignore();
188 }
boost::signals2::signal< void(const std::string &message)> InitMessage
Definition: ui_interface.h:83
QPixmap pixmap
Definition: splashscreen.h:43
#define strprintf
Definition: tinyformat.h:1011
QColor curColor
Definition: splashscreen.h:45
void StartShutdown()
Definition: init.cpp:164
void closeEvent(QCloseEvent *event)
static void ShowProgress(SplashScreen *splash, const std::string &title, int nProgress)
void subscribeToCoreSignals()
CWallet * pwalletMain
void showMessage(const QString &message, int alignment, const QColor &color)
bool GetBoolArg(const std::string &strArg, bool fDefault)
Definition: util.cpp:455
static void InitMessage(SplashScreen *splash, const std::string &message)
boost::signals2::signal< void(const std::string &title, int nProgress)> ShowProgress
Definition: ui_interface.h:104
void unsubscribeFromCoreSignals()
const QString & getTitleAddText() const
Definition: networkstyle.h:24
boost::signals2::signal< void(CWallet *wallet)> LoadWallet
Definition: ui_interface.h:101
void slotFinish(QWidget *mainWin)
boost::signals2::signal< void(const std::string &title, int nProgress)> ShowProgress
Definition: wallet.h:1021
#define COPYRIGHT_YEAR
Definition: clientversion.h:29
CClientUIInterface uiInterface
Definition: init.cpp:130
Definition: wallet.py:1
std::string FormatFullVersion()
SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
QString getThemeName()
Definition: guiutil.cpp:902
const char * titleAddText
QString curMessage
Definition: splashscreen.h:44
void paintEvent(QPaintEvent *event)