Sat, 03 Nov 2012 16:53:13 +0100
Fixed a few bugs and added actions to activate the time tracker window.
--- a/ChangeLog Sun Oct 21 19:44:36 2012 +0200 +++ b/ChangeLog Sat Nov 03 16:53:13 2012 +0100 @@ -1,4 +1,8 @@ ChangeLog --------- -Version 0.1.0 +Version 0.2.0: +- fixed a few bugs +- added actions to activate the time tracker window + +Version 0.1.0: - first development release
--- a/PluginTimeTracker.e4p Sun Oct 21 19:44:36 2012 +0200 +++ b/PluginTimeTracker.e4p Sat Nov 03 16:53:13 2012 +0100 @@ -7,7 +7,7 @@ <ProgLanguage mixed="0">Python3</ProgLanguage> <ProjectType>E4Plugin</ProjectType> <Description>Plugin implementing a simple time tracker to keep track of the time used for a project. The time can be subdivided into tasks.</Description> - <Version>0.1</Version> + <Version>0.2.0</Version> <Author>Detlev Offenbach</Author> <Email>detlev@die-offenbachs.de</Email> <TranslationPattern>TimeTracker/i18n/timetracker_%language%.ts</TranslationPattern>
--- a/PluginTimeTracker.py Sun Oct 21 19:44:36 2012 +0200 +++ b/PluginTimeTracker.py Sat Nov 03 16:53:13 2012 +0100 @@ -22,7 +22,7 @@ author = "Detlev Offenbach <detlev@die-offenbachs.de>" autoactivate = True deactivateable = True -version = "0.1.0" +version = "0.2.0" className = "TimeTrackerPlugin" packageName = "TimeTracker" shortDescription = "Time Tracker to keep track of the project time." @@ -114,11 +114,11 @@ """ global error - if self.__ui.versionIsNewer('5.2.99', '20121012'): + if self.__ui.versionIsNewer('5.2.99', '20121102'): error = "" else: error = self.trUtf8("eric5 version is too old, {0}, {1} or newer needed.")\ - .format("5.3.0", "20121012") + .format("5.3.0", "20121103") return False return True @@ -139,7 +139,7 @@ timeTrackerPluginObject = self self.__object = TimeTracker(self, self.__ui) -## self.__object.initActions() + self.__object.activate() e5App().registerPluginObject("TimeTracker", self.__object) if self.__e5project.isOpen(): @@ -156,6 +156,7 @@ Public method to deactivate this plugin. """ e5App().unregisterPluginObject("TimeTracker") + self.__object.deactivate() self.__e5project.newProject.disconnect(self.__object.projectOpened) self.__e5project.projectOpened.disconnect(self.__object.projectOpened)
--- a/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTracker.html Sun Oct 21 19:44:36 2012 +0200 +++ b/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTracker.html Sat Nov 03 16:53:13 2012 +0100 @@ -61,18 +61,27 @@ <td><a href="#TimeTracker.__init__">TimeTracker</a></td> <td>Constructor</td> </tr><tr> +<td><a href="#TimeTracker.__activateWidget">__activateWidget</a></td> +<td>Private slot to handle the activation of the project browser.</td> +</tr><tr> <td><a href="#TimeTracker.__initialize">__initialize</a></td> <td>Public slot to initialize some member variables.</td> </tr><tr> <td><a href="#TimeTracker.__readTrackerEntries">__readTrackerEntries</a></td> <td>Private slot to read the time tracker entries from a file.</td> </tr><tr> +<td><a href="#TimeTracker.activate">activate</a></td> +<td>Public method to activate the time tracker.</td> +</tr><tr> <td><a href="#TimeTracker.addTrackerEntry">addTrackerEntry</a></td> <td>Public method to add a new tracker entry based on the given data.</td> </tr><tr> <td><a href="#TimeTracker.continueTrackerEntry">continueTrackerEntry</a></td> <td>Public method to continue the current tracker entry.</td> </tr><tr> +<td><a href="#TimeTracker.deactivate">deactivate</a></td> +<td>Public method to deactivate the time tracker.</td> +</tr><tr> <td><a href="#TimeTracker.deleteTrackerEntry">deleteTrackerEntry</a></td> <td>Public method to delete a tracker entry given its ID.</td> </tr><tr> @@ -133,7 +142,12 @@ <dd> parent (QObject) </dd> -</dl><a NAME="TimeTracker.__initialize" ID="TimeTracker.__initialize"></a> +</dl><a NAME="TimeTracker.__activateWidget" ID="TimeTracker.__activateWidget"></a> +<h4>TimeTracker.__activateWidget</h4> +<b>__activateWidget</b>(<i></i>) +<p> + Private slot to handle the activation of the project browser. +</p><a NAME="TimeTracker.__initialize" ID="TimeTracker.__initialize"></a> <h4>TimeTracker.__initialize</h4> <b>__initialize</b>(<i></i>) <p> @@ -143,6 +157,11 @@ <b>__readTrackerEntries</b>(<i></i>) <p> Private slot to read the time tracker entries from a file. +</p><a NAME="TimeTracker.activate" ID="TimeTracker.activate"></a> +<h4>TimeTracker.activate</h4> +<b>activate</b>(<i></i>) +<p> + Public method to activate the time tracker. </p><a NAME="TimeTracker.addTrackerEntry" ID="TimeTracker.addTrackerEntry"></a> <h4>TimeTracker.addTrackerEntry</h4> <b>addTrackerEntry</b>(<i>startDateTime, duration, task, comment</i>) @@ -167,6 +186,11 @@ <b>continueTrackerEntry</b>(<i></i>) <p> Public method to continue the current tracker entry. +</p><a NAME="TimeTracker.deactivate" ID="TimeTracker.deactivate"></a> +<h4>TimeTracker.deactivate</h4> +<b>deactivate</b>(<i></i>) +<p> + Public method to deactivate the time tracker. </p><a NAME="TimeTracker.deleteTrackerEntry" ID="TimeTracker.deleteTrackerEntry"></a> <h4>TimeTracker.deleteTrackerEntry</h4> <b>deleteTrackerEntry</b>(<i>eid</i>)
--- a/TimeTracker/TimeTracker.py Sun Oct 21 19:44:36 2012 +0200 +++ b/TimeTracker/TimeTracker.py Sat Nov 03 16:53:13 2012 +0100 @@ -9,10 +9,12 @@ import os -from PyQt4.QtCore import QObject +from PyQt4.QtCore import Qt, QObject +from PyQt4.QtGui import QKeySequence from E5Gui.E5Application import e5App from E5Gui import E5MessageBox +from E5Gui.E5Action import E5Action from .TimeTrackEntry import TimeTrackEntry from .TimeTrackerWidget import TimeTrackerWidget @@ -39,13 +41,6 @@ self.__ui = parent self.__e5project = e5App().getObject("Project") - - self.__widget = TimeTrackerWidget(self) - self.__ui.addSideWidget(self.__ui.BottomSide, self.__widget, - UI.PixmapCache.getIcon(os.path.join("TimeTracker", "icons", "clock.png")), - self.tr("Time Tracker")) - - self.__initialize() def __initialize(self): """ @@ -61,6 +56,43 @@ self.__widget.clear() self.__widget.setEnabled(False) + def activate(self): + """ + Public method to activate the time tracker. + """ + self.__widget = TimeTrackerWidget(self) + self.__ui.addSideWidget(self.__ui.BottomSide, self.__widget, + UI.PixmapCache.getIcon(os.path.join("TimeTracker", "icons", "clock.png")), + self.tr("Time Tracker")) + + self.__activateAct = E5Action(self.trUtf8('Time Tracker'), + self.trUtf8('T&ime Tracker'), + QKeySequence(self.trUtf8("Alt+Shift+I")), + 0, self, + 'time_tracker_activate') + self.__activateAct.setStatusTip(self.trUtf8( + "Switch the input focus to the Time Tracker window.")) + self.__activateAct.setWhatsThis(self.trUtf8( + """<b>Activate Time Tracker</b>""" + """<p>This switches the input focus to the Time Tracker window.</p>""" + )) + self.__activateAct.triggered[()].connect(self.__activateWidget) + + self.__ui.addE5Actions([self.__activateAct], 'ui') + menu = self.__ui.getMenu("subwindow") + menu.addAction(self.__activateAct) + + self.__initialize() + + def deactivate(self): + """ + Public method to deactivate the time tracker. + """ + menu = self.__ui.getMenu("subwindow") + menu.removeAction(self.__activateAct) + self.__ui.removeE5Actions([self.__activateAct], 'ui') + self.__ui.removeSideWidget(self.__widget) + def projectOpened(self): """ Public slot to handle the projectOpened signal. @@ -84,8 +116,9 @@ """ Public slot to handle the projectClosed signal. """ - self.stopTrackerEntry() - self.saveTrackerEntries() + if self.__projectOpen: + self.stopTrackerEntry() + self.saveTrackerEntries() self.__initialize() def __readTrackerEntries(self): @@ -402,3 +435,17 @@ @return the requested setting """ return self.__plugin.getPreferences(key) + + def __activateWidget(self): + """ + Private slot to handle the activation of the project browser. + """ + if self.__ui.layout == "Toolboxes": + self.__ui.hToolboxDock.show() + self.__ui.hToolboxDock.setCurrentWidget(self.__widget) + elif self.__ui.layout == "Sidebars": + self.__ui.bottomSidebar.show() + self.__ui.bottomSidebar.setCurrentWidget(self.__widget) + else: + self.__widget.show() + self.__widget.setFocus(Qt.ActiveWindowFocusReason)
--- a/TimeTracker/i18n/timetracker_de.ts Sun Oct 21 19:44:36 2012 +0200 +++ b/TimeTracker/i18n/timetracker_de.ts Sat Nov 03 16:53:13 2012 +0100 @@ -1,48 +1,39 @@ <?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.0" language="de_DE" sourcelanguage="en_US"> +<!DOCTYPE TS><TS version="2.0" language="de_DE" sourcelanguage="en_US"> <context> <name>TimeTracker</name> <message> - <location filename="TimeTracker/TimeTracker.py" line="44"/> + <location filename="TimeTracker/TimeTracker.py" line="68"/> <source>Time Tracker</source> <translation>Zeitnahme</translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="118"/> + <location filename="TimeTracker/TimeTracker.py" line="151"/> <source>Read Time Tracker File</source> <translation>Zeitnahmedatei einlesen</translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="161"/> + <location filename="TimeTracker/TimeTracker.py" line="194"/> <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> <translation><p>Die Zeitnahmedatei <b>{0}</b> konnte nicht gelesen werden.</p><p>Ursache: {1}</p></translation> </message> - <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="118"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</source> - <translation type="obsolete"> - <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen ungültigen Eintrag. Dieser wurde übersprungen.</p></numerusform> - <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt %n ungültige Einträge. Diese wurden übersprungen.</p></numerusform> - </translation> - </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="144"/> + <location filename="TimeTracker/TimeTracker.py" line="177"/> <source>Save Time Tracker File</source> <translation>Zeitnahmedatei speichern</translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="144"/> + <location filename="TimeTracker/TimeTracker.py" line="177"/> <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> <translation><p>Die Zeitnahmedatei <b>{0}</b> konnte nicht gespeichert werden.</p><p>Ursache: {1}</p></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="216"/> + <location filename="TimeTracker/TimeTracker.py" line="249"/> <source>Import Time Tracker File</source> <translation>Zeitnahmedatei importieren</translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="211"/> + <location filename="TimeTracker/TimeTracker.py" line="244"/> <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> <translation> <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen ungültigen Eintrag.</numerusform> @@ -50,15 +41,7 @@ </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="204"/> - <source>%n duplicate entries were detected.</source> - <translation type="obsolete"> - <numerusform>Ein doppelter Eintrag wurde erkannt.</numerusform> - <numerusform>%n doppelte Einträge wurden erkannt.</numerusform> - </translation> - </message> - <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="207"/> + <location filename="TimeTracker/TimeTracker.py" line="240"/> <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> <translation> <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen doppelten Eintrag.</numerusform> @@ -66,20 +49,15 @@ </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="118"/> + <location filename="TimeTracker/TimeTracker.py" line="151"/> <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> <translation> <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen ungültigen Eintrag. Dieser wurde übersprungen.</p></numerusform> <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt %n ungültige Einträge. Diese wurden übersprungen.</p></numerusform> </translation> </message> - <message> - <location filename="TimeTracker/TimeTracker.py" line="214"/> - <source>These have been ignored.</p></source> - <translation type="obsolete">Diese wurden ignoriert.</p></translation> - </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="204"/> + <location filename="TimeTracker/TimeTracker.py" line="237"/> <source> %n duplicate entries were detected.</source> <translation> <numerusform> Ein doppelter Eintrag wurde erkannt.</numerusform> @@ -87,13 +65,33 @@ </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="214"/> + <location filename="TimeTracker/TimeTracker.py" line="247"/> <source> %n entries have been ignored.</p></source> <translation> <numerusform> Ein Eintrag wurde ubersprungen.</p></numerusform> <numerusform> %n Einträge wurden übersprungen.</p></numerusform> </translation> </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="68"/> + <source>T&ime Tracker</source> + <translation>Ze&itnahme</translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="68"/> + <source>Alt+Shift+I</source> + <translation>Alt+Shift+I</translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="73"/> + <source>Switch the input focus to the Time Tracker window.</source> + <translation>Schalte den Eingabefokus auf das Zeitnahmefenster um.</translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="75"/> + <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> + <translation><b>Zeitnahme aktivieren</b><p>Dies schaltet den Eingabefokus auf das Zeitnahmefenster um.</p></translation> + </message> </context> <context> <name>TimeTrackerEntryDialog</name>
--- a/TimeTracker/i18n/timetracker_en.ts Sun Oct 21 19:44:36 2012 +0200 +++ b/TimeTracker/i18n/timetracker_en.ts Sat Nov 03 16:53:13 2012 +0100 @@ -1,40 +1,39 @@ <?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.0" language="de_DE"> +<!DOCTYPE TS><TS version="2.0" language="de_DE" sourcelanguage=""> <context> <name>TimeTracker</name> <message> - <location filename="TimeTracker/TimeTracker.py" line="44"/> + <location filename="TimeTracker/TimeTracker.py" line="68"/> <source>Time Tracker</source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="118"/> + <location filename="TimeTracker/TimeTracker.py" line="151"/> <source>Read Time Tracker File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="161"/> + <location filename="TimeTracker/TimeTracker.py" line="194"/> <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="144"/> + <location filename="TimeTracker/TimeTracker.py" line="177"/> <source>Save Time Tracker File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="144"/> + <location filename="TimeTracker/TimeTracker.py" line="177"/> <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="216"/> + <location filename="TimeTracker/TimeTracker.py" line="249"/> <source>Import Time Tracker File</source> <translation type="unfinished"></translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="211"/> + <location filename="TimeTracker/TimeTracker.py" line="244"/> <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> <translation> <numerusform><p>The time tracker file <b>{0}</b> contained one invalid entry.</numerusform> @@ -42,7 +41,7 @@ </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="207"/> + <location filename="TimeTracker/TimeTracker.py" line="240"/> <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> <translation> <numerusform><p>The time tracker file <b>{0}</b> contained one duplicate entry.</numerusform> @@ -50,7 +49,7 @@ </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="118"/> + <location filename="TimeTracker/TimeTracker.py" line="151"/> <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> <translation> <numerusform><p>The time tracker file <b>{0}</b> contained one invalid entry. This has been discarded.</p></numerusform> @@ -58,7 +57,7 @@ </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="204"/> + <location filename="TimeTracker/TimeTracker.py" line="237"/> <source> %n duplicate entries were detected.</source> <translation> <numerusform> One duplicate entry was detected.</numerusform> @@ -66,13 +65,33 @@ </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="214"/> + <location filename="TimeTracker/TimeTracker.py" line="247"/> <source> %n entries have been ignored.</p></source> <translation> <numerusform> One entry has been ignored.</p></numerusform> <numerusform> %n entries have been ignored.</p></numerusform> </translation> </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="68"/> + <source>T&ime Tracker</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="68"/> + <source>Alt+Shift+I</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="73"/> + <source>Switch the input focus to the Time Tracker window.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="75"/> + <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>TimeTrackerEntryDialog</name>
--- a/TimeTracker/i18n/timetracker_es.ts Sun Oct 21 19:44:36 2012 +0200 +++ b/TimeTracker/i18n/timetracker_es.ts Sat Nov 03 16:53:13 2012 +0100 @@ -3,70 +3,90 @@ <context> <name>TimeTracker</name> <message> - <location filename="TimeTracker/TimeTracker.py" line="44"/> + <location filename="TimeTracker/TimeTracker.py" line="68"/> <source>Time Tracker</source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="118"/> + <location filename="TimeTracker/TimeTracker.py" line="151"/> <source>Read Time Tracker File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="161"/> + <location filename="TimeTracker/TimeTracker.py" line="194"/> <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="144"/> + <location filename="TimeTracker/TimeTracker.py" line="177"/> <source>Save Time Tracker File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="144"/> + <location filename="TimeTracker/TimeTracker.py" line="177"/> <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> <translation type="unfinished"></translation> </message> <message> - <location filename="TimeTracker/TimeTracker.py" line="216"/> + <location filename="TimeTracker/TimeTracker.py" line="249"/> <source>Import Time Tracker File</source> <translation type="unfinished"></translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="211"/> + <location filename="TimeTracker/TimeTracker.py" line="244"/> <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> <translation type="unfinished"> <numerusform></numerusform> </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="207"/> + <location filename="TimeTracker/TimeTracker.py" line="240"/> <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> <translation type="unfinished"> <numerusform></numerusform> </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="118"/> + <location filename="TimeTracker/TimeTracker.py" line="151"/> <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> <translation type="unfinished"> <numerusform></numerusform> </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="204"/> + <location filename="TimeTracker/TimeTracker.py" line="237"/> <source> %n duplicate entries were detected.</source> <translation type="unfinished"> <numerusform></numerusform> </translation> </message> <message numerus="yes"> - <location filename="TimeTracker/TimeTracker.py" line="214"/> + <location filename="TimeTracker/TimeTracker.py" line="247"/> <source> %n entries have been ignored.</p></source> <translation type="unfinished"> <numerusform></numerusform> </translation> </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="68"/> + <source>T&ime Tracker</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="68"/> + <source>Alt+Shift+I</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="73"/> + <source>Switch the input focus to the Time Tracker window.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="TimeTracker/TimeTracker.py" line="75"/> + <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>TimeTrackerEntryDialog</name>