#!/usr/bin/python3 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ''' Display two timers with interactive behaviour : * One timer is white and background become red after one hour * Second timer is blue * Click : start/stop timer * Double click : reset timer * Right click : switch timer ''' import time from threading import Thread from signal import signal, SIGINT import sys from genericmonitor import * class TimerThread(Thread,GenericMonitor): def stop(self): self._stopLoop = True self.stopMainLoop() def _displayTimerValue(self): curValue = self.timers[self.curTimer] text = '%02d:%02d' % (int(curValue/60)%60, curValue%60) if curValue >= (60*60): text = '%02d:%s' % (int(curValue/(60*60)), text) if self.curTimer == 0: if self.timerPaused and curValue: style = 'color:black;background-color:white' else: style = 'color:white' if curValue >= (60*60): style += ';background-color:red' else: style = 'color:#215D9C' self.textWidget.setText(text) self.textWidget.setStyle(style) self.notify(self.monitorGroup) def run(self): self.setupMonitor() self.timers = [0, 0] self.curTimer = 0 self.timerPaused = False self._stopLoop = False self.textWidget = GenericMonitorTextWidget('') signals = {'on-click':'signal'} self.monitorItem = GenericMonitorItem('timer', [self.textWidget], signals, box='right') self.monitorGroup = GenericMonitorGroup('Timer', self.monitorItem) while not self._stopLoop: time.sleep(1) if not self.timerPaused: self.timers[self.curTimer] += 1 self._displayTimerValue() def _forMe(self, sender): return sender == self.monitorItem.getFullName() def onClick(self, sender): if not self._forMe(sender): return self.timerPaused = not self.timerPaused self._displayTimerValue() def onRightClick(self, sender): if not self._forMe(sender): return if self.curTimer == 0: self.curTimer = 1 else: self.curTimer = 0 self.timers[self.curTimer] = 0 self.timerPaused = False self._displayTimerValue() def onDblClick(self, sender): if not self._forMe(sender): return self.timers[self.curTimer] = 0 self.timerPaused = True self._displayTimerValue() def onActivate(self): super().onActivate() self.timerPaused = self._lastState self._displayTimerValue() def onDeactivate(self): super().onDeactivate() self._lastState = self.timerPaused if not self.timerPaused and self.curTimer == 0: self.timerPaused = True def signalHandler(signal_received, frame): timerThread.stop() timerThread.join() groups = {'groups':['Timer']} timerThread.deleteGroups(groups) sys.exit(0) timerThread = TimerThread() timerThread.start() signal(SIGINT, signalHandler) timerThread.runMainLoop()