Compare commits

..

3 commits

Author SHA1 Message Date
Chris (wolcen) Thompson
e8f7adc355 Seems there are problems with prompt on the same line (sometimes)
May well have to do with changes to my environment, but I'm not dealing w/that now
2024-11-19 13:31:34 -05:00
Chris (wolcen) Thompson
f908389c40 Add text entry history/editing/auto-complete
...and import utc directly
2024-11-19 10:59:14 -05:00
Chris (wolcen) Thompson
5c111e96f1 Add ability to use w/out GUI (via --no-gui)
And ring the console bell w/--noisy
2024-11-18 21:39:33 -05:00
2 changed files with 53 additions and 16 deletions

View file

@ -6,23 +6,39 @@ import prompt_window
import time import time
from datetime import datetime, timedelta from datetime import datetime, timedelta
from pathlib import Path 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 WORK_MIN = 25 # Minutes for a work session
SHORT_MIN = 5 # Minutes for a short break SHORT_MIN = 5 # Minutes for a short break
LONG_MIN = 15 # Minutes for a long break (NOT YET IMPLEMENTED) LONG_MIN = 15 # Minutes for a long break (NOT YET IMPLEMENTED)
INTERRUPTED_MIN = 1 # Minimum minutes to ask to record an interrupted Pomodoro INTERRUPTED_MIN = 1 # Minimum minutes to ask to record an interrupted Pomodoro
QUIET = True QUIET = True
GUI = True
def pomodoro_prompt_plan(whatdid = ''): def pomodoro_prompt_plan(whatdid = ''):
""" Ask about what task will be worked on (showing last thing worked on) """ 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 # 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. # running pomodoro prompt, that might be even better than the pop-up GUI text entry.
if GUI:
whatnext = prompt_window.prompt(prompt=text, task=whatdid) 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. # Pressing cancel returns None, but we want to just treat it as an empty string.
if whatnext is None: if whatnext is None:
whatnext = '' whatnext = ''
@ -31,8 +47,15 @@ def pomodoro_prompt_plan(whatdid = ''):
def pomodoro_prompt_report(whatnext): def pomodoro_prompt_report(whatnext):
""" Ask what task was completed, showing the last task claimed to be being worked on """ Ask what task was completed, showing the last task claimed to be being worked on
""" """
text = "What'd you do?" text = "What'd you do? "
if GUI:
whatdid = prompt_window.prompt(prompt=text, task=whatnext) 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. # Pressing cancel returns None, but we want to just treat it as an empty string.
if whatdid is None: if whatdid is None:
whatdid = '' whatdid = ''
@ -64,7 +87,7 @@ def record_task(whatnext, whatdid, start, end=None):
""" Record completed pomodoro to CSV """ Record completed pomodoro to CSV
""" """
if end is None: if end is None:
end = datetime.now(pytz.utc) end = datetime.now(utc)
filepath = prepare_file(start) filepath = prepare_file(start)
if not os.path.isfile(filepath): if not os.path.isfile(filepath):
@ -84,8 +107,8 @@ def str_minutes(time_diff):
def countdown_to(until): def countdown_to(until):
""" Display a timer counting down to until """ Display a timer counting down to until
""" """
while datetime.now(pytz.utc) <= until: while datetime.now(utc) <= until:
to_go = until-datetime.now(pytz.utc) to_go = until-datetime.now(utc)
print('\r', str_minutes(to_go), sep='', end='') print('\r', str_minutes(to_go), sep='', end='')
time.sleep(1) time.sleep(1)
@ -107,20 +130,33 @@ def prepare_file(utc_start, ext='csv', daily=False):
timelog_path += '.' + ext timelog_path += '.' + ext
return timelog_path 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(): def main():
whatdid = '' whatdid = ''
global GUI, QUIET
if "--no-gui" in sys.argv:
GUI = False
if "--noisy" in sys.argv:
QUIET = False
while True: while True:
whatnext = pomodoro_prompt_plan(whatdid) whatnext = pomodoro_prompt_plan(whatdid)
start = datetime.now(pytz.utc) start = datetime.now(utc)
end = start + timedelta(minutes=WORK_MIN) end = start + timedelta(minutes=WORK_MIN)
log_step('Start with plan: ' + whatnext, start) log_step('Start with plan: ' + whatnext, start)
try: try:
print('Working on: ' + whatnext) print('Working on: ' + (whatnext or "(...it must be a mystery)"))
countdown_to(end) countdown_to(end)
if not QUIET: if not QUIET:
from playsound import playsound bing()
playsound('res/timesup.aac')
whatdid = pomodoro_prompt_report(whatnext) whatdid = pomodoro_prompt_report(whatnext)
record_task(whatnext, whatdid, start) record_task(whatnext, whatdid, start)
log_step('Completed pomodoro: ' + whatdid, start, True) log_step('Completed pomodoro: ' + whatdid, start, True)
@ -129,16 +165,16 @@ def main():
print('Break time!') print('Break time!')
# We're taking a break. Clear out task start/end times. # We're taking a break. Clear out task start/end times.
start = None start = None
end = datetime.now(pytz.utc) + timedelta(minutes=SHORT_MIN) end = datetime.now(utc) + timedelta(minutes=SHORT_MIN)
countdown_to(end) countdown_to(end)
if not QUIET: if not QUIET:
playsound('res/timesup.aac') bing()
continue continue
except KeyboardInterrupt: except KeyboardInterrupt:
if start is None: if start is None:
quit_prompt() quit_prompt()
continue continue
time_spent = datetime.now(pytz.utc) - start time_spent = datetime.now(utc) - start
if time_spent < timedelta(minutes=INTERRUPTED_MIN): if time_spent < timedelta(minutes=INTERRUPTED_MIN):
quit_prompt() quit_prompt()
continue continue

View file

@ -11,6 +11,7 @@ in pkgs.mkShell {
pycairo pycairo
pytz pytz
tzlocal tzlocal
prompt-toolkit # for text entry history/auto complete
# For Qt: # For Qt:
# pyside6 # pyside6
# Using GTK: # Using GTK: