diff --git a/bridges/gui_bridge.py b/bridges/gui_bridge.py index 3137770..d72aa96 100644 --- a/bridges/gui_bridge.py +++ b/bridges/gui_bridge.py @@ -19,10 +19,10 @@ import subprocess import sys import threading import tkinter as tk -from tkinter import filedialog, messagebox, scrolledtext +from tkinter import filedialog, messagebox, scrolledtext, simpledialog SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) -BRIDGE_PATH = os.path.join(SCRIPT_DIR, "s3_bridge.py") +BRIDGE_PATH = os.path.join(SCRIPT_DIR, "s3-bridge", "s3_bridge.py") class BridgeGUI(tk.Tk): @@ -74,6 +74,8 @@ class BridgeGUI(tk.Tk): tk.Button(self, text="Start", command=self.start_bridge, width=12).grid(row=5, column=0, columnspan=2, **pad) tk.Button(self, text="Stop", command=self.stop_bridge, width=12).grid(row=5, column=2, columnspan=2, **pad) + self.mark_btn = tk.Button(self, text="Add Mark", command=self.add_mark, width=12, state="disabled") + self.mark_btn.grid(row=5, column=4, **pad) # Row 6: Log view self.log_view = scrolledtext.ScrolledText(self, height=20, width=90, state="disabled") @@ -135,6 +137,7 @@ class BridgeGUI(tk.Tk): args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, text=True, bufsize=1, ) @@ -145,6 +148,7 @@ class BridgeGUI(tk.Tk): threading.Thread(target=self._reader_thread, daemon=True).start() self.status_var.set("Running...") self._append_log("== Bridge started ==\n") + self.mark_btn.configure(state="normal") def stop_bridge(self) -> None: if self.process and self.process.poll() is None: @@ -155,6 +159,7 @@ class BridgeGUI(tk.Tk): self.process.kill() self.status_var.set("Stopped") self._append_log("== Bridge stopped ==\n") + self.mark_btn.configure(state="disabled") def _reader_thread(self) -> None: if not self.process or not self.process.stdout: @@ -163,12 +168,28 @@ class BridgeGUI(tk.Tk): self.stdout_q.put(line) self.stdout_q.put("<>") + def add_mark(self) -> None: + if not self.process or not self.process.stdin or self.process.poll() is not None: + return + label = simpledialog.askstring("Mark", "Enter label for mark:", parent=self) + if label is None or label.strip() == "": + return + try: + # Mimic CLI behavior: send 'm' + Enter, then label + Enter + self.process.stdin.write("m\n") + self.process.stdin.write(label.strip() + "\n") + self.process.stdin.flush() + self._append_log(f"[GUI] Mark sent: {label.strip()}\n") + except Exception as e: + messagebox.showerror("Error", f"Failed to send mark: {e}") + def _poll_stdout(self) -> None: try: while True: line = self.stdout_q.get_nowait() if line == "<>": self.status_var.set("Stopped") + self.mark_btn.configure(state="disabled") break self._append_log(line) except queue.Empty: