Private
Public Access
chore(conductor): Mark track 'Fix GUI Crashes in Tool Preset Manager and Discussion Hub' as complete
This commit is contained in:
+1
-1
@@ -268,5 +268,5 @@ This file tracks all major tracks for the project. Each track has its own detail
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
- [ ] **Track: Fix GUI Crashes in Tool Preset Manager and Discussion Hub**
|
- [x] **Track: Fix GUI Crashes in Tool Preset Manager and Discussion Hub**
|
||||||
*Link: [./tracks/gui_crash_fixes_20260531/](./tracks/gui_crash_fixes_20260531/)*
|
*Link: [./tracks/gui_crash_fixes_20260531/](./tracks/gui_crash_fixes_20260531/)*
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
# Implementation Plan
|
# Implementation Plan
|
||||||
|
|
||||||
## Phase 1: Fix Tool Preset Manager Crashes
|
## Phase 1: Fix Tool Preset Manager Crashes
|
||||||
- [ ] Task: Investigate `render_tool_preset_manager_content` in `src/gui_2.py` to identify the missing `current_cat_tools` initialization or scope.
|
- [x] Task: Investigate `render_tool_preset_manager_content` in `src/gui_2.py` to identify the missing `current_cat_tools` initialization or scope.
|
||||||
- [ ] Task: Fix the `NameError` and ensure correct ImGui child window scoping (`EndChild` vs `End`) in the Tool Preset Manager.
|
- [x] Task: Fix the `NameError` and ensure correct ImGui child window scoping (`EndChild` vs `End`) in the Tool Preset Manager.
|
||||||
- [ ] Task: Conductor - User Manual Verification 'Fix Tool Preset Manager Crashes' (Protocol in workflow.md)
|
- [x] Task: Conductor - User Manual Verification 'Fix Tool Preset Manager Crashes' (Protocol in workflow.md)
|
||||||
|
|
||||||
## Phase 2: Fix Discussion Hub Crashes
|
## Phase 2: Fix Discussion Hub Crashes
|
||||||
- [ ] Task: Investigate `render_discussion_entries` in `src/gui_2.py` to address the `IndexError` when deleting a discussion entry during rendering.
|
- [x] Task: Investigate `render_discussion_entries` in `src/gui_2.py` to address the `IndexError` when deleting a discussion entry during rendering.
|
||||||
- [ ] Task: Fix the `IndexError` (e.g. by deferring deletion or copying the list) and associated ImGui scoping errors (`PopID() too many times!`).
|
- [x] Task: Fix the `IndexError` (e.g. by deferring deletion or copying the list) and associated ImGui scoping errors (`PopID() too many times!`).
|
||||||
- [ ] Task: Conductor - User Manual Verification 'Fix Discussion Hub Crashes' (Protocol in workflow.md)
|
- [x] Task: Conductor - User Manual Verification 'Fix Discussion Hub Crashes' (Protocol in workflow.md)
|
||||||
|
|
||||||
## Phase 3: Global Verification
|
## Phase 3: Global Verification
|
||||||
- [ ] Task: Run `python scripts/check_imgui_scopes.py` to statically verify all ImGui scopes are correct across the codebase.
|
- [x] Task: Run `python scripts/check_imgui_scopes.py` to statically verify all ImGui scopes are correct across the codebase.
|
||||||
- [ ] Task: Run automated test suite to ensure no regressions were introduced.
|
- [x] Task: Run automated test suite to ensure no regressions were introduced.
|
||||||
- [ ] Task: Conductor - User Manual Verification 'Global Verification' (Protocol in workflow.md)
|
- [x] Task: Conductor - User Manual Verification 'Global Verification' (Protocol in workflow.md)
|
||||||
+31
-31
@@ -2310,32 +2310,30 @@ def render_tool_preset_manager_content(app: App, is_embedded: bool = False) -> N
|
|||||||
f_idx = cat_opts.index(app.ui_tool_filter_category) if app.ui_tool_filter_category in cat_opts else 0
|
f_idx = cat_opts.index(app.ui_tool_filter_category) if app.ui_tool_filter_category in cat_opts else 0
|
||||||
imgui.set_next_item_width(200); ch_cat, next_f_idx = imgui.combo("##tp_filter", f_idx, cat_opts)
|
imgui.set_next_item_width(200); ch_cat, next_f_idx = imgui.combo("##tp_filter", f_idx, cat_opts)
|
||||||
if ch_cat: app.ui_tool_filter_category = cat_opts[next_f_idx]
|
if ch_cat: app.ui_tool_filter_category = cat_opts[next_f_idx]
|
||||||
imgui.begin_child("tp_scroll", imgui.ImVec2(0, h1), True)
|
with imscope.child("tp_scroll", 0, h1, True):
|
||||||
if True:
|
|
||||||
for cat_name, default_tools in models.DEFAULT_TOOL_CATEGORIES.items():
|
for cat_name, default_tools in models.DEFAULT_TOOL_CATEGORIES.items():
|
||||||
if app.ui_tool_filter_category != "All" and app.ui_tool_filter_category != cat_name: continue
|
if app.ui_tool_filter_category != "All" and app.ui_tool_filter_category != cat_name: continue
|
||||||
if imgui.tree_node(cat_name):
|
if imgui.tree_node(cat_name):
|
||||||
if cat_name not in app._editing_tool_preset_categories: app._editing_tool_preset_categories[cat_name] = []
|
if cat_name not in app._editing_tool_preset_categories: app._editing_tool_preset_categories[cat_name] = []
|
||||||
curr_cat_tools = app._editing_tool_preset_categories[cat_name]
|
curr_cat_tools = app._editing_tool_preset_categories[cat_name]
|
||||||
if imgui.begin_table(f"tt_{cat_name}", 2, imgui.TableFlags_.borders_inner_v):
|
with imscope.table(f"tt_{cat_name}", 2, imgui.TableFlags_.borders_inner_v) as opened_table:
|
||||||
imgui.table_setup_column("Tool", imgui.TableColumnFlags_.width_fixed, 250); imgui.table_setup_column("Ctrls", imgui.TableColumnFlags_.width_stretch)
|
if opened_table:
|
||||||
for tool_name in default_tools:
|
imgui.table_setup_column("Tool", imgui.TableColumnFlags_.width_fixed, 250); imgui.table_setup_column("Ctrls", imgui.TableColumnFlags_.width_stretch)
|
||||||
tool = next((t for t in curr_cat_tools if t.name == tool_name), None)
|
for tool_name in default_tools:
|
||||||
mode = "disabled" if tool is None else tool.approval
|
tool = next((t for t in curr_cat_tools if t.name == tool_name), None)
|
||||||
imgui.table_next_row(); imgui.table_next_column(); imgui.text(tool_name); imgui.table_next_column()
|
mode = "disabled" if tool is None else tool.approval
|
||||||
if imgui.radio_button(f"Off##{cat_name}_{tool_name}", mode == "disabled"):
|
imgui.table_next_row(); imgui.table_next_column(); imgui.text(tool_name); imgui.table_next_column()
|
||||||
if tool: curr_cat_tools.remove(tool)
|
if imgui.radio_button(f"Off##{cat_name}_{tool_name}", mode == "disabled"):
|
||||||
imgui.same_line();
|
if tool: curr_cat_tools.remove(tool)
|
||||||
if imgui.radio_button(f"Auto##{cat_name}_{tool_name}", mode == "auto"):
|
imgui.same_line();
|
||||||
if not tool: tool = models.Tool(name=tool_name, approval="auto"); current_cat_tools.append(tool)
|
if imgui.radio_button(f"Auto##{cat_name}_{tool_name}", mode == "auto"):
|
||||||
else: tool.approval = "auto"
|
if not tool: tool = models.Tool(name=tool_name, approval="auto"); curr_cat_tools.append(tool)
|
||||||
imgui.same_line();
|
else: tool.approval = "auto"
|
||||||
if imgui.radio_button(f"Ask##{cat_name}_{tool_name}", mode == "ask"):
|
imgui.same_line();
|
||||||
if not tool: tool = models.Tool(name=tool_name, approval="ask"); current_cat_tools.append(tool)
|
if imgui.radio_button(f"Ask##{cat_name}_{tool_name}", mode == "ask"):
|
||||||
else: tool.approval = "ask"
|
if not tool: tool = models.Tool(name=tool_name, approval="ask"); curr_cat_tools.append(tool)
|
||||||
imgui.end_table()
|
else: tool.approval = "ask"
|
||||||
imgui.tree_pop()
|
imgui.tree_pop()
|
||||||
imgui.end_child()
|
|
||||||
if app._bias_list_open:
|
if app._bias_list_open:
|
||||||
imgui.button("###tool_splitter", imgui.ImVec2(-1, 4))
|
imgui.button("###tool_splitter", imgui.ImVec2(-1, 4))
|
||||||
if imgui.is_item_active(): app._tool_split_v = max(0.1, min(0.9, app._tool_split_v + imgui.get_io().mouse_delta.y / rem_y))
|
if imgui.is_item_active(): app._tool_split_v = max(0.1, min(0.9, app._tool_split_v + imgui.get_io().mouse_delta.y / rem_y))
|
||||||
@@ -3449,8 +3447,10 @@ def render_discussion_entry(app: App, entry: dict, index: int) -> None:
|
|||||||
if collapsed:
|
if collapsed:
|
||||||
imgui.same_line()
|
imgui.same_line()
|
||||||
if imgui.button("Ins"): app.disc_entries.insert(index, {"role": "User", "content": "", "collapsed": True, "ts": project_manager.now_ts()})
|
if imgui.button("Ins"): app.disc_entries.insert(index, {"role": "User", "content": "", "collapsed": True, "ts": project_manager.now_ts()})
|
||||||
imgui.same_line()
|
imgui.same_line();
|
||||||
if imgui.button("Del"): app.disc_entries.pop(index); return
|
if imgui.button("Del"):
|
||||||
|
if entry in app.disc_entries: app.disc_entries.remove(entry)
|
||||||
|
return
|
||||||
imgui.same_line()
|
imgui.same_line()
|
||||||
if imgui.button("Branch"): app._branch_discussion(index)
|
if imgui.button("Branch"): app._branch_discussion(index)
|
||||||
imgui.same_line(); preview = entry["content"].replace("\n", " ")[:60]
|
imgui.same_line(); preview = entry["content"].replace("\n", " ")[:60]
|
||||||
@@ -3793,7 +3793,7 @@ def render_takes_panel(app: App) -> None:
|
|||||||
|
|
||||||
def render_discussion_entries(app: App) -> None:
|
def render_discussion_entries(app: App) -> None:
|
||||||
with imscope.child("disc_scroll"):
|
with imscope.child("disc_scroll"):
|
||||||
display_entries = app.disc_entries
|
display_entries = list(app.disc_entries)
|
||||||
if app.ui_focus_agent:
|
if app.ui_focus_agent:
|
||||||
tier_usage = app.mma_tier_usage.get(app.ui_focus_agent)
|
tier_usage = app.mma_tier_usage.get(app.ui_focus_agent)
|
||||||
if tier_usage:
|
if tier_usage:
|
||||||
@@ -3802,7 +3802,8 @@ def render_discussion_entries(app: App) -> None:
|
|||||||
clipper = imgui.ListClipper(); clipper.begin(len(display_entries))
|
clipper = imgui.ListClipper(); clipper.begin(len(display_entries))
|
||||||
while clipper.step():
|
while clipper.step():
|
||||||
for i in range(clipper.display_start, clipper.display_end):
|
for i in range(clipper.display_start, clipper.display_end):
|
||||||
render_discussion_entry(app, display_entries[i], i)
|
if i < len(display_entries):
|
||||||
|
render_discussion_entry(app, display_entries[i], i)
|
||||||
if app._scroll_disc_to_bottom: imgui.set_scroll_here_y(1.0); app._scroll_disc_to_bottom = False
|
if app._scroll_disc_to_bottom: imgui.set_scroll_here_y(1.0); app._scroll_disc_to_bottom = False
|
||||||
|
|
||||||
def render_discussion_entry_controls(app: App) -> None:
|
def render_discussion_entry_controls(app: App) -> None:
|
||||||
@@ -3929,11 +3930,10 @@ def render_discussion_selector(app: App) -> None:
|
|||||||
return
|
return
|
||||||
|
|
||||||
def render_discussion_tab(app: App) -> None:
|
def render_discussion_tab(app: App) -> None:
|
||||||
imgui.begin_child("HistoryChild", size=(0, -app.ui_discussion_split_h))
|
with imscope.child("HistoryChild", size_x=0, size_y=-app.ui_discussion_split_h):
|
||||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_discussion_panel")
|
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_discussion_panel")
|
||||||
render_discussion_panel(app)
|
render_discussion_panel(app)
|
||||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_discussion_panel")
|
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_discussion_panel")
|
||||||
imgui.end_child()
|
|
||||||
imgui.button("###discussion_splitter", imgui.ImVec2(-1, 4))
|
imgui.button("###discussion_splitter", imgui.ImVec2(-1, 4))
|
||||||
if imgui.is_item_active(): app.ui_discussion_split_h = max(150.0, min(imgui.get_window_height() - 150.0, app.ui_discussion_split_h - imgui.get_io().mouse_delta.y))
|
if imgui.is_item_active(): app.ui_discussion_split_h = max(150.0, min(imgui.get_window_height() - 150.0, app.ui_discussion_split_h - imgui.get_io().mouse_delta.y))
|
||||||
imgui.push_style_var(imgui.StyleVar_.item_spacing, imgui.ImVec2(10, 4))
|
imgui.push_style_var(imgui.StyleVar_.item_spacing, imgui.ImVec2(10, 4))
|
||||||
@@ -5032,10 +5032,10 @@ def render_tier_stream_panel(app: App, tier_key: str, stream_key: str | None) ->
|
|||||||
if len(content) != app._tier_stream_last_len.get(stream_key, -1):
|
if len(content) != app._tier_stream_last_len.get(stream_key, -1):
|
||||||
imgui.set_scroll_here_y(1.0)
|
imgui.set_scroll_here_y(1.0)
|
||||||
app._tier_stream_last_len[stream_key] = len(content)
|
app._tier_stream_last_len[stream_key] = len(content)
|
||||||
imgui.end_child()
|
|
||||||
except (TypeError, AttributeError):
|
except (TypeError, AttributeError):
|
||||||
imgui.end_child()
|
|
||||||
pass
|
pass
|
||||||
|
finally:
|
||||||
|
imgui.end_child()
|
||||||
else:
|
else:
|
||||||
tier3_keys = [k for k in app.mma_streams if "Tier 3" in k]
|
tier3_keys = [k for k in app.mma_streams if "Tier 3" in k]
|
||||||
if not tier3_keys:
|
if not tier3_keys:
|
||||||
|
|||||||
Reference in New Issue
Block a user