diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 20e15cb1ec..0c84a66d14 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -6,7 +6,7 @@ from functools import partial import apsw from PyQt5.Qt import ( - QCoreApplication, QIcon, QObject, QTimer, Qt, QSplashScreen, QBrush, QColor) + QCoreApplication, QIcon, QObject, QTimer) from calibre import prints, plugins, force_unicode from calibre.constants import (iswindows, __appname__, isosx, DEBUG, islinux, @@ -16,6 +16,7 @@ from calibre.gui2 import ( ORG_NAME, APP_UID, initialize_file_icon_provider, Application, choose_dir, error_dialog, question_dialog, gprefs, setup_gui_option_parser) from calibre.gui2.main_window import option_parser as _option_parser +from calibre.gui2.splash_screen import SplashScreen from calibre.utils.config import prefs, dynamic if iswindows: @@ -160,36 +161,6 @@ class EventAccumulator(object): def __call__(self, ev): self.events.append(ev) -class SplashScreen(QSplashScreen): - - def __init__(self): - self.drawn_once = False - pmap = QIcon(I('library.png', allow_user_override=False)).pixmap(512, 512) - QSplashScreen.__init__(self, pmap) - self.setWindowTitle(__appname__) - - def drawContents(self, painter): - self.drawn_once = True - painter.setBackgroundMode(Qt.OpaqueMode) - painter.setBackground(QBrush(QColor(0xee, 0xee, 0xee))) - painter.setPen(Qt.black) - painter.setRenderHint(painter.TextAntialiasing, True) - r = self.rect().adjusted(5, 5, -5, -5) - br = painter.drawText(r, Qt.AlignLeft, self.message()) - painter.fillRect(br.adjusted(-2, -3, 80, 3), painter.background()) - br = painter.drawText(r, Qt.AlignLeft, self.message()) - - def show_message(self, msg): - self.showMessage(msg) - self.wait_for_draw() - - def wait_for_draw(self): - # Without this the splash screen is not painted on linux and windows - self.drawn_once = False - st = time.time() - while not self.drawn_once and (time.time() - st < 0.1): - Application.instance().processEvents() - class GuiRunner(QObject): '''Make sure an event loop is running before starting the main work of initialization''' diff --git a/src/calibre/gui2/splash_screen.py b/src/calibre/gui2/splash_screen.py new file mode 100644 index 0000000000..505d8a87b7 --- /dev/null +++ b/src/calibre/gui2/splash_screen.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python2 +# vim:fileencoding=utf-8 +# License: GPLv3 Copyright: 2016, Kovid Goyal + +from __future__ import (unicode_literals, division, absolute_import, + print_function) + +from PyQt5.Qt import Qt, QSplashScreen, QIcon, QApplication, QTransform + +from calibre.constants import __appname__ +from calibre.utils.monotonic import monotonic + +class SplashScreen(QSplashScreen): + + def __init__(self, develop=False): + self.drawn_once = False + self.develop = develop + pmap = QIcon(I('library.png', allow_user_override=False)).pixmap(512, 512) + QSplashScreen.__init__(self, pmap) + self.setWindowTitle(__appname__) + + def drawContents(self, painter): + self.drawn_once = True + painter.save() + painter.setPen(Qt.black) + painter.setRenderHint(painter.TextAntialiasing, True) + f = painter.font() + f.setPixelSize(18) + painter.setFont(f) + t = QTransform() + t.translate(330, 450) + painter.setTransform(t) + painter.rotate(-98) + painter.drawText(0, 0, self.message()) + painter.restore() + + def show_message(self, msg): + self.showMessage(msg) + self.wait_for_draw() + + def wait_for_draw(self): + # Without this the splash screen is not painted on linux and windows + self.drawn_once = False + st = monotonic() + while not self.drawn_once and (monotonic() - st < 0.1): + QApplication.instance().processEvents() + + def keyPressEvent(self, ev): + if not self.develop: + return QSplashScreen.keyPressEvent(self, ev) + ev.accept() + QApplication.instance().quit() + +if __name__ == '__main__': + from calibre.gui2 import Application + app = Application([]) + spl = SplashScreen(develop=True) + spl.show() + spl.show_message('Testing the splash screen message...') + app.exec_()