Tue, 02 Mar 2021 17:17:09 +0100
Changed the use of PyQt enums because the way they were used previously is deprecated since two years and replaced some deprecated Qt stuff.
# -*- coding: utf-8 -*- # Copyright (c) 2012 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> # """ Module implementing the snapshot timer widget. """ from PyQt5.QtCore import pyqtSignal, Qt, QTimer, QRect from PyQt5.QtGui import QPainter, QPalette from PyQt5.QtWidgets import QWidget, QApplication, QToolTip class SnapshotTimer(QWidget): """ Class implementing the snapshot timer widget. @signal timeout() emitted after the timer timed out """ timeout = pyqtSignal() def __init__(self): """ Constructor """ super(SnapshotTimer, self).__init__(None) self.setWindowFlags( Qt.WindowType.WindowStaysOnTopHint | Qt.WindowType.FramelessWindowHint | Qt.WindowType.X11BypassWindowManagerHint ) self.__timer = QTimer() self.__textRect = QRect() self.__time = 0 self.__length = 0 self.__toggle = True # text is taken from paintEvent with maximum number plus some margin try: fmWidth = self.fontMetrics().horizontalAdvance(self.tr( "Snapshot will be taken in %n seconds", "", 99)) except AttributeError: fmWidth = self.fontMetrics().width(self.tr( "Snapshot will be taken in %n seconds", "", 99)) self.resize(fmWidth + 6, self.fontMetrics().height() + 4) self.__timer.timeout.connect(self.__bell) def start(self, seconds): """ Public method to start the timer. @param seconds timeout value (integer) """ screenGeom = QApplication.screens()[0].geometry() self.move(screenGeom.width() // 2 - self.size().width() // 2, screenGeom.top()) self.__toggle = True self.__time = 0 self.__length = seconds self.__timer.start(1000) self.show() def stop(self): """ Public method to stop the timer. """ self.setVisible(False) self.hide() self.__timer.stop() def __bell(self): """ Private slot handling timer timeouts. """ if self.__time == self.__length - 1: self.hide() else: if self.__time == self.__length: self.__timer.stop() self.timeout.emit() self.__time += 1 self.__toggle = not self.__toggle self.update() def paintEvent(self, evt): """ Protected method handling paint events. @param evt paint event (QPaintEvent) """ painter = QPainter(self) if self.__time < self.__length: pal = QToolTip.palette() textBackgroundColor = pal.color(QPalette.ColorGroup.Active, QPalette.ColorRole.Base) if self.__toggle: textColor = pal.color(QPalette.ColorGroup.Active, QPalette.ColorRole.Text) else: textColor = pal.color(QPalette.ColorGroup.Active, QPalette.ColorRole.Base) painter.setPen(textColor) painter.setBrush(textBackgroundColor) helpText = self.tr("Snapshot will be taken in %n seconds", "", self.__length - self.__time) textRect = painter.boundingRect( self.rect().adjusted(2, 2, -2, -2), Qt.AlignmentFlag.AlignHCenter | Qt.TextFlag.TextSingleLine, helpText) painter.drawText( textRect, Qt.AlignmentFlag.AlignHCenter | Qt.TextFlag.TextSingleLine, helpText) def enterEvent(self, evt): """ Protected method handling the mouse cursor entering the widget. @param evt enter event (QEvent) """ screenGeom = QApplication.screens()[0].geometry() if self.x() == screenGeom.left(): self.move( screenGeom.x() + (screenGeom.width() // 2 - self.size().width() // 2), screenGeom.top()) else: self.move(screenGeom.topLeft())