diff -r 561e97413395 -r f325dfdc8f6b Snapshot/SnapshotTimer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Snapshot/SnapshotTimer.py Mon Apr 09 17:02:31 2012 +0200 @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the snapshot timer widget. +""" + +from PyQt4.QtCore import pyqtSignal, Qt, QTimer, QRect +from PyQt4.QtGui import QWidget, QApplication, QPainter, QToolTip, QPalette + + +class SnapshotTimer(QWidget): + """ + Class implementing the snapshot timer widget. + + @signal timeout() emitted after the timer timed out + """ + timeout = pyqtSignal() + + def __init__(self): + """ + Constructor + """ + super().__init__(None) + + self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | + Qt.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 + self.resize( + self.fontMetrics().width( + self.trUtf8("Snapshot will be taken in %n seconds", "", 99)) + 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.desktop().screenGeometry() + 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.Active, QPalette.Base) + if self.__toggle: + textColor = pal.color(QPalette.Active, QPalette.Text) + else: + textColor = pal.color(QPalette.Active, QPalette.Base) + painter.setPen(textColor) + painter.setBrush(textBackgroundColor) + helpText = self.trUtf8("Snapshot will be taken in %n seconds", "", + self.__length - self.__time) + textRect = painter.boundingRect(self.rect().adjusted(2, 2, -2, -2), + Qt.AlignHCenter | Qt.TextSingleLine, helpText) + painter.drawText(textRect, Qt.AlignHCenter | Qt.TextSingleLine, helpText) + + def enterEvent(self, evt): + """ + Protected method handling the mouse cursor entering the widget. + + @param evt enter event (QEvent) + """ + screenGeom = QApplication.desktop().screenGeometry() + if self.x() == screenGeom.left(): + self.move( + screenGeom.x() + (screenGeom.width() // 2 - self.size().width() // 2), + screenGeom.top()) + else: + self.move(screenGeom.topLeft())