diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py new file mode 100644 index 0000000..39c1b8a --- /dev/null +++ b/bumblebee_status/modules/contrib/watsonctl.py @@ -0,0 +1,92 @@ +# 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 + + +class Module(core.module.Module): + # @core.decorators.every(minutes=1) + def __init__(self, config, theme): + super().__init__(config, theme, core.widget.Widget(self.text)) + + self.__tracking = False + self.__status = "" + self.__project = "Select Project" + + self.__project_key = {} + self.__project_list = [] + self.get_list() + + core.input.register(self, button=core.input.LEFT_MOUSE, cmd=self.toggle) + core.input.register(self, button=core.input.WHEEL_UP, cmd=self.change_project) + core.input.register(self, button=core.input.WHEEL_DOWN, cmd=self.change_project) + + def get_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)): + self.__project_key[self.__project_list[n]] = n + + 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") + self.__status = "Paused" + else: + util.cli.execute("watson start " + self.__project) + self.__status = "Play" + self.__tracking = not self.__tracking + + def change_project(self, event): + # on scroll, cycles the currently selected project + if self.__tracking: + return + if self.__project == "Select Project": + self.__project = self.__project_list[0] + else: + 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 text(self, widget): + if self.__tracking: + return self.__project + ": " + self.__status + else: + return self.__project + ": " + self.__status + + def update(self): + output = util.cli.execute("watson status") + if re.match(r"No project started", output): + self.__tracking = False + self.__status = "Paused" + return + + self.__tracking = True + m = re.search(r"Project (.+) started", output) + self.__project = m.group(1) + self.__status = "Play" + self.get_list() + + def state(self, widget): + return "on" if self.__tracking else "off" + + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4