add a UI class
parent
6811deaedc
commit
dcab278223
72
main.py
72
main.py
|
@ -7,6 +7,7 @@ import os
|
||||||
from datetime import timezone
|
from datetime import timezone
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import sys
|
import sys
|
||||||
|
import threading
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from typing import Optional, Tuple, TypeVar
|
from typing import Optional, Tuple, TypeVar
|
||||||
|
|
||||||
|
@ -86,6 +87,43 @@ def setup() -> Optional[Exception]:
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
class UI:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.quitting = False
|
||||||
|
self.pwin = curses.initscr()
|
||||||
|
self.pwin.keypad(True)
|
||||||
|
curses.noecho()
|
||||||
|
curses.raw()
|
||||||
|
if curses.has_colors():
|
||||||
|
curses.start_color()
|
||||||
|
try:
|
||||||
|
curses.curs_set(0)
|
||||||
|
except curses.error:
|
||||||
|
# Not all terminals support this functionality.
|
||||||
|
# When the error is ignored the screen will be slightly uglier but functional
|
||||||
|
# so we ignore this error for terminal compatibility.
|
||||||
|
pass
|
||||||
|
if curses.COLS < MIN_SCREEN_WIDTH:
|
||||||
|
raise Exception("the terminal window is too narrow")
|
||||||
|
if curses.LINES < MIN_SCREEN_HEIGHT:
|
||||||
|
raise Exception("the terminal window is too short")
|
||||||
|
self.menuwin = curses.newwin(10, 30, 4, 2)
|
||||||
|
self.plantwin = curses.newwin(30, 40, 4, 31)
|
||||||
|
self.scorewin = curses.newwin(2, 30, 15, 2)
|
||||||
|
# TODO info area (is this where prompt is rendered?)
|
||||||
|
|
||||||
|
def quit(self) -> None:
|
||||||
|
self.quitting = True
|
||||||
|
|
||||||
|
def handle_input(self) -> None:
|
||||||
|
while True:
|
||||||
|
c = self.pwin.getch()
|
||||||
|
if c == -1 or c == ord("q") or c == ord("x") or c == 27:
|
||||||
|
self.quit()
|
||||||
|
break
|
||||||
|
|
||||||
|
# TODO Plant
|
||||||
|
|
||||||
def main() -> Optional[Exception]:
|
def main() -> Optional[Exception]:
|
||||||
username = getuser()
|
username = getuser()
|
||||||
|
|
||||||
|
@ -93,34 +131,22 @@ def main() -> Optional[Exception]:
|
||||||
if e is not None:
|
if e is not None:
|
||||||
return e
|
return e
|
||||||
|
|
||||||
# TODO rug sweep curses stuff
|
|
||||||
parentwin = curses.initscr()
|
|
||||||
parentwin.keypad(True)
|
|
||||||
curses.noecho()
|
|
||||||
curses.raw()
|
|
||||||
if curses.has_colors():
|
|
||||||
curses.start_color()
|
|
||||||
try:
|
try:
|
||||||
curses.curs_set(0)
|
ui = UI()
|
||||||
except curses.error:
|
except Exception as e:
|
||||||
# Not all terminals support this functionality.
|
return Exception(f"could not initialize UI: {e}")
|
||||||
# When the error is ignored the screen will be slightly uglier but functional
|
|
||||||
# so we ignore this error for terminal compatibility.
|
|
||||||
pass
|
|
||||||
if curses.COLS < MIN_SCREEN_WIDTH:
|
|
||||||
return Exception("the terminal window is too narrow")
|
|
||||||
if curses.LINES < MIN_SCREEN_HEIGHT:
|
|
||||||
return Exception("the terminal window is too short")
|
|
||||||
|
|
||||||
menuwin = curses.newwin(10, 30, 4, 2)
|
ithread = threading.Thread(target=ui.handle_input, args=())
|
||||||
plantwin = curses.newwin(30, 40, 4, 31)
|
ithread.start()
|
||||||
scorewin = curses.newwin(2, 30, 15, 2)
|
|
||||||
# TODO info area (is this where prompt is rendered?)
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
c = parentwin.getch()
|
if ui.quitting:
|
||||||
if c == -1 or c == ord("q") or c == ord("x") or c == 27:
|
|
||||||
break
|
break
|
||||||
|
|
||||||
|
# TODO get plant info from db
|
||||||
|
# TODO update in-memory representation of derived characteristics / plant info
|
||||||
|
# TODO redraw plant (if changed)
|
||||||
|
# TODO redraw water gauge
|
||||||
sleep(INTERVAL)
|
sleep(INTERVAL)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Reference in New Issue