From 51f804debc8331acc08473c559ce8fafb99b2ba9 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sun, 10 May 2026 13:09:15 -0400 Subject: [PATCH] feat(ui): add batch operations to context composition panel --- src/gui_2.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/src/gui_2.py b/src/gui_2.py index bd8b533..209b72d 100644 --- a/src/gui_2.py +++ b/src/gui_2.py @@ -204,6 +204,7 @@ class App: self.node_editor_ctx = ed.create_editor(self.node_editor_config) self.ui_selected_ticket_id: Optional[str] = None self.ui_selected_tickets: set[str] = set() + self.ui_selected_context_files: set[str] = set() self.ui_new_ticket_priority: str = 'medium' self._autofocus_response_tab = False gui_cfg = self.config.get("gui", {}) @@ -2527,6 +2528,64 @@ class App: def _render_context_composition_panel(self) -> None: imgui.text("Context Composition") imgui.separator() + + # Batch Action Bar + imgui.text("Batch:") + imgui.same_line() + if imgui.button("Full##batch"): + for f in self.files: + f_path = f.path if hasattr(f, "path") else str(f) + if f_path in self.ui_selected_context_files: + f.force_full = True + f.auto_aggregate = False + if hasattr(f, "ast_signatures"): + f.ast_signatures = False + f.ast_definitions = False + imgui.same_line() + if imgui.button("Agg##batch"): + for f in self.files: + f_path = f.path if hasattr(f, "path") else str(f) + if f_path in self.ui_selected_context_files: + f.auto_aggregate = True + f.force_full = False + if hasattr(f, "ast_signatures"): + f.ast_signatures = False + f.ast_definitions = False + imgui.same_line() + if imgui.button("Sig##batch"): + for f in self.files: + f_path = f.path if hasattr(f, "path") else str(f) + if f_path in self.ui_selected_context_files: + if hasattr(f, "ast_signatures"): + f.ast_signatures = True + f.force_full = False + f.auto_aggregate = False + f.ast_definitions = False + imgui.same_line() + if imgui.button("Def##batch"): + for f in self.files: + f_path = f.path if hasattr(f, "path") else str(f) + if f_path in self.ui_selected_context_files: + if hasattr(f, "ast_definitions"): + f.ast_definitions = True + f.force_full = False + f.auto_aggregate = False + f.ast_signatures = False + imgui.same_line() + if imgui.button("Remove##batch"): + new_files = [] + for f in self.files: + f_path = f.path if hasattr(f, "path") else str(f) + if f_path not in self.ui_selected_context_files: + new_files.append(f) + self.files = new_files + self.ui_selected_context_files.clear() + imgui.same_line() + if imgui.button("Clear Selection"): + self.ui_selected_context_files.clear() + + imgui.dummy(imgui.ImVec2(0, 4)) + if imgui.begin_table("ctx_comp_table", 2, imgui.TableFlags_.resizable | imgui.TableFlags_.borders): imgui.table_setup_column("File", imgui.TableColumnFlags_.width_stretch) imgui.table_setup_column("Flags", imgui.TableColumnFlags_.width_fixed, 200) @@ -2534,7 +2593,19 @@ class App: for i, f_item in enumerate(self.files): imgui.table_next_row() imgui.table_set_column_index(0) - imgui.text(f_item.path if hasattr(f_item, "path") else str(f_item)) + + # Checkbox for selection + f_path = f_item.path if hasattr(f_item, "path") else str(f_item) + is_sel = f_path in self.ui_selected_context_files + changed_sel, is_sel = imgui.checkbox(f"##sel{i}", is_sel) + if changed_sel: + if is_sel: + self.ui_selected_context_files.add(f_path) + else: + self.ui_selected_context_files.discard(f_path) + imgui.same_line() + imgui.text(f_path) + imgui.table_set_column_index(1) if hasattr(f_item, "auto_aggregate"): changed_agg, f_item.auto_aggregate = imgui.checkbox(f"Agg##cc{i}", f_item.auto_aggregate)