Spinning Wait Clock moved to Widgets

This commit is contained in:
Balthasar Reuter
2018-06-07 01:08:31 +02:00
parent b45dc7533b
commit 0b7459065c
2 changed files with 94 additions and 58 deletions

View File

@@ -3,8 +3,6 @@
from os.path import expanduser from os.path import expanduser
import math
from PyQt5 import QtCore from PyQt5 import QtCore
from PyQt5 import QtGui from PyQt5 import QtGui
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
@@ -166,23 +164,21 @@ class PictureMessage(QtWidgets.QFrame):
class WaitMessage(QtWidgets.QFrame): class WaitMessage(QtWidgets.QFrame):
# With spinning wait clock, inspired by
# https://wiki.python.org/moin/PyQt/A%20full%20widget%20waiting%20indicator
def __init__(self, message): def __init__(self, message):
super().__init__() super().__init__()
self._message = message self._message = message
self._clock = Widgets.SpinningWaitClock()
def showEvent(self, event): def showEvent(self, event):
self._counter = 0
self.startTimer(100) self.startTimer(100)
def timerEvent(self, event): def timerEvent(self, event):
self._counter += 1 self._clock.value += 1
self.update() self.update()
def _paintMessage(self, painter): def _paintMessage(self, painter):
@@ -191,36 +187,20 @@ class WaitMessage(QtWidgets.QFrame):
f.setPixelSize(self.height() / 8) f.setPixelSize(self.height() / 8)
painter.setFont(f) painter.setFont(f)
rect = QtCore.QRect(0, self.height() * 3 / 5, rect = QtCore.QRect(0, self.height() * 3 / 5, self.width(),
self.width(), self.height() * 3 / 10) self.height() * 3 / 10)
painter.drawText(rect, QtCore.Qt.AlignCenter, self._message) painter.drawText(rect, QtCore.Qt.AlignCenter, self._message)
def _paintClock(self, painter):
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
center = (self.width() / 2, self.height() / 2)
dots = 8
pos = self._counter % dots
for i in range(dots):
distance = (pos - i) % dots
color = (distance + 1) / (dots + 1) * 255
painter.setBrush(QtGui.QBrush(QtGui.QColor(color, color, color)))
painter.drawEllipse(
center[0] + 180 / dots * math.cos(2 * math.pi * i / dots) - 20,
center[1] + 180 / dots * math.sin(2 * math.pi * i / dots) - 20,
15, 15)
def paintEvent(self, event): def paintEvent(self, event):
offset = ((self.width() - self._clock.width()) // 2,
(self.height() - self._clock.height()) // 2)
painter = QtGui.QPainter(self) painter = QtGui.QPainter(self)
self._paintMessage(painter) self._paintMessage(painter)
self._paintClock(painter) self._clock.render(painter, QtCore.QPoint(*offset),
self._clock.visibleRegion(),
QtWidgets.QWidget.DrawChildren)
painter.end() painter.end()
@@ -237,15 +217,6 @@ class CountdownMessage(QtWidgets.QFrame):
self._initProgressBar(time) self._initProgressBar(time)
def _initProgressBar(self, time):
self._bar = Widgets.RoundProgressBar(0, time, time)
self._bar.setFixedSize(200, 200)
def _updateProgressBar(self):
self._bar.value = self._value / (1000 // self._step_size)
@property @property
def value(self): def value(self):
@@ -269,26 +240,14 @@ class CountdownMessage(QtWidgets.QFrame):
self._picture = picture self._picture = picture
def paintEvent(self, event): def _initProgressBar(self, time):
# background image self._bar = Widgets.RoundProgressBar(0, time, time)
if self.picture is not None: self._bar.setFixedSize(200, 200)
painter = QtGui.QPainter(self)
pix = QtGui.QPixmap.fromImage(self.picture) def _updateProgressBar(self):
pix = pix.scaled(self.size(), QtCore.Qt.KeepAspectRatio,
QtCore.Qt.FastTransformation)
origin = ((self.width() - pix.width()) // 2,
(self.height() - pix.height()) // 2)
painter.drawPixmap(QtCore.QPoint(*origin), pix)
painter.end() self._bar.value = self._value / (1000 // self._step_size)
offset = ((self.width() - self._bar.width()) // 2,
(self.height() - self._bar.height()) // 2)
self._bar.render(self, QtCore.QPoint(*offset),
self._bar.visibleRegion(),
QtWidgets.QWidget.DrawChildren)
def showEvent(self, event): def showEvent(self, event):
@@ -305,6 +264,28 @@ class CountdownMessage(QtWidgets.QFrame):
self._updateProgressBar() self._updateProgressBar()
self.update() self.update()
def paintEvent(self, event):
painter = QtGui.QPainter(self)
# background image
if self.picture is not None:
pix = QtGui.QPixmap.fromImage(self.picture)
pix = pix.scaled(self.size(), QtCore.Qt.KeepAspectRatio,
QtCore.Qt.FastTransformation)
origin = ((self.width() - pix.width()) // 2,
(self.height() - pix.height()) // 2)
painter.drawPixmap(QtCore.QPoint(*origin), pix)
offset = ((self.width() - self._bar.width()) // 2,
(self.height() - self._bar.height()) // 2)
self._bar.render(painter, QtCore.QPoint(*offset),
self._bar.visibleRegion(),
QtWidgets.QWidget.DrawChildren)
painter.end()
class Settings(QtWidgets.QFrame): class Settings(QtWidgets.QFrame):

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from math import ceil import math
from PyQt5 import Qt from PyQt5 import Qt
from PyQt5 import QtCore from PyQt5 import QtCore
@@ -9,6 +9,61 @@ from PyQt5 import QtGui
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
class SpinningWaitClock(QtWidgets.QWidget):
# Spinning wait clock, inspired by
# https://wiki.python.org/moin/PyQt/A%20full%20widget%20waiting%20indicator
def __init__(self):
super().__init__()
self._num_dots = 8
self._value = 0
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if self._value != value:
self._value = value
self.update()
def showEvent(self, event):
self.startTimer(100)
def timerEvent(self, event):
self.value += 1
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
dots = self._num_dots
center = (self.width() / 2, self.height() / 2)
pos = self.value % dots
for dot in range(dots):
distance = (pos - dot) % dots
offset = (180 / dots * math.cos(2 * math.pi * dot / dots) - 20,
180 / dots * math.sin(2 * math.pi * dot / dots) - 20)
color = (distance + 1) / (dots + 1) * 255
painter.setBrush(QtGui.QBrush(QtGui.QColor(color, color, color)))
painter.drawEllipse(center[0] + offset[0], center[1] + offset[1],
15, 15)
painter.end()
class RoundProgressBar(QtWidgets.QWidget): class RoundProgressBar(QtWidgets.QWidget):
# Adaptation of QRoundProgressBar from # Adaptation of QRoundProgressBar from
# https://sourceforge.net/projects/qroundprogressbar/ # https://sourceforge.net/projects/qroundprogressbar/
@@ -76,7 +131,7 @@ class RoundProgressBar(QtWidgets.QWidget):
def _drawText(self, painter, inner_rect, inner_radius): def _drawText(self, painter, inner_rect, inner_radius):
text = '{}'.format(ceil(self.value)) text = '{}'.format(math.ceil(self.value))
f = self.font() f = self.font()
f.setPixelSize(inner_radius * 0.8 / len(text)) f.setPixelSize(inner_radius * 0.8 / len(text))