Snapshot/SnapshotTimer.py

Mon, 09 Apr 2012 17:02:31 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 09 Apr 2012 17:02:31 +0200
changeset 1772
f325dfdc8f6b
child 1965
96f5a76e1845
permissions
-rw-r--r--

Extended the snapshot tool to allow for the selection of a screen (for multi screen systems), elliptical selection and a freehand selection.

# -*- 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())

eric ide

mercurial