65 lines
1.9 KiB
Python
Executable File
65 lines
1.9 KiB
Python
Executable File
#!/usr/bin/env -S uv run --script
|
|
# /// script
|
|
# dependencies = [
|
|
# "nicegui==3.16.0",
|
|
# ]
|
|
# ///
|
|
|
|
from datetime import UTC
|
|
from datetime import datetime
|
|
|
|
from nicegui import events
|
|
from nicegui import ui
|
|
|
|
OPTIONS = {
|
|
"python": "Python",
|
|
"typescript": "TypeScript",
|
|
"rust": "Rust",
|
|
}
|
|
|
|
|
|
with ui.card().classes("w-140 max-w-full"):
|
|
ui.label("Select event mechanics").classes("text-xl font-semibold")
|
|
event_log = ui.log(max_lines=12).classes("w-full h-64")
|
|
|
|
def record(event_name: str, payload: object) -> None:
|
|
timestamp = datetime.now(UTC).astimezone().strftime("%H:%M:%S")
|
|
event_log.push(f"{timestamp} {event_name}: {payload!r}")
|
|
|
|
def handle_change(event: events.ValueChangeEventArguments) -> None:
|
|
record("on_change event.value", event.value)
|
|
|
|
def handle_model_update(event: events.GenericEventArguments) -> None:
|
|
record("js_handler -> handler event.args", event.args)
|
|
|
|
language = (
|
|
ui.select(
|
|
options=OPTIONS,
|
|
value="python",
|
|
label="Language",
|
|
on_change=handle_change,
|
|
with_input=True,
|
|
clearable=True,
|
|
)
|
|
.props("outlined options-dense")
|
|
.classes("w-full text-h6")
|
|
)
|
|
|
|
language.on("popup-show", lambda: record("popup-show", None), args=[])
|
|
language.on("popup-hide", lambda: record("popup-hide", None), args=[])
|
|
|
|
# This only fires when the value is changed from the browser side (not from the button)
|
|
language.on(
|
|
"update:model-value",
|
|
handler=handle_model_update,
|
|
js_handler="(...args) => emit(...args)",
|
|
)
|
|
|
|
with ui.row().classes("w-full justify-end"):
|
|
ui.button("Set Rust", on_click=lambda: language.set_value("rust"))
|
|
ui.button("Clear log", on_click=event_log.clear).props("flat")
|
|
|
|
|
|
if __name__ in {"__main__", "__mp_main__"}:
|
|
ui.run(port=8888, reload=True)
|