From f33cb7b98445ca9ed65e92d5c2a33b4efb1cbc2d Mon Sep 17 00:00:00 2001 From: Dale Muccignat Date: Tue, 29 Nov 2022 13:32:11 +1100 Subject: [PATCH 1/7] initial watsonctl --- bumblebee_status/modules/contrib/watsonctl.py | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 bumblebee_status/modules/contrib/watsonctl.py diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py new file mode 100644 index 00000000..39c1b8a6 --- /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 From f6fcf9b852feeacda3fb193505123d165e49547c Mon Sep 17 00:00:00 2001 From: Dale Muccignat Date: Tue, 29 Nov 2022 13:45:44 +1100 Subject: [PATCH 2/7] Changed play to tracking --- bumblebee_status/modules/contrib/watsonctl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py index 39c1b8a6..9d46a190 100644 --- a/bumblebee_status/modules/contrib/watsonctl.py +++ b/bumblebee_status/modules/contrib/watsonctl.py @@ -50,7 +50,7 @@ def toggle(self, widget): self.__status = "Paused" else: util.cli.execute("watson start " + self.__project) - self.__status = "Play" + self.__status = "Tracking" self.__tracking = not self.__tracking def change_project(self, event): @@ -82,7 +82,7 @@ def update(self): self.__tracking = True m = re.search(r"Project (.+) started", output) self.__project = m.group(1) - self.__status = "Play" + self.__status = "Tracking" self.get_list() def state(self, widget): From 2a38b4098d5ee37114e988675fe0658aec18d89a Mon Sep 17 00:00:00 2001 From: Dale Muccignat Date: Tue, 29 Nov 2022 17:27:06 +1100 Subject: [PATCH 3/7] Fix list not updating during runtime --- bumblebee_status/modules/contrib/watsonctl.py | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py index 9d46a190..1d879009 100644 --- a/bumblebee_status/modules/contrib/watsonctl.py +++ b/bumblebee_status/modules/contrib/watsonctl.py @@ -7,6 +7,7 @@ extended by `dale-muccignat `_ """ + import logging import re import functools @@ -30,17 +31,12 @@ def __init__(self, config, theme): 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 get_list(self): def toggle(self, widget): # on click, starts the timer if the project is slected @@ -77,13 +73,16 @@ def update(self): if re.match(r"No project started", output): self.__tracking = False self.__status = "Paused" - return + else: + self.__tracking = True + m = re.search(r"Project (.+) started", output) + self.__project = m.group(1) + self.__status = "Tracking" - self.__tracking = True - m = re.search(r"Project (.+) started", output) - self.__project = m.group(1) - self.__status = "Tracking" - self.get_list() + # 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 state(self, widget): return "on" if self.__tracking else "off" From 45660bbc08ab058c718cd63e5107e0872c90a003 Mon Sep 17 00:00:00 2001 From: Dale Muccignat Date: Tue, 29 Nov 2022 17:33:56 +1100 Subject: [PATCH 4/7] reduce update interval --- bumblebee_status/modules/contrib/watsonctl.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py index 1d879009..790ab9a1 100644 --- a/bumblebee_status/modules/contrib/watsonctl.py +++ b/bumblebee_status/modules/contrib/watsonctl.py @@ -21,7 +21,7 @@ class Module(core.module.Module): - # @core.decorators.every(minutes=1) + @core.decorators.every(minutes=5) def __init__(self, config, theme): super().__init__(config, theme, core.widget.Widget(self.text)) @@ -36,8 +36,6 @@ def __init__(self, config, theme): 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): - def toggle(self, widget): # on click, starts the timer if the project is slected if self.__project != "Select Project": @@ -82,6 +80,8 @@ def update(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] self.__project_key[self.__project_list[n]] = n def state(self, widget): From 06f3670a8519c79140c12eef2ba4da25e4938271 Mon Sep 17 00:00:00 2001 From: Dale Muccignat Date: Wed, 30 Nov 2022 11:15:10 +1100 Subject: [PATCH 5/7] initial gui for new project --- bumblebee_status/modules/contrib/watsonctl.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py index 790ab9a1..aa18b2b7 100644 --- a/bumblebee_status/modules/contrib/watsonctl.py +++ b/bumblebee_status/modules/contrib/watsonctl.py @@ -19,9 +19,11 @@ import util.cli +from easygui import * + class Module(core.module.Module): - @core.decorators.every(minutes=5) + # @core.decorators.every(minutes=5) def __init__(self, config, theme): super().__init__(config, theme, core.widget.Widget(self.text)) @@ -33,9 +35,22 @@ def __init__(self, config, theme): 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) core.input.register(self, button=core.input.WHEEL_DOWN, cmd=self.change_project) + 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) + def toggle(self, widget): # on click, starts the timer if the project is slected if self.__project != "Select Project": @@ -46,6 +61,7 @@ def toggle(self, widget): util.cli.execute("watson start " + self.__project) self.__status = "Tracking" self.__tracking = not self.__tracking + self.update() def change_project(self, event): # on scroll, cycles the currently selected project @@ -59,6 +75,7 @@ def change_project(self, event): self.__project = self.__project_list[n + 1] else: self.__project = self.__project_list[0] + self.update() def text(self, widget): if self.__tracking: From a7459c6a34d5350fab81f6bb7a6d73e3bb6f1fa3 Mon Sep 17 00:00:00 2001 From: Dale Muccignat Date: Wed, 30 Nov 2022 11:24:56 +1100 Subject: [PATCH 6/7] Fix scroll direction --- bumblebee_status/modules/contrib/watsonctl.py | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py index aa18b2b7..29f2b7a1 100644 --- a/bumblebee_status/modules/contrib/watsonctl.py +++ b/bumblebee_status/modules/contrib/watsonctl.py @@ -36,8 +36,8 @@ def __init__(self, config, theme): 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) - core.input.register(self, button=core.input.WHEEL_DOWN, cmd=self.change_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) def new_project(self, widget): # on right-click, open dialog to enter the name of a new project @@ -63,18 +63,30 @@ def toggle(self, widget): self.__tracking = not self.__tracking self.update() - def change_project(self, event): - # on scroll, cycles the currently selected project + 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] + self.update() + + 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: - 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] + self.__project = self.__project_list[-1] self.update() def text(self, widget): From dbbc4b86f31b31f411a9bd6474810ec25eb62645 Mon Sep 17 00:00:00 2001 From: Dale Muccignat Date: Thu, 1 Dec 2022 15:19:43 +1100 Subject: [PATCH 7/7] Fix update delays --- bumblebee_status/modules/contrib/watsonctl.py | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/bumblebee_status/modules/contrib/watsonctl.py b/bumblebee_status/modules/contrib/watsonctl.py index 29f2b7a1..b293baf3 100644 --- a/bumblebee_status/modules/contrib/watsonctl.py +++ b/bumblebee_status/modules/contrib/watsonctl.py @@ -23,9 +23,9 @@ class Module(core.module.Module): - # @core.decorators.every(minutes=5) + @core.decorators.every(seconds=0.05) def __init__(self, config, theme): - super().__init__(config, theme, core.widget.Widget(self.text)) + super().__init__(config, theme, core.widget.Widget(self.full_text)) self.__tracking = False self.__status = "" @@ -39,6 +39,17 @@ def __init__(self, config, theme): 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 @@ -50,18 +61,17 @@ def new_project(self, widget): 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") - self.__status = "Paused" else: util.cli.execute("watson start " + self.__project) - self.__status = "Tracking" self.__tracking = not self.__tracking - self.update() + def change_project_up(self, event): # on scroll up, cycles the currently selected project up @@ -74,7 +84,6 @@ def change_project_up(self, event): self.__project = self.__project_list[n + 1] else: self.__project = self.__project_list[0] - self.update() def change_project_down(self, event): # on scroll down, cycles the currently selected project down @@ -87,31 +96,22 @@ def change_project_down(self, event): self.__project = self.__project_list[n - 1] else: self.__project = self.__project_list[-1] - self.update() - def text(self, widget): + def full_text(self, widget): if self.__tracking: - return self.__project + ": " + self.__status + return self.__project + ": Tracking" + self.__status else: - return self.__project + ": " + self.__status + 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 - self.__status = "Paused" else: self.__tracking = True m = re.search(r"Project (.+) started", output) self.__project = m.group(1) - self.__status = "Tracking" - # 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] - self.__project_key[self.__project_list[n]] = n def state(self, widget): return "on" if self.__tracking else "off"