""" haTerm - v0.1 (c) Chiara Wohlwend haTerm is a Terminal Based hafas client, using the ivb endpoint. Prompt_toolkit (https://github.com/prompt-toolkit/python-prompt-toolkit) will be used to render a terminal user interface (TUI). The application will provide routing information and station departures/arrivals. """ import backend from prompt_toolkit import Application from prompt_toolkit.buffer import Buffer from prompt_toolkit.layout.layout import Layout from prompt_toolkit.layout.containers import Window, VSplit, HSplit from prompt_toolkit.layout.controls import BufferControl from prompt_toolkit.key_binding import KeyBindings import threading def run_station_monitor(hafas: backend.HafasClient | None = None): """Run the station monitor TUI. Parameters: - hafas: optional shared HafasClient instance. If omitted, a new one is created. Prefer passing the shared client from `main.py`. Note: Some parts of this monitor are incomplete; see TODO markers. """ if hafas is None: hafas = backend.HafasClient() keyB = KeyBindings() prefixBuffer = Buffer() prefixBuffer.text = "Haltestelle eingeben: " prefixBuffer.read_only = True userinputBuffer = Buffer() arrivalBuffer = Buffer() departureBuffer = Buffer() stop_event = threading.Event() app_state = "MONITOR" arrivalBuffer.text = "Ankünfte:\n" departureBuffer.text = "Abfahrten:\n" root_container = HSplit(children=[ VSplit(children=[ Window(content=BufferControl(buffer=prefixBuffer, focusable=False),width=22), Window(content=BufferControl(buffer=userinputBuffer, focusable=True)), Window(width=1, char='│', style="fg:#9D1D75"), HSplit(children=[ Window(content=BufferControl(buffer=arrivalBuffer, focusable=True)), Window(height=1, char='-', style="fg:#9D1D75"), Window(content=BufferControl(buffer=departureBuffer, focusable=True)), ]), ]), Window(height=1, char='-', style="bg:#9D1D75 fg:#FFFFFF"), ]) layout = Layout(root_container, focused_element=userinputBuffer) @keyB.add("enter") def handle_enter(event): global app_state user_input = userinputBuffer.text.strip() if not user_input: app_state = "MONITOR" return app_state = "RESULTS" results = hafas.getStationNames(user_input) if not results: arrivalBuffer.text = f"Keine Stationen gefunden für: {user_input}" departureBuffer.text = "" userinputBuffer.text = "" app_state = "MONITOR" return station_name = results[0][0] station_id = results[0][1] arrivals = hafas.getArrDep(station_id, arrdep="ARR", count=5) arrivalBuffer.text = ( f"Ankünfte für {station_name}:\n" + "\n".join(f" {arrival["departure_time_real"]} {arrival["line"]} <-- {arrival["name"]}" for arrival in arrivals) ) departures = hafas.getArrDep(station_id, arrdep="DEP", count=5) departureBuffer.text = ( f"Abfahrten für {station_name}:\n" + "\n".join(f" {departure["departure_time_real"]} {departure["line"]} --> {departure["name"]}" for departure in departures) ) userinputBuffer.text = "" @keyB.add("c-q") def exit_(event): stop_event.set() event.app.exit() app = Application(layout=layout, full_screen=True, key_bindings=keyB) try: app.run() except KeyboardInterrupt: pass finally: stop_event.set()