Spinning Wait Clock moved to Widgets
This commit is contained in:
@@ -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):
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user