TimeTracker/TimeTrackerWidget.py

branch
eric7
changeset 98
693e42176007
parent 94
a3d936304e51
child 105
44bfd9e7e65e
diff -r 44ec4168b442 -r 693e42176007 TimeTracker/TimeTrackerWidget.py
--- 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()

eric ide

mercurial