import json import os import shlex from pathlib import Path from subprocess import PIPE, STDOUT, Popen import webview config_path = Path("launcher.json") try: with config_path.open("r") as f: config = json.load(f) except Exception: config = { "page": "init", "branch": "slow", } def custom_event(name, data): data = json.dumps({name: data}) js = f"var event = new CustomEvent('log', {{detail: {data}}}); window.dispatchEvent(event);" window.evaluate_js(js) class Api: def get_branch(self): return config["branch"] def set_branch(self, branch): config["branch"] = branch def get_page(self): return config["page"] def set_page(self, page): config["page"] = page def run(self, command, cwd=None): command = shlex.split(command) command[0] = os.path.normpath(command[0]) with Popen( command, stdout=PIPE, stderr=STDOUT, shell=True, bufsize=1, text=True, cwd=cwd, ) as p: for line in p.stdout: custom_event("log", line) window = webview.create_window("mower-ng launcher", "dist/index.html", js_api=Api()) webview.start() with config_path.open("w") as f: json.dump(config, f)