diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py new file mode 100644 index 00000000..b293baf3 --- /dev/null +++ b/bumblebee_status/modules/contrib/watsonctl.py @@ -0,0 +1,120 @@ +# pylint: disable=C0111,R0903 + +"""Displays the status of watson (time-tracking tool) +Requires the following executable: + * watson +origional module contributed by `bendardenne `_ - many thanks! +extended by `dale-muccignat `_ +""" + + +import logging +import re +import functools + +import core.module +import core.widget +import core.input +import core.decorators + +import util.cli + +from easygui import * + + +class Module(core.module.Module): + @core.decorators.every(seconds=0.05) + def __init__(self, config, theme): + super().__init__(config, theme, core.widget.Widget(self.full_text)) + + self.__tracking = False + self.__status = "" + self.__project = "Select Project" + + self.__project_key = {} + self.__project_list = [] + + core.input.register(self, button=core.input.LEFT_MOUSE, cmd=self.toggle) + core.input.register(self, button=core.input.RIGHT_MOUSE, cmd=self.new_project) + core.input.register(self, button=core.input.WHEEL_UP, cmd=self.change_project_up) + core.input.register(self, button=core.input.WHEEL_DOWN, cmd=self.change_project_down) + + self.update_list() + + def update_list(self): + # updates the list of current projects and creats a key dictionary + self.__project_list = util.cli.execute("watson projects").split() + for n in range(len(self.__project_list)): + if n == 0 and self.__project == "Select Project": + self.__project = self.__project_list[n] + if self.__project_list[n] not in self.__project_key: + self.__project_key[self.__project_list[n]] = n + + def new_project(self, widget): + # on right-click, open dialog to enter the name of a new project + # TODO: enable entering a new tag in a second dialog box + if self.__tracking: + return + text = "Enter the name of a new project to start" + title = "Watson" + output = enterbox(text,title,self.__project) + if output: + self.__project = output + util.cli.execute("watson start " + self.__project) + self.update_list() + + def toggle(self, widget): + # on click, starts the timer if the project is slected + if self.__project != "Select Project": + if self.__tracking: + util.cli.execute("watson stop") + else: + util.cli.execute("watson start " + self.__project) + self.__tracking = not self.__tracking + + + def change_project_up(self, event): + # on scroll up, cycles the currently selected project up + if self.__tracking: + return + if self.__project == "Select Project": + return + n = self.__project_key[self.__project] + if n < len(self.__project_list) - 1: + self.__project = self.__project_list[n + 1] + else: + self.__project = self.__project_list[0] + + def change_project_down(self, event): + # on scroll down, cycles the currently selected project down + if self.__tracking: + return + if self.__project == "Select Project": + return + n = self.__project_key[self.__project] + if n > 0: + self.__project = self.__project_list[n - 1] + else: + self.__project = self.__project_list[-1] + + def full_text(self, widget): + if self.__tracking: + return self.__project + ": Tracking" + self.__status + else: + return self.__project + ": Paused" + self.__status + + def update(self): + output = util.cli.execute("watson status") + if re.match(r"No project started", output): + self.__tracking = False + else: + self.__tracking = True + m = re.search(r"Project (.+) started", output) + self.__project = m.group(1) + + + def state(self, widget): + return "on" if self.__tracking else "off" + + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4