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 pyqtSlot, QPoint, Qt, QDate, QTime, QFileInfo |
14 from PyQt5.QtCore import pyqtSlot, QPoint, Qt, QDate, QTime, QFileInfo |
15 from PyQt4.QtGui import QWidget, QMenu, QTreeWidgetItem, QCursor, QDialog |
15 from PyQt5.QtGui import QCursor |
|
16 from PyQt5.QtWidgets import QWidget, QMenu, QTreeWidgetItem, QDialog |
16 |
17 |
17 from E5Gui import E5MessageBox, E5FileDialog |
18 from E5Gui import E5MessageBox, E5FileDialog |
18 |
19 |
19 from .Ui_TimeTrackerWidget import Ui_TimeTrackerWidget |
20 from .Ui_TimeTrackerWidget import Ui_TimeTrackerWidget |
20 |
21 |
125 |
126 |
126 @param pos position the menu should be shown at (QPoint) |
127 @param pos position the menu should be shown at (QPoint) |
127 """ |
128 """ |
128 menu = QMenu() |
129 menu = QMenu() |
129 |
130 |
130 menu.addAction(self.tr("Edit"), self.__editEntry).setEnabled( |
131 act = menu.addAction(self.tr("Edit"), self.__editEntry) |
131 len(self.entriesList.selectedItems()) == 1) |
132 act.setEnabled( |
|
133 len(self.entriesList.selectedItems()) == 1 and |
|
134 self.entriesList.selectedItems()[0].data(0, Qt.UserRole) > -1 |
|
135 ) |
132 menu.addAction(self.tr("Add"), self.__addEntry) |
136 menu.addAction(self.tr("Add"), self.__addEntry) |
133 menu.addAction(self.tr("Delete"), self.__deleteSelectedEntries) |
137 act = menu.addAction(self.tr("Delete"), self.__deleteSelectedEntries) |
|
138 act.setEnabled( |
|
139 (len(self.entriesList.selectedItems()) == 1 and |
|
140 self.entriesList.selectedItems()[0].data(0, Qt.UserRole) > -1) or |
|
141 len(self.entriesList.selectedItems()) > 1 |
|
142 ) |
134 menu.addSeparator() |
143 menu.addSeparator() |
135 menu.addAction(self.tr("Save"), self.__saveEntries) |
144 menu.addAction(self.tr("Save"), self.__saveEntries) |
136 menu.addSeparator() |
145 menu.addSeparator() |
137 menu.addAction(self.tr("Import"), self.__importEntries) |
146 menu.addAction(self.tr("Import"), self.__importEntries) |
138 menu.addAction(self.tr("Export Selected"), |
147 menu.addAction(self.tr("Export Selected"), |
202 """ |
211 """ |
203 Private slot to delete the selected tracker entries. |
212 Private slot to delete the selected tracker entries. |
204 """ |
213 """ |
205 res = E5MessageBox.yesNo( |
214 res = E5MessageBox.yesNo( |
206 self, |
215 self, |
207 self.trUtf8("Delete Selected Entries"), |
216 self.tr("Delete Selected Entries"), |
208 self.trUtf8("""Do you really want to delete the selected""" |
217 self.tr("""Do you really want to delete the selected""" |
209 """ entries?""")) |
218 """ entries?""")) |
210 if res: |
219 if res: |
211 for item in self.entriesList.selectedItems(): |
220 for item in self.entriesList.selectedItems(): |
212 eid = item.data(0, Qt.UserRole) |
221 eid = item.data(0, Qt.UserRole) |
213 if eid > -1: |
222 if eid > -1: |
214 # the current entry must not be deleted |
223 # the current entry must not be deleted |
229 """ |
238 """ |
230 path = Preferences.getMultiProject("Workspace") or \ |
239 path = Preferences.getMultiProject("Workspace") or \ |
231 Utilities.getHomeDir() |
240 Utilities.getHomeDir() |
232 fname = E5FileDialog.getOpenFileName( |
241 fname = E5FileDialog.getOpenFileName( |
233 None, |
242 None, |
234 self.trUtf8("Import Tracker Entries"), |
243 self.tr("Import Tracker Entries"), |
235 path, |
244 path, |
236 self.trUtf8("Text Files (*.txt);;All Files (*)")) |
245 self.tr("Text Files (*.txt);;All Files (*)")) |
237 if fname: |
246 if fname: |
238 fname = Utilities.toNativeSeparators(fname) |
247 fname = Utilities.toNativeSeparators(fname) |
239 if not os.path.exists(fname): |
248 if not os.path.exists(fname): |
240 E5MessageBox.critical( |
249 E5MessageBox.critical( |
241 self, |
250 self, |
242 self.trUtf8("Import Tracker Entries"), |
251 self.tr("Import Tracker Entries"), |
243 self.trUtf8("<p>The file <b>{0}</b> does not exist.</p>") |
252 self.tr("<p>The file <b>{0}</b> does not exist.</p>") |
244 .format(fname)) |
253 .format(fname)) |
245 return |
254 return |
246 |
255 |
247 self.__tracker.importTrackerEntries(fname) |
256 self.__tracker.importTrackerEntries(fname) |
248 |
257 |
254 """ |
263 """ |
255 path = Preferences.getMultiProject("Workspace") or \ |
264 path = Preferences.getMultiProject("Workspace") or \ |
256 Utilities.getHomeDir() |
265 Utilities.getHomeDir() |
257 fname, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( |
266 fname, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( |
258 self, |
267 self, |
259 self.trUtf8("Export Tracker Entries"), |
268 self.tr("Export Tracker Entries"), |
260 path, |
269 path, |
261 self.tr("Text Files (*.txt);;All Files (*)"), |
270 self.tr("Text Files (*.txt);;All Files (*)"), |
262 None, |
271 None, |
263 E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite)) |
272 E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite)) |
264 if fname: |
273 if fname: |
268 if ex: |
277 if ex: |
269 fname += ex |
278 fname += ex |
270 if QFileInfo(fname).exists(): |
279 if QFileInfo(fname).exists(): |
271 res = E5MessageBox.yesNo( |
280 res = E5MessageBox.yesNo( |
272 self, |
281 self, |
273 self.trUtf8("Export Tracker Entries"), |
282 self.tr("Export Tracker Entries"), |
274 self.trUtf8("<p>The file <b>{0}</b> already exists." |
283 self.tr("<p>The file <b>{0}</b> already exists." |
275 " Overwrite it?</p>").format(fname), |
284 " Overwrite it?</p>").format(fname), |
276 icon=E5MessageBox.Warning) |
285 icon=E5MessageBox.Warning) |
277 if not res: |
286 if not res: |
278 return |
287 return |
279 fname = Utilities.toNativeSeparators(fname) |
288 fname = Utilities.toNativeSeparators(fname) |
280 self.__tracker.saveTrackerEntries(filePath=fname, ids=ids) |
289 self.__tracker.saveTrackerEntries(filePath=fname, ids=ids) |
296 """ |
305 """ |
297 Private slot to remove duplicate entries. |
306 Private slot to remove duplicate entries. |
298 """ |
307 """ |
299 res = E5MessageBox.yesNo( |
308 res = E5MessageBox.yesNo( |
300 self, |
309 self, |
301 self.trUtf8("Remove Duplicate Tracker Entries"), |
310 self.tr("Remove Duplicate Tracker Entries"), |
302 self.trUtf8("""Are you sure you want to remove duplicate""" |
311 self.tr("""Are you sure you want to remove duplicate""" |
303 """ tracker entries? Only the one with the longest""" |
312 """ tracker entries? Only the one with the longest""" |
304 """ duration will be kept.""")) |
313 """ duration will be kept.""")) |
305 if res: |
314 if res: |
306 self.__tracker.removeDuplicateTrackerEntries() |
315 self.__tracker.removeDuplicateTrackerEntries() |
307 |
316 |
308 def __mergeDuplicates(self): |
317 def __mergeDuplicates(self): |
309 """ |
318 """ |
310 Private slot to merge duplicate entries. |
319 Private slot to merge duplicate entries. |
311 """ |
320 """ |
312 res = E5MessageBox.yesNo( |
321 res = E5MessageBox.yesNo( |
313 self, |
322 self, |
314 self.trUtf8("Merge Duplicate Tracker Entries"), |
323 self.tr("Merge Duplicate Tracker Entries"), |
315 self.trUtf8("""Are you sure you want to merge duplicate""" |
324 self.tr("""Are you sure you want to merge duplicate""" |
316 """ tracker entries? The durations of duplicate""" |
325 """ tracker entries? The durations of duplicate""" |
317 """ ones will be added.""")) |
326 """ ones will be added.""")) |
318 if res: |
327 if res: |
319 self.__tracker.mergeDuplicateTrackerEntries() |
328 self.__tracker.mergeDuplicateTrackerEntries() |
320 |
329 |
321 def __insertEntry(self, entry, index=-1): |
330 def __insertEntry(self, entry, index=-1): |
322 """ |
331 """ |