diff --git a/src/calibre/gui2/splash_screen.py b/src/calibre/gui2/splash_screen.py index 5457dd50dc..26cf40fc7e 100644 --- a/src/calibre/gui2/splash_screen.py +++ b/src/calibre/gui2/splash_screen.py @@ -2,45 +2,97 @@ # vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal -from __future__ import (unicode_literals, division, absolute_import, - print_function) +from __future__ import absolute_import, division, print_function, unicode_literals -from PyQt5.Qt import Qt, QSplashScreen, QIcon, QApplication, QTransform, QPainterPath, QBrush +from PyQt5.Qt import ( + QApplication, QBrush, QColor, QFont, QFontMetrics, QPen, QPixmap, QSplashScreen, + Qt +) -from calibre.constants import __appname__, iswindows +from calibre.constants import __appname__, numeric_version from calibre.utils.monotonic import monotonic class SplashScreen(QSplashScreen): + TITLE_SIZE = 20 # pt + BODY_SIZE = 12 # pt + FOOTER_SIZE = 9 # pt + LOGO_SIZE = 128 + def __init__(self, develop=False): self.drawn_once = False self.develop = develop - pmap = QIcon(I('library.png', allow_user_override=False)).pixmap(512, 512) + self.title_font = f = QFont() + f.setPointSize(self.TITLE_SIZE) + f.setBold(True) + self.title_height = QFontMetrics(f).lineSpacing() + 2 + self.body_font = f = QFont() + f.setPointSize(self.BODY_SIZE) + self.line_height = QFontMetrics(f).lineSpacing() + self.num_font = f = QFont() + f.setPixelSize(self.LOGO_SIZE) + f.setItalic(True), f.setBold(True) + f = QFontMetrics(f) + self.num_ch = str(numeric_version[0]) + self.footer_font = f = QFont() + f.setPointSize(self.FOOTER_SIZE) + f.setItalic(True) + self.dpr = QApplication.instance().devicePixelRatio() + self.pmap = QPixmap(I('library.png', allow_user_override=False)) + self.pmap.setDevicePixelRatio(self.dpr) + self.pmap = self.pmap.scaled(self.dpr * self.LOGO_SIZE, self.dpr * self.LOGO_SIZE, transformMode=Qt.SmoothTransformation) + self.light_brush = QBrush(QColor('#F6F3E9')) + self.dark_brush = QBrush(QColor('#39322B')) + pmap = QPixmap(600 * self.dpr, 600 * self.dpr) + pmap.setDevicePixelRatio(self.dpr) + pmap.fill(Qt.transparent) QSplashScreen.__init__(self, pmap) self.setWindowTitle(__appname__) def drawContents(self, painter): + QSplashScreen.drawContents(self, painter) self.drawn_once = True painter.save() - painter.setPen(Qt.black) painter.setRenderHint(painter.TextAntialiasing, True) painter.setRenderHint(painter.Antialiasing, True) - f = painter.font() - f.setPixelSize(18) - painter.setFont(f) - t = QTransform() - t.translate(330, 450) - painter.setTransform(t) - painter.rotate(-98) - left_margin = 25 - if iswindows: - # On windows Qt cannot anti-alias rotated text - p = QPainterPath() - p.addText(left_margin, 0, f, self.message()) - painter.fillPath(p, QBrush(Qt.black)) - else: - painter.drawText(left_margin, 0, self.message()) + pw = height = self.LOGO_SIZE + width = self.width() + + # Draw frame + y = (self.height() - height) // 2 + bottom = y + height + painter.fillRect(0, y, width, height, self.light_brush) + painter.fillRect(0, y, width, self.title_height, self.dark_brush) + painter.fillRect(0, y, pw, height, self.dark_brush) + painter.drawPixmap(0, y, self.pmap) + + # Draw number + painter.setFont(self.num_font) + num_width = painter.boundingRect(0, 0, 0, 0, Qt.AlignCenter | Qt.TextSingleLine, self.num_ch).width() + 12 + num_x = width - num_width + painter.setPen(QPen(QColor('#d6b865'))) + painter.drawText(num_x, y, num_width, height, Qt.AlignCenter | Qt.TextSingleLine, self.num_ch) + + # Draw title + x = pw + 10 + width -= num_width + 5 + x + painter.setFont(self.title_font) + painter.drawText(x, y, width, self.title_height, Qt.AlignLeft | Qt.AlignVCenter | Qt.TextSingleLine, "CALIBRE") + + # Draw starting up message + y += self.title_height + 5 + painter.setPen(QPen(self.dark_brush.color())) + painter.setFont(self.body_font) + painter.drawText(x, y, width, self.line_height, Qt.AlignLeft | Qt.AlignVCenter | Qt.TextSingleLine, _( + 'Starting up, please wait...')) + + # Draw footer + m = self.message() + if m and m.strip(): + painter.setFont(self.footer_font) + painter.drawText(x, bottom - self.line_height, width, self.line_height, Qt.AlignLeft | Qt.AlignTop | Qt.TextSingleLine, m) + painter.restore() def show_message(self, msg): @@ -69,5 +121,6 @@ def main(): spl.show_message('Testing the splash screen message...') app.exec_() + if __name__ == '__main__': main()