9 |
9 |
10 from __future__ import unicode_literals |
10 from __future__ import unicode_literals |
11 |
11 |
12 import os |
12 import os |
13 |
13 |
14 from PyQt4.QtCore import Qt, QObject |
14 from PyQt5.QtCore import Qt, QObject |
15 from PyQt4.QtGui import QKeySequence |
15 from PyQt5.QtGui import QKeySequence |
16 |
16 |
17 from E5Gui.E5Application import e5App |
17 from E5Gui.E5Application import e5App |
18 from E5Gui import E5MessageBox |
18 from E5Gui import E5MessageBox |
19 from E5Gui.E5Action import E5Action |
19 from E5Gui.E5Action import E5Action |
20 |
20 |
41 |
41 |
42 self.__e5project = e5App().getObject("Project") |
42 self.__e5project = e5App().getObject("Project") |
43 |
43 |
44 def __initialize(self): |
44 def __initialize(self): |
45 """ |
45 """ |
46 Public slot to initialize some member variables. |
46 Private slot to initialize some member variables. |
47 """ |
47 """ |
48 self.__projectPath = '' |
48 self.__projectPath = '' |
49 self.__trackerFilePath = '' |
49 self.__trackerFilePath = '' |
50 self.__projectOpen = False |
50 self.__projectOpen = False |
51 |
51 |
67 UI.PixmapCache.getIcon( |
67 UI.PixmapCache.getIcon( |
68 os.path.join("TimeTracker", "icons", "clock.png")), |
68 os.path.join("TimeTracker", "icons", "clock.png")), |
69 self.tr("Time Tracker")) |
69 self.tr("Time Tracker")) |
70 |
70 |
71 self.__activateAct = E5Action( |
71 self.__activateAct = E5Action( |
72 self.trUtf8('Time Tracker'), |
72 self.tr('Time Tracker'), |
73 self.trUtf8('T&ime Tracker'), |
73 self.tr('T&ime Tracker'), |
74 QKeySequence(self.trUtf8("Alt+Shift+I")), |
74 QKeySequence(self.tr("Alt+Shift+I")), |
75 0, self, |
75 0, self, |
76 'time_tracker_activate') |
76 'time_tracker_activate') |
77 self.__activateAct.setStatusTip(self.trUtf8( |
77 self.__activateAct.setStatusTip(self.tr( |
78 "Switch the input focus to the Time Tracker window.")) |
78 "Switch the input focus to the Time Tracker window.")) |
79 self.__activateAct.setWhatsThis(self.trUtf8( |
79 self.__activateAct.setWhatsThis(self.tr( |
80 """<b>Activate Time Tracker</b>""" |
80 """<b>Activate Time Tracker</b>""" |
81 """<p>This switches the input focus to the Time Tracker""" |
81 """<p>This switches the input focus to the Time Tracker""" |
82 """ window.</p>""" |
82 """ window.</p>""" |
83 )) |
83 )) |
84 self.__activateAct.triggered[()].connect(self.__activateWidget) |
84 self.__activateAct.triggered.connect(self.__activateWidget) |
85 |
85 |
86 self.__ui.addE5Actions([self.__activateAct], 'ui') |
86 self.__ui.addE5Actions([self.__activateAct], 'ui') |
87 menu = self.__ui.getMenu("subwindow") |
87 menu = self.__ui.getMenu("subwindow") |
88 menu.addAction(self.__activateAct) |
88 menu.addAction(self.__activateAct) |
89 |
89 |
137 data = f.read() |
137 data = f.read() |
138 f.close() |
138 f.close() |
139 except (IOError, OSError) as err: |
139 except (IOError, OSError) as err: |
140 E5MessageBox.critical( |
140 E5MessageBox.critical( |
141 self.__ui, |
141 self.__ui, |
142 self.trUtf8("Read Time Tracker File"), |
142 self.tr("Read Time Tracker File"), |
143 self.trUtf8("""<p>The time tracker file <b>{0}</b> could""" |
143 self.tr("""<p>The time tracker file <b>{0}</b> could""" |
144 """ not be read.</p><p>Reason: {1}</p>""") |
144 """ not be read.</p><p>Reason: {1}</p>""") |
145 .format(self.__trackerFilePath, str(err))) |
145 .format(self.__trackerFilePath, str(err))) |
146 return |
146 return |
147 |
147 |
148 from .TimeTrackEntry import TimeTrackEntry |
148 from .TimeTrackEntry import TimeTrackEntry |
149 |
149 |
157 invalidCount += 1 |
157 invalidCount += 1 |
158 |
158 |
159 if invalidCount: |
159 if invalidCount: |
160 E5MessageBox.information( |
160 E5MessageBox.information( |
161 self.__ui, |
161 self.__ui, |
162 self.trUtf8("Read Time Tracker File"), |
162 self.tr("Read Time Tracker File"), |
163 self.trUtf8("""<p>The time tracker file <b>{0}</b>""" |
163 self.tr("""<p>The time tracker file <b>{0}</b>""" |
164 """ contained %n invalid entries. These""" |
164 """ contained %n invalid entries. These""" |
165 """ have been discarded.</p>""", "", |
165 """ have been discarded.</p>""", "", |
166 invalidCount).format(self.__trackerFilePath)) |
166 invalidCount).format(self.__trackerFilePath)) |
167 |
167 |
168 def saveTrackerEntries(self, filePath="", ids=[]): |
168 def saveTrackerEntries(self, filePath="", ids=[]): |
169 """ |
169 """ |
170 Public slot to save the tracker entries to a file. |
170 Public slot to save the tracker entries to a file. |
171 |
171 |
187 f.write(entry.toString() + "\n") |
187 f.write(entry.toString() + "\n") |
188 f.close() |
188 f.close() |
189 except (IOError, OSError) as err: |
189 except (IOError, OSError) as err: |
190 E5MessageBox.critical( |
190 E5MessageBox.critical( |
191 self.__ui, |
191 self.__ui, |
192 self.trUtf8("Save Time Tracker File"), |
192 self.tr("Save Time Tracker File"), |
193 self.trUtf8("""<p>The time tracker file <b>{0}</b> could""" |
193 self.tr("""<p>The time tracker file <b>{0}</b> could""" |
194 """ not be saved.</p><p>Reason: {1}</p>""") |
194 """ not be saved.</p><p>Reason: {1}</p>""") |
195 .format(self.__trackerFilePath, str(err))) |
195 .format(self.__trackerFilePath, str(err))) |
196 |
196 |
197 def importTrackerEntries(self, fname): |
197 def importTrackerEntries(self, fname): |
198 """ |
198 """ |
199 Public slot to import tracker entries from a file. |
199 Public slot to import tracker entries from a file. |
205 data = f.read() |
205 data = f.read() |
206 f.close() |
206 f.close() |
207 except (IOError, OSError) as err: |
207 except (IOError, OSError) as err: |
208 E5MessageBox.critical( |
208 E5MessageBox.critical( |
209 self.__ui, |
209 self.__ui, |
210 self.trUtf8("Import Time Tracker File"), |
210 self.tr("Import Time Tracker File"), |
211 self.trUtf8("""<p>The time tracker file <b>{0}</b> could""" |
211 self.tr("""<p>The time tracker file <b>{0}</b> could""" |
212 """ not be read.</p><p>Reason: {1}</p>""") |
212 """ not be read.</p><p>Reason: {1}</p>""") |
213 .format(fname, str(err))) |
213 .format(fname, str(err))) |
214 return |
214 return |
215 |
215 |
216 from .TimeTrackEntry import TimeTrackEntry |
216 from .TimeTrackEntry import TimeTrackEntry |
217 |
217 |
226 else: |
226 else: |
227 invalidCount += 1 |
227 invalidCount += 1 |
228 |
228 |
229 if not self.__plugin.getPreferences("AllowDuplicates"): |
229 if not self.__plugin.getPreferences("AllowDuplicates"): |
230 startDateTimes = [ |
230 startDateTimes = [ |
231 entry.getStartDateTime() for entry in self.__entries.values()] |
231 e.getStartDateTime() for e in self.__entries.values()] |
232 for entry in entries[:]: |
232 for entry in entries[:]: |
233 if entry.getStartDateTime() in startDateTimes: |
233 if entry.getStartDateTime() in startDateTimes: |
234 entries.remove(entry) |
234 entries.remove(entry) |
235 duplicateCount += 1 |
235 duplicateCount += 1 |
236 |
236 |
268 msg += " " + self.tr( |
268 msg += " " + self.tr( |
269 """ %n entries have been ignored.</p>""", |
269 """ %n entries have been ignored.</p>""", |
270 "", invalidCount + duplicateCount) |
270 "", invalidCount + duplicateCount) |
271 E5MessageBox.information( |
271 E5MessageBox.information( |
272 self.__ui, |
272 self.__ui, |
273 self.trUtf8("Import Time Tracker File"), |
273 self.tr("Import Time Tracker File"), |
274 msg) |
274 msg) |
275 |
275 |
276 self.__widget.clear() |
276 self.__widget.clear() |
277 self.__widget.showTrackerEntries(sorted(self.__entries.values(), |
277 self.__widget.showTrackerEntries(sorted(self.__entries.values(), |
278 reverse=True)) |
278 reverse=True)) |