diff -r 944024997123 -r a0beac325e5a TimeTracker/TimeTracker.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TimeTracker/TimeTracker.py Fri Oct 19 13:06:56 2012 +0200 @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the time tracker object. +""" + +import os + +from PyQt4.QtCore import pyqtSignal, QObject + +from E5Gui.E5Application import e5App +from E5Gui import E5MessageBox + +from .TimeTrackEntry import TimeTrackEntry + + +class TimeTracker(QObject): + """ + Class implementing the time tracker object. + """ + currentEntryChanged = pyqtSignal() + + FileName = "TimeTracker.txt" + + def __init__(self, plugin, parent=None): + """ + Constructor + + @param plugin reference to the plugin object + @param parent parent (QObject) + """ + QObject.__init__(self, parent) + + self.__plugin = plugin + self.__ui = parent + + self.__e5project = e5App().getObject("Project") + + self.__initialize() + + def __initialize(self): + """ + Public slot to initialize some member variables. + """ + self.__projectPath = '' + self.__trackerFilePath = '' + self.__projectOpen = False + + self.__entries = [] + self.__currentEntry = None + + def projectOpened(self): + """ + Public slot to handle the projectOpened signal. + """ + if self.__projectOpen: + self.projectClosed() + + self.__projectOpen = True + self.__projectPath = self.__e5project.getProjectPath() + self.__trackerFilePath = os.path.join( + self.__e5project.getProjectManagementDir(), + TimeTracker.FileName) + + self.__readTrackerEntries() + + self.__currentEntry = TimeTrackEntry() + self.__currentEntry.start() + self.currentEntryChanged.emit() + + def projectClosed(self): + """ + Public slot to handle the projectClosed signal. + """ + if self.__currentEntry is not None: + self.__currentEntry.stop() + if self.__currentEntry.isValid(): + self.__entries.append(self.__currentEntry) + + self.__saveTrackerEntries() + + self.__initialize() + + def __readTrackerEntries(self): + """ + Private slot to read the time tracker entries from a file. + """ + if os.path.exists(self.__trackerFilePath): + try: + f = open(self.__trackerFilePath, "r", encoding="utf-8") + data = f.read() + f.close() + except (IOError, OSError) as err: + E5MessageBox.critical(self.__ui, + self.trUtf8("Read Time Tracker File"), + self.trUtf8("""<p>The time tracker file <b>{0}</b> could not be""" + """ read.</p><p>Reason: {1}</p>""").format( + self.__trackerFilePath, str(err))) + return + + invalidCount = 0 + for line in data.splitlines(): + entry = TimeTrackEntry() + if entry.fromString(line.strip()): + self.__entries.append(entry) + else: + invalidCount += 1 + + if invalidCount: + E5MessageBox.information(self.__ui, + self.trUtf8("Read Time Tracker File"), + self.trUtf8("""<p>The time tracker file <b>{0}</b> contained""" + """ %n invalid entries. These have been discarded.""", + "", invalidCount).format(self.__trackerFilePath)) + + def __saveTrackerEntries(self): + """ + Private slot to save the tracker entries to a file. + """ + try: + f = open(self.__trackerFilePath, "w", encoding="utf-8") + for entry in self.__entries: + if entry.isValid(): + f.write(entry.toString() + "\n") + f.close() + except (IOError, OSError) as err: + E5MessageBox.critical(self.__ui, + self.trUtf8("Save Time Tracker File"), + self.trUtf8("""<p>The time tracker file <b>{0}</b> could not be""" + """ saved.</p><p>Reason: {1}</p>""").format( + self.__trackerFilePath, str(err))) + + def pauseTrackerEntry(self): + """ + Public method to pause the current tracker entry. + """ + self.__currentEntry.pause() + + def continueTrackerEntry(self): + """ + Public method to continue the current tracker entry. + """ + self.__currentEntry.continue_() + + def getCurrentEntry(self): + """ + Public method to get a reference to the current tracker entry. + """ + return self.__currentEntry + + def newEntry(self): + """ + Public method to stop the current tracker entry and start a new one. + """ + # stop the current time tracker entry + if self.__currentEntry is not None: + self.__currentEntry.stop() + if self.__currentEntry.isValid(): + self.__entries.append(self.__currentEntry) + + # save the tracker entries + self.__saveTrackerEntries() + + # start a new time tracker entry + self.__currentEntry = TimeTrackEntry() + self.__currentEntry.start() + self.currentEntryChanged.emit()