From 78e47a13f9441990cc7a802bccbb9c70a2dd1a30 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Fri, 6 Mar 2026 17:38:08 -0500 Subject: [PATCH] feat(gui): Add link deletion and DAG cycle validation to Visual DAG --- src/gui_2.py | 29 +++++++++++++++++++++++++++++ temp_edit3.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ temp_edit4.py | 20 ++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 temp_edit3.py create mode 100644 temp_edit4.py diff --git a/src/gui_2.py b/src/gui_2.py index c586895..b9c36c7 100644 --- a/src/gui_2.py +++ b/src/gui_2.py @@ -572,6 +572,13 @@ class App: self._handle_mma_respond(approved=False, abort=True) imgui.close_current_popup() imgui.end_popup() + # Cycle Detected Popup + if imgui.begin_popup_modal("Cycle Detected!", None, imgui.WindowFlags_.always_auto_resize)[0]: + imgui.text_colored(imgui.ImVec4(1, 0.3, 0.3, 1), "The dependency graph contains a cycle!") + imgui.text("Please remove the circular dependency.") + if imgui.button("OK"): + imgui.close_current_popup() + imgui.end_popup() if self.show_script_output: if self._trigger_script_blink: self._trigger_script_blink = False @@ -1583,6 +1590,28 @@ class App: tid = str(t.get('id', '??')) for dep in t.get('depends_on', []): ed.link(abs(hash(dep + "_" + tid)), abs(hash(dep + "_out")), abs(hash(tid + "_in"))) + # Handle link deletion + if ed.begin_delete(): + deleted = ed.get_deleted_link() + if deleted: + link_id = deleted[0] + for t in self.active_tickets: + tid = str(t.get('id', '')) + for d in t.get('depends_on', []): + if abs(hash(d + "_" + tid)) == link_id: + t['depends_on'] = [dep for dep in t['depends_on'] if dep != d] + self._push_mma_state_update() + break + ed.end_delete() + # Validate DAG after any changes + try: + from src.dag_engine import TrackDAG + ticket_dicts = [{'id': str(t.get('id', '')), 'depends_on': t.get('depends_on', [])} for t in self.active_tickets] + temp_dag = TrackDAG(ticket_dicts) + if temp_dag.has_cycle(): + imgui.open_popup("Cycle Detected!") + except Exception: + pass ed.end() ed.set_current_editor(None) # 5. Add Ticket Form diff --git a/temp_edit3.py b/temp_edit3.py new file mode 100644 index 0000000..540fd3a --- /dev/null +++ b/temp_edit3.py @@ -0,0 +1,46 @@ +with open('src/gui_2.py', 'r', encoding='utf-8', newline='') as f: + content = f.read() + +old = ''' # Handle link deletion + if ed.begin_delete(): + deleted = ed.get_deleted_link() + if deleted: + link_id = deleted[0] + for t in self.active_tickets: + tid = str(t.get('id', '')) + for d in t.get('depends_on', []): + if abs(hash(d + "_" + tid)) == link_id: + t['depends_on'] = [dep for dep in t['depends_on'] if dep != d] + self._push_mma_state_update() + break + ed.end_delete() + ed.end()''' + +new = ''' # Handle link deletion + if ed.begin_delete(): + deleted = ed.get_deleted_link() + if deleted: + link_id = deleted[0] + for t in self.active_tickets: + tid = str(t.get('id', '')) + for d in t.get('depends_on', []): + if abs(hash(d + "_" + tid)) == link_id: + t['depends_on'] = [dep for dep in t['depends_on'] if dep != d] + self._push_mma_state_update() + break + ed.end_delete() + # Validate DAG after any changes + try: + from src.dag_engine import TrackDAG + ticket_dicts = [{'id': str(t.get('id', '')), 'depends_on': t.get('depends_on', [])} for t in self.active_tickets] + temp_dag = TrackDAG(ticket_dicts) + if temp_dag.has_cycle(): + imgui.open_popup("Cycle Detected!") + except Exception: + pass + ed.end()''' + +content = content.replace(old, new) +with open('src/gui_2.py', 'w', encoding='utf-8', newline='') as f: + f.write(content) +print('Done') diff --git a/temp_edit4.py b/temp_edit4.py new file mode 100644 index 0000000..5f56078 --- /dev/null +++ b/temp_edit4.py @@ -0,0 +1,20 @@ +with open('src/gui_2.py', 'r', encoding='utf-8', newline='') as f: + content = f.read() + +old = ''' imgui.end_popup() + if self.show_script_output:''' + +new = ''' imgui.end_popup() + # Cycle Detected Popup + if imgui.begin_popup_modal("Cycle Detected!", None, imgui.WindowFlags_.always_auto_resize)[0]: + imgui.text_colored(imgui.ImVec4(1, 0.3, 0.3, 1), "The dependency graph contains a cycle!") + imgui.text("Please remove the circular dependency.") + if imgui.button("OK"): + imgui.close_current_popup() + imgui.end_popup() + if self.show_script_output:''' + +content = content.replace(old, new) +with open('src/gui_2.py', 'w', encoding='utf-8', newline='') as f: + f.write(content) +print('Done')