diff --git a/pomodoroprompt.py b/pomodoroprompt.py index 1cec777..7cb3456 100644 --- a/pomodoroprompt.py +++ b/pomodoroprompt.py @@ -6,23 +6,39 @@ import prompt_window import time from datetime import datetime, timedelta from pathlib import Path -from pytz import timezone +from pytz import timezone, utc +from prompt_toolkit import PromptSession +from prompt_toolkit.history import FileHistory +#from prompt_toolkit.auto_suggest import AutoSuggestFromHistory +from prompt_toolkit.completion import WordCompleter -import pytz +session = PromptSession(history=FileHistory(os.path.expanduser('~/.pomodoro_history'))) +# Move to a file: +words = WordCompleter(['NCHFA', 'PECE', 'Housing Works', 'Internal']) +#os.path.dirname(os.path.realpath(__file__)) +#completion_list = WordCompleter(history=FileHistory(os.path.dirname(os.path.realpath(__file__)) + '.auto_complete')) WORK_MIN = 25 # Minutes for a work session SHORT_MIN = 5 # Minutes for a short break LONG_MIN = 15 # Minutes for a long break (NOT YET IMPLEMENTED) INTERRUPTED_MIN = 1 # Minimum minutes to ask to record an interrupted Pomodoro QUIET = True +GUI = True def pomodoro_prompt_plan(whatdid = ''): """ Ask about what task will be worked on (showing last thing worked on) """ - text = "What're you gonna do?" + text = "What're you gonna do? " # NOTE: If we can do system notifications that when clicked will focus the terminal # running pomodoro prompt, that might be even better than the pop-up GUI text entry. - whatnext = prompt_window.prompt(prompt=text, task=whatdid) + if GUI: + whatnext = prompt_window.prompt(prompt=text, task=whatdid) + else: + whatnext = session.prompt(message = text + '\n', + default = whatdid or '', + vi_mode = True, + completer = words, + complete_while_typing = True).strip() # Pressing cancel returns None, but we want to just treat it as an empty string. if whatnext is None: whatnext = '' @@ -31,8 +47,15 @@ def pomodoro_prompt_plan(whatdid = ''): def pomodoro_prompt_report(whatnext): """ Ask what task was completed, showing the last task claimed to be being worked on """ - text = "What'd you do?" - whatdid = prompt_window.prompt(prompt=text, task=whatnext) + text = "What'd you do? " + if GUI: + whatdid = prompt_window.prompt(prompt=text, task=whatnext) + else: + whatdid = session.prompt(message = text + '\n', + default = whatnext or '', + vi_mode = True, + completer = words, + complete_while_typing = True).strip() # Pressing cancel returns None, but we want to just treat it as an empty string. if whatdid is None: whatdid = '' @@ -64,7 +87,7 @@ def record_task(whatnext, whatdid, start, end=None): """ Record completed pomodoro to CSV """ if end is None: - end = datetime.now(pytz.utc) + end = datetime.now(utc) filepath = prepare_file(start) if not os.path.isfile(filepath): @@ -84,8 +107,8 @@ def str_minutes(time_diff): def countdown_to(until): """ Display a timer counting down to until """ - while datetime.now(pytz.utc) <= until: - to_go = until-datetime.now(pytz.utc) + while datetime.now(utc) <= until: + to_go = until-datetime.now(utc) print('\r', str_minutes(to_go), sep='', end='') time.sleep(1) @@ -107,20 +130,33 @@ def prepare_file(utc_start, ext='csv', daily=False): timelog_path += '.' + ext return timelog_path +def bing(): + if GUI: + from playsound import playsound + playsound('res/timesup.aac') + else: + sys.stdout.write('\a') + sys.stdout.flush() + def main(): whatdid = '' + global GUI, QUIET + if "--no-gui" in sys.argv: + GUI = False + if "--noisy" in sys.argv: + QUIET = False + while True: whatnext = pomodoro_prompt_plan(whatdid) - start = datetime.now(pytz.utc) + start = datetime.now(utc) end = start + timedelta(minutes=WORK_MIN) log_step('Start with plan: ' + whatnext, start) try: - print('Working on: ' + whatnext) + print('Working on: ' + (whatnext or "(...it must be a mystery)")) countdown_to(end) if not QUIET: - from playsound import playsound - playsound('res/timesup.aac') + bing() whatdid = pomodoro_prompt_report(whatnext) record_task(whatnext, whatdid, start) log_step('Completed pomodoro: ' + whatdid, start, True) @@ -129,16 +165,16 @@ def main(): print('Break time!') # We're taking a break. Clear out task start/end times. start = None - end = datetime.now(pytz.utc) + timedelta(minutes=SHORT_MIN) + end = datetime.now(utc) + timedelta(minutes=SHORT_MIN) countdown_to(end) if not QUIET: - playsound('res/timesup.aac') + bing() continue except KeyboardInterrupt: if start is None: quit_prompt() continue - time_spent = datetime.now(pytz.utc) - start + time_spent = datetime.now(utc) - start if time_spent < timedelta(minutes=INTERRUPTED_MIN): quit_prompt() continue diff --git a/shell.nix b/shell.nix index 484bf23..fff5e53 100644 --- a/shell.nix +++ b/shell.nix @@ -11,6 +11,7 @@ in pkgs.mkShell { pycairo pytz tzlocal + prompt-toolkit # for text entry history/auto complete # For Qt: # pyside6 # Using GTK: