Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

watsonctl.py an interactive extension to watson.py #942

Draft
wants to merge 7 commits into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions bumblebee_status/modules/contrib/watsonctl.py
Original file line number Diff line number Diff line change
@@ -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 <https://github.com/bendardenne>`_ - many thanks!
extended by `dale-muccignat <https://github.com/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