--- a/TimeTracker/TimeTrackerWidget.py Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/TimeTrackerWidget.py Fri Jun 04 16:40:54 2021 +0200 @@ -9,11 +9,11 @@ import os -from PyQt5.QtCore import pyqtSlot, QPoint, Qt, QDate, QTime, QFileInfo -from PyQt5.QtGui import QCursor -from PyQt5.QtWidgets import QWidget, QMenu, QTreeWidgetItem, QDialog +from PyQt6.QtCore import pyqtSlot, QPoint, Qt, QDate, QTime, QFileInfo +from PyQt6.QtGui import QCursor +from PyQt6.QtWidgets import QWidget, QMenu, QTreeWidgetItem, QDialog -from E5Gui import E5MessageBox, E5FileDialog +from EricWidgets import EricMessageBox, EricFileDialog from .Ui_TimeTrackerWidget import Ui_TimeTrackerWidget @@ -33,8 +33,10 @@ """ Constructor - @param tracker reference to the time tracker (TimeTracker) - @param parent reference to the parent widget (QWidget) + @param tracker reference to the time tracker + @type TimeTracker + @param parent reference to the parent widget + @type QWidget """ super().__init__(parent) self.setupUi(self) @@ -47,7 +49,8 @@ Private slot handling changes of the task description of the current entry. - @param txt new task description (string) + @param txt new task description + @type str """ itm = self.entriesList.topLevelItem(0) if itm: @@ -63,7 +66,8 @@ """ Private slot handling changes of the comment of the current entry. - @param txt new comment (string) + @param txt new comment + @type str """ itm = self.entriesList.topLevelItem(0) if itm: @@ -80,7 +84,7 @@ Private slot to pause the current timing. @param checked flag indicating the checked status of the button - (boolean) + @type bool """ if checked: self.__tracker.pauseTrackerEntry() @@ -108,7 +112,7 @@ itm = self.entriesList.topLevelItem(0) itm.setText(self.DurationColumn, self.tr("{0} min").format(duration)) - itm.setData(0, Qt.UserRole, eid) + itm.setData(0, Qt.ItemDataRole.UserRole, eid) else: itm = self.entriesList.takeTopLevelItem(0) del itm @@ -122,20 +126,23 @@ """ Private slot to create the context menu and show it. - @param pos position the menu should be shown at (QPoint) + @param pos position the menu should be shown at + @type QPoint """ menu = QMenu() act = menu.addAction(self.tr("Edit"), self.__editEntry) act.setEnabled( len(self.entriesList.selectedItems()) == 1 and - self.entriesList.selectedItems()[0].data(0, Qt.UserRole) > -1 + self.entriesList.selectedItems()[0].data( + 0, Qt.ItemDataRole.UserRole) > -1 ) menu.addAction(self.tr("Add"), self.__addEntry) act = menu.addAction(self.tr("Delete"), self.__deleteSelectedEntries) act.setEnabled( (len(self.entriesList.selectedItems()) == 1 and - self.entriesList.selectedItems()[0].data(0, Qt.UserRole) > -1) or + self.entriesList.selectedItems()[0].data( + 0, Qt.ItemDataRole.UserRole) > -1) or len(self.entriesList.selectedItems()) > 1 ) menu.addSeparator() @@ -144,7 +151,7 @@ menu.addAction(self.tr("Import"), self.__importEntries) act = menu.addAction(self.tr("Export Selected"), self.__exportSelectedEntries) - act.setEnabled(len(self.entriesList.selectedItems()) != 0) + act.setEnabled(len(self.entriesList.selectedItems()) > 0) menu.addAction(self.tr("Export All"), self.__exportEntries) menu.addSeparator() menu.addAction(self.tr("Remove duplicates"), self.__removeDuplicates) @@ -157,14 +164,12 @@ """ from .TimeTrackerEntryDialog import TimeTrackerEntryDialog - tasks = [] - for index in range(self.taskCombo.count()): - tasks.append(self.taskCombo.itemText(index)) - comments = [] - for index in range(self.commentCombo.count()): - comments.append(self.commentCombo.itemText(index)) + tasks = [self.taskCombo.itemText(index) + for index in range(self.taskCombo.count())] + comments = [self.commentCombo.itemText(index) + for index in range(self.commentCombo.count())] dlg = TimeTrackerEntryDialog(self.__tracker, None, tasks, comments) - if dlg.exec() == QDialog.Accepted: + if dlg.exec() == QDialog.DialogCode.Accepted: self.__tracker.addTrackerEntry(*dlg.getData()) def __editEntry(self): @@ -172,22 +177,20 @@ Private slot to edit the selected tracker entry. """ itm = self.entriesList.selectedItems()[0] - eid = itm.data(0, Qt.UserRole) + eid = itm.data(0, Qt.ItemDataRole.UserRole) if eid > -1: # the current entry is edited via the elements of this widget entry = self.__tracker.getEntry(eid) if entry is not None: from .TimeTrackerEntryDialog import TimeTrackerEntryDialog - tasks = [] - for index in range(self.taskCombo.count()): - tasks.append(self.taskCombo.itemText(index)) - comments = [] - for index in range(self.commentCombo.count()): - comments.append(self.commentCombo.itemText(index)) - dlg = TimeTrackerEntryDialog(self.__tracker, entry, tasks, - comments) - if dlg.exec() == QDialog.Accepted: + tasks = [self.taskCombo.itemText(index) + for index in range(self.taskCombo.count())] + comments = [self.commentCombo.itemText(index) + for index in range(self.commentCombo.count())] + dlg = TimeTrackerEntryDialog( + self.__tracker, entry, tasks, comments) + if dlg.exec() == QDialog.DialogCode.Accepted: start, duration, task, comment = dlg.getData() entry.setStartDateTime(start) @@ -196,27 +199,27 @@ entry.setComment(comment) self.__tracker.entryChanged() - (date, time, duration, task, - comment) = entry.getEntryData()[1:-1] + data = entry.getEntryData() itm.setText(0, self.tr("{0}, {1}", "date, time") - .format(date, time)) - itm.setText(1, self.tr("{0} min").format(duration)) - itm.setText(2, task) - itm.setText(3, comment) + .format(data["start_date"], + data["start_time"])) + itm.setText(1, self.tr("{0} min").format(data["duration"])) + itm.setText(2, data["task"]) + itm.setText(3, data["comment"]) self.__resizeColumns() def __deleteSelectedEntries(self): """ Private slot to delete the selected tracker entries. """ - res = E5MessageBox.yesNo( + res = EricMessageBox.yesNo( self, self.tr("Delete Selected Entries"), self.tr("""Do you really want to delete the selected""" """ entries?""")) if res: for item in self.entriesList.selectedItems(): - eid = item.data(0, Qt.UserRole) + eid = item.data(0, Qt.ItemDataRole.UserRole) if eid > -1: # the current entry must not be deleted self.entriesList.takeTopLevelItem( @@ -238,17 +241,17 @@ Preferences.getMultiProject("Workspace") or Utilities.getHomeDir() ) - fname = E5FileDialog.getOpenFileName( + fname = EricFileDialog.getOpenFileName( None, - self.tr("Import Tracker Entries"), + self.tr("Import Time Tracker Entries"), path, - self.tr("Text Files (*.txt);;All Files (*)")) + self.tr("Time Tracker Files (*.ttj);;All Files (*)")) if fname: fname = Utilities.toNativeSeparators(fname) if not os.path.exists(fname): - E5MessageBox.critical( + EricMessageBox.critical( self, - self.tr("Import Tracker Entries"), + self.tr("Import Time Tracker Entries"), self.tr("<p>The file <b>{0}</b> does not exist.</p>") .format(fname)) return @@ -259,19 +262,20 @@ """ Private method to export all or selected entries. - @keyparam ids list of IDs to export or all if empty (list of integer) + @param ids list of IDs to export or all if empty + @type list of int """ path = ( Preferences.getMultiProject("Workspace") or Utilities.getHomeDir() ) - fname, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( + fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( self, - self.tr("Export Tracker Entries"), + self.tr("Export Time Tracker Entries"), path, - self.tr("Text Files (*.txt);;All Files (*)"), + self.tr("Time Tracker Files (*.ttj);;All Files (*)"), None, - E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite)) + EricFileDialog.Options(EricFileDialog.DontConfirmOverwrite)) if fname: ext = QFileInfo(fname).suffix() if not ext: @@ -279,12 +283,12 @@ if ex: fname += ex if QFileInfo(fname).exists(): - res = E5MessageBox.yesNo( + res = EricMessageBox.yesNo( self, - self.tr("Export Tracker Entries"), + self.tr("Export Time Tracker Entries"), self.tr("<p>The file <b>{0}</b> already exists." " Overwrite it?</p>").format(fname), - icon=E5MessageBox.Warning) + icon=EricMessageBox.Warning) if not res: return fname = Utilities.toNativeSeparators(fname) @@ -296,7 +300,7 @@ """ ids = [] for itm in self.entriesList.selectedItems(): - eid = itm.data(0, Qt.UserRole) + eid = itm.data(0, Qt.ItemDataRole.UserRole) if eid > -1: ids.append(eid) @@ -307,7 +311,7 @@ """ Private slot to remove duplicate entries. """ - res = E5MessageBox.yesNo( + res = EricMessageBox.yesNo( self, self.tr("Remove Duplicate Tracker Entries"), self.tr("""Are you sure you want to remove duplicate""" @@ -320,7 +324,7 @@ """ Private slot to merge duplicate entries. """ - res = E5MessageBox.yesNo( + res = EricMessageBox.yesNo( self, self.tr("Merge Duplicate Tracker Entries"), self.tr("""Are you sure you want to merge duplicate""" @@ -333,16 +337,21 @@ """ Private method to insert a tracker entry into the list. - @param entry reference to the tracker entry (TimeTrackEntry) + @param entry reference to the tracker entry + @type TimeTrackEntry @param index index the entry is to be inserted; -1 for at the end - (integer) + @type int """ - eid, date, time, duration, task, comment, paused = entry.getEntryData() + data = entry.getEntryData() itm = QTreeWidgetItem( - [self.tr("{0}, {1}", "date, time").format(date, time), - self.tr("{0} min").format(duration), task, comment]) - itm.setTextAlignment(1, Qt.AlignRight) - itm.setData(0, Qt.UserRole, eid) + [self.tr("{0}, {1}", "date, time").format(data["start_date"], + data["start_time"]), + self.tr("{0} min").format(data["duration"]), + data["task"], + data["comment"]] + ) + itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight) + itm.setData(0, Qt.ItemDataRole.UserRole, data["id"]) if index == -1: self.entriesList.addTopLevelItem(itm) else: @@ -359,7 +368,8 @@ """ Public method to show the tracker entries of the current project. - @param entries list of tracker entries (list of TimeTrackEntry) + @param entries list of tracker entries + @type list of TimeTrackEntry """ self.taskCombo.addItem("") self.commentCombo.addItem("") @@ -386,23 +396,24 @@ """ Public method to set the current entry. - @param entry current entry (TimeTrackEntry) + @param entry current entry + @type TimeTrackEntry """ self.__insertEntry(entry, 0) self.__resizeColumns() - eid, date, time, duration, task, comment, paused = entry.getEntryData() + data = entry.getEntryData() self.startDateTimeEdit.setDateTime(entry.getStartDateTime()) - self.durationSpinBox.setValue(duration) - self.taskCombo.setEditText(task) - self.commentCombo.setEditText(comment) + self.durationSpinBox.setValue(data["duration"]) + self.taskCombo.setEditText(data["task"]) + self.commentCombo.setEditText(data["comment"]) def clear(self): """ Public method to clear all the data. """ self.entriesList.clear() - self.startDateTimeEdit.setDate(QDate(2000, 1, 1)) + self.startDateTimeEdit.setDate(QDate(2020, 1, 1)) self.startDateTimeEdit.setTime(QTime(0, 0, 0)) self.durationSpinBox.setValue(0) self.taskCombo.clear()