Fri, 19 Oct 2012 13:06:56 +0200
Added a few source files.
# -*- 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()