Ejemplo n.º 1
0
class QTracker(QtCore.QObject):
    db_path = os.path.expanduser('~/.config/qtracker/db.sqlite3')
    current_slot = False
    cp = None
    ct = None

    def __init__(self):
        QtCore.QObject.__init__(self)
        self.mw = QTrackerMW()
        self.ui = qtracker.Ui_QTracker()
        self.ui.setupUi(self.mw)

        self.pw = QtGui.QWidget()
        self.pui = project.Ui_widget()
        self.pui.setupUi(self.pw)

        self.tw = QtGui.QWidget()
        self.tui = task.Ui_widget()
        self.tui.setupUi(self.tw)
        #print "DB path => %s" % self.db_path
        self.engine = create_engine('sqlite:///%s' % self.db_path, echo=False)
        self._session = sessionmaker(bind = self.engine)
        self.meta = Base.metadata
        self.meta.create_all(self.engine)
        self.session = self._session()
        QtCore.QObject.connect(self.ui.addproject_button, QtCore.SIGNAL('clicked()'), self.pw.show)
        QtCore.QObject.connect(self.ui.addtask_button, QtCore.SIGNAL('clicked()'), self.tw.show)
        QtCore.QObject.connect(self.pui.button_box, QtCore.SIGNAL('accepted()'), self.add_project)
        QtCore.QObject.connect(self.tui.button_box, QtCore.SIGNAL('accepted()'), self.add_task)
        QtCore.QObject.connect(self.ui.project_combo, QtCore.SIGNAL('activated(int)'), self.choose_project)
        QtCore.QObject.connect(self.ui.start_button, QtCore.SIGNAL('clicked()'), self.start_slot)
        QtCore.QObject.connect(self.ui.stop_button, QtCore.SIGNAL('clicked()'), self.stop_slot)
        QtCore.QObject.connect(self.ui.rebuild, QtCore.SIGNAL('clicked()'), self.build)
        self.mw.close_signal.connect(self.stop_slot)
        self.build()
        self.build_tray_menu()
        self.choose_project(self.ui.project_combo.currentIndex())
        self.mw.show()

    def build_tray_menu(self):
        tr = QtGui.QIcon()
        tr.addPixmap(QtGui.QPixmap(":/icons/foto.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.tray = QtGui.QSystemTrayIcon(tr, self)
        self.tray.show()
        self.traymenu = QtGui.QMenu("QTracker Tray Menu")
        self.tm_switch = QtGui.QAction(self.mw)
        self.tm_switch.setText("&Switch to")
        self.traymenu.addAction(self.tm_switch)
        #self.about_widget.connect(self.tm_about, QtCore.SIGNAL('triggered()'), QtCore.SLOT('show()'))
        for i in self.projects:
            a = QtGui.QAction(self.mw)
            a.setText(i.name)
            self.traymenu.addAction(a)


        # self.tm_about = QAction(self.mw)
        # self.tm_about.setText(QApplication.translate("MainWindow", "&About", None, QApplication.UnicodeUTF8))
        # self.about_widget.connect(self.tm_about, QtCore.SIGNAL('triggered()'), QtCore.SLOT('show()'))

        # self.tm_close = QAction(self.mw)
        # self.tm_close.setText(QApplication.translate("MainWindow", "&Close", None, QApplication.UnicodeUTF8))
        # self.mw.connect(self.tm_close, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

        # self.traymenu.addAction(self.tm_about)
        # self.traymenu.addAction(self.tm_close)
        QtCore.QObject.connect(self.tray, QtCore.SIGNAL('activated(QSystemTrayIcon::ActivationReason)'), self.show_main)
        self.tray.setContextMenu(self.traymenu)

    @QtCore.pyqtSlot(int)
    def show_main(self, value = -3):
        if value in [2, 3]:
            if self.mw.isVisible():
                self.mw.hide()
            else:
                self.mw.show()


    def current_project_task(self):
        _p = _t = None
        if self.ui.project_combo.currentIndex() >= 0:
            _p = self.projects[self.ui.project_combo.currentIndex()]
            if self.ui.task_combo.currentIndex() >= 0:
                _t = _p.tasks[self.ui.task_combo.currentIndex()]
        return _p, _t


    def start_slot(self):
        if self.current_slot:
            self.stop_slot()
        project, task = self.current_project_task()
        self.current_slot = Slot(project, task)
        self.session.add(self.current_slot)
        self.session.commit()
        self.ui.stop_button.setEnabled(True)
        self.ui.start_button.setEnabled(False)

    def stop_slot(self):
        if not self.current_slot:
            return
        self.current_slot.stop()
        time_for_slot = self.current_slot.end - self.current_slot.start
        p = self.current_slot.project
        p.time_spent += time_for_slot.seconds
        t = self.current_slot.task
        if t:
            t.time_spent += time_for_slot.seconds
            self.session.add(t)
        self.session.add(p)
        self.session.add(self.current_slot)
        self.session.commit()
        self.ui.stop_button.setEnabled(False)
        self.ui.start_button.setEnabled(True)
        self.current_slot = False
        #self.build()


    def build(self, project = None, task = None):
        _p = _t = None
        if project:
            _p = project
        else:
            if self.ui.project_combo.currentIndex() >= 0:
                _p = self.projects[self.ui.project_combo.currentIndex()]
        if task:
            _t = task
        # else:
        #     if self.ui.task_combo.currentIndex() >= 0:
        #         _t = _p.tasks[self.ui.task_combo.currentIndex()]

        print "P T", _p, _t
        self.tui.project_combo.clear()
        self.ui.project_combo.clear()
        self.ui.time_report.clear()
        self.projects = self.session.query(Project).order_by('name').all()
        for p in self.projects:
            print "Tasks for %s =>" % p, p.tasks
            self.tui.project_combo.addItem(p.name)
            self.ui.project_combo.addItem(p.name)
            parent = QtGui.QTreeWidgetItem(self.ui.time_report, [p.name, htime(p.time_spent), str(len(p.slots))])
            parent.setExpanded(True)
            for t in p.tasks:
                parent.addChild(QtGui.QTreeWidgetItem([t.name, htime(t.time_spent), str(len(t.slots))]))
        if _p:
            self.choose_project(self.projects.index(_p))
            if _t:
                self.ui.task_combo.setCurrentIndex(_p.tasks.index(_t))
        

    def add_project(self):
        name = str(self.pui.newproject_line.text())
        print "Devo creare il progetto =>", name
        exists = self.session.query(Project).filter_by(name = name).all()
        if exists:
            self.pui.error.setText("Project %s already exixts!" % name)
            return
        self.pui.error.setText("")
        p = Project(name)
        self.session.add(p)
        self.session.commit()
        print p.id
        self.pw.hide()
        self.pui.newproject_line.setText('')
        self.build(project)

    def add_task(self):
        name = str(self.tui.newtask_line.text())
        p = self.tui.project_combo.currentIndex()
        project = self.projects[p]
        print "Adding task %s for project %s" % (name, p)
        exists = self.session.query(Task).filter_by(name = name, project = project).all()
        if exists:
            self.tui.error.setText("Task %s for project %s already exists!" % (name, project.name))
            return

        self.tui.error.setText("")
        t = Task(name, project)
        self.session.add(t)
        self.session.commit()
        self.tw.hide()
        self.tui.newtask_line.setText('')
        self.build(project, t)

    def choose_project(self, index, task = None):
        if index < 0:
            self.ui.task_combo.clear()
            return
        self.tui.project_combo.setCurrentIndex(index)
        self.ui.task_combo.clear()
        for t in self.projects[index].tasks:
            self.ui.task_combo.addItem(t.name)
        if task:
            self.ui.task_combo.setIndex(task)