TimeTracker/TimeTrackerWidget.py

Sat, 20 Oct 2012 12:34:26 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 20 Oct 2012 12:34:26 +0200
changeset 4
c67abfea9955
parent 3
ce9309868f8a
child 5
6633e2836f8f
permissions
-rw-r--r--

Implemented some more of the TimeTrackerWidget.

# -*- coding: utf-8 -*-

# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing the time tracker widget.
"""

from PyQt4.QtCore import pyqtSlot, QPoint, Qt, QDate, QTime
from PyQt4.QtGui import QWidget, QMenu, QTreeWidgetItem, QCursor

from .Ui_TimeTrackerWidget import Ui_TimeTrackerWidget


class TimeTrackerWidget(QWidget, Ui_TimeTrackerWidget):
    """
    Class implementing the time tracker widget.
    """
    DurationColumn = 1
    TaskColumn = 2
    CommentColumn = 3
    
    def __init__(self, tracker, parent=None):
        """
        Constructor
        
        @param tracker reference to the time tracker (TimeTracker)
        @param parent reference to the parent widget (QWidget)
        """
        super().__init__(parent)
        self.setupUi(self)
        
        self.__tracker = tracker
    
    @pyqtSlot(str)
    def on_taskCombo_editTextChanged(self, txt):
        """
        Private slot handling changes of the task description of the current entry.
        
        @param txt new task description (string)
        """
        itm = self.entriesList.topLevelItem(0)
        itm.setText(self.TaskColumn, txt)
        self.entriesList.resizeColumnToContents(self.TaskColumn)
        
        entry = self.__tracker.getCurrentEntry()
        entry.setTask(txt)
    
    @pyqtSlot(str)
    def on_commentCombo_editTextChanged(self, txt):
        """
        Private slot handling changes of the comment of the current entry.
        
        @param txt new comment (string)
        """
        itm = self.entriesList.topLevelItem(0)
        itm.setText(self.CommentColumn, txt)
        self.entriesList.resizeColumnToContents(self.CommentColumn)
        
        entry = self.__tracker.getCurrentEntry()
        entry.setComment(txt)
    
    @pyqtSlot(bool)
    def on_pauseButton_toggled(self, checked):
        """
        Private slot to pause the current timing.
        """
        if checked:
            self.__tracker.pauseTrackerEntry()
            
            entry = self.__tracker.getCurrentEntry()
            duration = entry.getDuration()
            
            itm = self.entriesList.topLevelItem(0)
            itm.setText(self.DurationColumn, self.tr("{0} min").format(duration))
            self.entriesList.resizeColumnToContents(self.CommentColumn)
            
            self.durationSpinBox.setValue(duration)
        else:
            self.__tracker.continueTrackerEntry()
    
    @pyqtSlot()
    def on_newButton_clicked(self):
        """
        Private slot to end the current timer and start a new one.
        """
        # stop the current tracker
        eid, duration = self.__tracker.stopTrackerEntry()
        itm = self.entriesList.topLevelItem(0)
        itm.setText(self.DurationColumn, self.tr("{0} min").format(duration))
        itm.setData(0, Qt.UserRole, eid)
        self.entriesList.resizeColumnToContents(self.CommentColumn)
        
        # start a new one
        self.__tracker.startTrackerEntry()
    
    @pyqtSlot(QPoint)
    def on_entriesList_customContextMenuRequested(self, pos):
        """
        Private slot to create the context menu and show it.
        
        @param pos position the menu should be shown at (QPoint)
        """
        menu = QMenu()
        
        menu.addAction(self.tr("Edit"), self.__editEntry).setEnabled(
            len(self.entriesList.selectedItems()) == 1)
        menu.addAction(self.tr("Delete"), self.__deleteSelectedEntries)
        menu.addSeparator()
        menu.addAction(self.tr("Save"), self.__saveEntries)
        menu.addSeparator()
        menu.addAction(self.tr("Import"), self.__importEntries)
        menu.addAction(self.tr("Export Selected"), self.__exportSelectedEntries)
        menu.addAction(self.tr("Export All"), self.__exportAllEntries)
        menu.exec_(QCursor.pos())
    
    def __editEntry(self):
        """
        Private slot to edit the selected tracker entry.
        """
        # TODO: not implemented yet
        raise NotImplementedError
    
    def __deleteSelectedEntries(self):
        """
        Private slot to delete the selected tracker entries.
        """
        # TODO: not implemented yet
        raise NotImplementedError
    
    def __saveEntries(self):
        """
        Private slot to save the tracker entries.
        """
        # TODO: not implemented yet
        raise NotImplementedError
    
    def __importEntries(self):
        """
        Private slot to import tracker entries.
        """
        # TODO: not implemented yet
        raise NotImplementedError
    
    def __exportSelectedEntries(self):
        """
        Private slot to export the selected tracker entries.
        """
        # TODO: not implemented yet
        raise NotImplementedError
    
    def __exportAllEntries(self):
        """
        Private slot to export all tracker entries.
        """
        # TODO: not implemented yet
        raise NotImplementedError
    
    def __insertEntry(self, entry, index=-1):
        """
        Private method to insert a tracker entry into the list.
        
        @param entry reference to the tracker entry (TimeTrackEntry)
        @param index index the entry is to be inserted; -1 for at the end
            (integer)
        """
        eid, date, time, duration, task, comment, paused = 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)
        if index == -1:
            self.entriesList.addTopLevelItem(itm)
        else:
            self.entriesList.insertTopLevelItem(index, itm)
    
    def __resizeColumns(self):
        """
        Private slot to resize the columns of the entries list.
        """
        for column in range(self.entriesList.columnCount()):
            self.entriesList.resizeColumnToContents(column)
    
    def showTrackerEntries(self, entries):
        """
        Public method to show the tracker entries of the current project.
        
        @param entries list of tracker entries (list of TimeTrackEntry)
        """
        for entry in entries:
            self.__insertEntry(entry)
        self.__resizeColumns()
    
    def setCurrentEntry(self, entry):
        """
        Public method to set the current entry.
        
        @param entry current entry (TimeTrackEntry)
        """
        self.__insertEntry(entry, 0)
        self.__resizeColumns()
        
        eid, date, time, duration, task, comment, paused = entry.getEntryData()
        self.startDateTimeEdit.setDateTime(entry.getStartDateTime())
        self.durationSpinBox.setValue(duration)
        self.taskCombo.setEditText(task)
        self.commentCombo.setEditText(comment)
    
    def clear(self):
        """
        Public method to clear all the data.
        """
        self.entriesList.clear()
        self.startDateTimeEdit.setDate(QDate(2000, 1, 1))
        self.startDateTimeEdit.setTime(QTime(0, 0, 0))
        self.durationSpinBox.setValue(0)
        self.taskCombo.clear()
        self.commentCombo.clear()

eric ide

mercurial