feat(hot-reload): Final style polish and gap fix
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
import sys
|
||||
import re
|
||||
|
||||
def fix_gaps():
|
||||
file_path = "src/gui_2.py"
|
||||
with open(file_path, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
# Replace 3+ newlines with 2 newlines (one empty line)
|
||||
# Using \r\n for Windows support if needed, but \n is standard for Python reads
|
||||
content = re.sub(r"\n\n\n+", "\n\n", content)
|
||||
|
||||
# Specific fix for regions: ensure no extra space after region start or before region end
|
||||
content = re.sub(r"(#region: .*)\n\n+", r"\1\n", content)
|
||||
content = re.sub(r"\n\n+(#endregion: .*)", r"\n\1", content)
|
||||
|
||||
with open(file_path, "w", encoding="utf-8") as f:
|
||||
f.write(content)
|
||||
print("Whitespace gaps fixed.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
fix_gaps()
|
||||
-204
@@ -630,12 +630,8 @@ class App:
|
||||
f.write(data)
|
||||
# ---------------------------------------------------------------- helpers
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- gui
|
||||
|
||||
|
||||
|
||||
|
||||
def _gui_func(self) -> None:
|
||||
io = imgui.get_io()
|
||||
if io.key_ctrl and io.key_alt and io.keys_down[ord('R')]:
|
||||
@@ -673,7 +669,6 @@ class App:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_gui_func")
|
||||
return
|
||||
|
||||
|
||||
def _render_window_if_open(self, name: str, render_func: Callable[[], None], flag_condition: bool = True) -> None:
|
||||
"""Helper to render a window only if its toggle is active."""
|
||||
if not flag_condition or not self.show_windows.get(name, False): return
|
||||
@@ -681,7 +676,6 @@ class App:
|
||||
self.show_windows[name] = bool(opened)
|
||||
if exp: render_func()
|
||||
|
||||
|
||||
def _show_menus(self) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_window_controls.py:test_gui_window_controls_minimize_maximize_close]
|
||||
@@ -785,7 +779,6 @@ class App:
|
||||
imgui.pop_style_color()
|
||||
imgui.pop_style_color()
|
||||
|
||||
|
||||
def _handle_history_logic(self) -> None:
|
||||
"""
|
||||
|
||||
@@ -846,20 +839,13 @@ class App:
|
||||
sys.stderr.flush()
|
||||
|
||||
|
||||
|
||||
#region: Diangostics & Analytics
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endregion: Diangostics & Analytics
|
||||
|
||||
#region: Logging
|
||||
|
||||
|
||||
def cb_load_prior_log(self, path: Optional[str] = None) -> None:
|
||||
if path is None:
|
||||
root = hide_tk_root()
|
||||
@@ -867,16 +853,9 @@ class App:
|
||||
root.destroy()
|
||||
if path:
|
||||
self.controller.cb_load_prior_log(path)
|
||||
|
||||
#endregion: Logging
|
||||
|
||||
#region: Project Management
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def _set_external_editor_default(self, editor_name: str) -> None:
|
||||
from src import models
|
||||
if "tools" not in self.config: self.config["tools"] = {}
|
||||
@@ -911,34 +890,13 @@ class App:
|
||||
paths.reset_resolved()
|
||||
self.init_state()
|
||||
self.ai_status = 'paths applied and session reset'
|
||||
|
||||
#endregion: Project Management
|
||||
|
||||
#region: AI Settings
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endregion: AI Settings
|
||||
|
||||
#region: Context Management
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def _populate_auto_slices(self, f_item: models.FileItem) -> None:
|
||||
"""
|
||||
[C: tests/test_auto_slices.py:test_populate_auto_slices_basic]
|
||||
@@ -973,10 +931,6 @@ class App:
|
||||
slice_data['comment'] = name
|
||||
f_item.custom_slices.append(slice_data)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def _update_context_file_stats(self) -> tuple[int, int]:
|
||||
if not hasattr(self, '_file_stats_cache'): self._file_stats_cache = {}
|
||||
if not hasattr(self, '_file_stats_queue'): self._file_stats_queue = []
|
||||
@@ -1006,41 +960,15 @@ class App:
|
||||
|
||||
threading.Thread(target=_stats_worker, daemon=True).start()
|
||||
return total_lines, total_ast
|
||||
|
||||
#endregion: Context Management
|
||||
|
||||
#region: Discussions
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endregion: Discussions
|
||||
|
||||
#region: Operations Monitor
|
||||
|
||||
|
||||
|
||||
|
||||
#endregion: Operations Monitor
|
||||
|
||||
#region: Misc Tools
|
||||
|
||||
|
||||
|
||||
def _close_vscode_diff(self) -> None:
|
||||
if hasattr(self, '_vscode_diff_process') and self._vscode_diff_process:
|
||||
try:
|
||||
@@ -1049,7 +977,6 @@ class App:
|
||||
pass
|
||||
self._vscode_diff_process = None
|
||||
|
||||
|
||||
def _apply_pending_patch(self) -> None:
|
||||
if not self._pending_patch_text:
|
||||
self._patch_error_message = "No patch to apply"
|
||||
@@ -1093,18 +1020,12 @@ class App:
|
||||
self._vscode_diff_process = result
|
||||
except Exception as e:
|
||||
self._patch_error_message = str(e)
|
||||
|
||||
|
||||
|
||||
#endregion: Misc Tools
|
||||
|
||||
#region: Sanity Tests
|
||||
|
||||
|
||||
#endregion: Sanity Tests
|
||||
|
||||
#region: MMA
|
||||
|
||||
def _reorder_ticket(self, src_idx: int, dst_idx: int) -> None:
|
||||
"""
|
||||
[C: tests/test_ticket_queue.py:TestReorder.test_reorder_ticket_invalid, tests/test_ticket_queue.py:TestReorder.test_reorder_ticket_valid]
|
||||
@@ -1127,22 +1048,6 @@ class App:
|
||||
self.active_tickets = new_tickets
|
||||
self._push_mma_state_update()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def request_patch_from_tier4(self, error: str, file_context: str) -> None:
|
||||
try:
|
||||
from src import ai_client
|
||||
@@ -1230,7 +1135,6 @@ class App:
|
||||
t['status'] = 'todo'
|
||||
changed = True
|
||||
self._push_mma_state_update()
|
||||
|
||||
#endregion: MMA
|
||||
|
||||
def main() -> None:
|
||||
@@ -1240,10 +1144,7 @@ def main() -> None:
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
|
||||
#region: Diagnostics & Analytics
|
||||
|
||||
def render_usage_analytics_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_usage_analytics_panel")
|
||||
render_token_budget_panel(app)
|
||||
@@ -1269,7 +1170,6 @@ def render_usage_analytics_panel(app: App) -> None:
|
||||
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_usage_analytics_panel")
|
||||
|
||||
|
||||
def render_diagnostics_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_diagnostics_panel")
|
||||
with imscope.window("Diagnostics", app.show_windows.get("Diagnostics", False)) as (exp, opened):
|
||||
@@ -1374,12 +1274,9 @@ def render_diagnostics_panel(app: App) -> None:
|
||||
imgui.end_table()
|
||||
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_diagnostics_panel")
|
||||
|
||||
|
||||
#endregion: Diagnostics & Analytics
|
||||
|
||||
#region: Logging
|
||||
|
||||
def render_log_management(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_log_management_ui.py:test_render_log_management_logic]
|
||||
@@ -1453,24 +1350,18 @@ def render_log_management(app: App) -> None:
|
||||
imgui.end_table()
|
||||
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_log_management")
|
||||
|
||||
|
||||
#endregion: Logging
|
||||
|
||||
#region: Project Management
|
||||
|
||||
def render_project_settings_hub(app: App) -> None:
|
||||
with imscope.tab_bar('context_hub_tabs'):
|
||||
with imscope.tab_item('Projects') as (exp, _):
|
||||
if exp: render_projects_panel(app)
|
||||
with imscope.tab_item('Paths') as (exp, _):
|
||||
if exp: render_paths_panel(app)
|
||||
|
||||
|
||||
#endregion: Project Management
|
||||
|
||||
#region: AI Settings
|
||||
|
||||
def render_ai_settings_hub(app: App) -> None:
|
||||
render_persona_selector_panel(app)
|
||||
if imgui.collapsing_header("Provider & Model"): render_provider_panel(app)
|
||||
@@ -1478,7 +1369,6 @@ def render_ai_settings_hub(app: App) -> None:
|
||||
if imgui.collapsing_header("RAG Settings"): render_rag_panel(app)
|
||||
render_agent_tools_panel(app)
|
||||
|
||||
|
||||
def render_preset_manager_content(app: App, is_embedded: bool = False) -> None:
|
||||
avail = imgui.get_content_region_avail()
|
||||
if not hasattr(app, "_prompt_md_preview"): app._prompt_md_preview = False
|
||||
@@ -1568,7 +1458,6 @@ def render_preset_manager_content(app: App, is_embedded: bool = False) -> None:
|
||||
if imgui.button("Close##p", imgui.ImVec2(100, 0)): app.show_preset_manager_window = False
|
||||
imgui.end_table()
|
||||
|
||||
|
||||
def render_preset_manager_window(app: App, is_embedded: bool = False) -> None:
|
||||
if not app.show_preset_manager_window and not is_embedded: return
|
||||
if not is_embedded:
|
||||
@@ -1579,7 +1468,6 @@ def render_preset_manager_window(app: App, is_embedded: bool = False) -> None:
|
||||
else:
|
||||
render_preset_manager_content(app, is_embedded=is_embedded)
|
||||
|
||||
|
||||
def render_tool_preset_manager_content(app: App, is_embedded: bool = False) -> None:
|
||||
avail = imgui.get_content_region_avail()
|
||||
if not hasattr(app, "_tool_split_v"): app._tool_split_v = 0.4
|
||||
@@ -1761,7 +1649,6 @@ def render_tool_preset_manager_content(app: App, is_embedded: bool = False) -> N
|
||||
if imgui.button("Close##tp", imgui.ImVec2(100, 0)): app.show_tool_preset_manager_window = False
|
||||
imgui.end_table()
|
||||
|
||||
|
||||
def render_tool_preset_manager_window(app: App, is_embedded: bool = False) -> None:
|
||||
if not app.show_tool_preset_manager_window and not is_embedded: return
|
||||
if not is_embedded:
|
||||
@@ -1772,7 +1659,6 @@ def render_tool_preset_manager_window(app: App, is_embedded: bool = False) -> No
|
||||
else:
|
||||
render_preset_manager_content(app, is_embedded=is_embedded)
|
||||
|
||||
|
||||
def render_persona_editor_window(app: App, is_embedded: bool = False) -> None:
|
||||
if not app.show_persona_editor_window and not is_embedded: return
|
||||
if not is_embedded:
|
||||
@@ -1944,12 +1830,9 @@ def render_persona_editor_window(app: App, is_embedded: bool = False) -> None:
|
||||
|
||||
if not is_embedded:
|
||||
imgui.end()
|
||||
|
||||
|
||||
#endregion: AI Settings
|
||||
|
||||
#region: Context Management
|
||||
|
||||
def render_files_and_media(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_fast_render.py:test_render_files_and_media_fast]
|
||||
@@ -2059,7 +1942,6 @@ def render_files_and_media(app: App) -> None:
|
||||
if p not in app.screenshots: app.screenshots.append(p)
|
||||
return
|
||||
|
||||
|
||||
def render_files_panel(app: App, height_override: float = 0) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_files_panel")
|
||||
imgui.text("Paths")
|
||||
@@ -2140,7 +2022,6 @@ def render_files_panel(app: App, height_override: float = 0) -> None:
|
||||
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_files_panel")
|
||||
|
||||
|
||||
def render_screenshots_panel(app: App, height_override: float = 0) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_screenshots_panel")
|
||||
imgui.text("Paths"); imgui.same_line(); imgui.text("| Base Dir:"); imgui.same_line();
|
||||
@@ -2175,7 +2056,6 @@ def render_screenshots_panel(app: App, height_override: float = 0) -> None:
|
||||
if p not in app.screenshots: app.screenshots.append(p)
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_screenshots_panel")
|
||||
|
||||
|
||||
def render_context_batch_actions(app: App, total_lines: int, total_ast: int) -> None:
|
||||
imgui.text("Batch:")
|
||||
for mode in ["full", "summary", "skeleton", "outline", "masked", "none"]:
|
||||
@@ -2212,7 +2092,6 @@ def render_context_batch_actions(app: App, total_lines: int, total_ast: int) ->
|
||||
imgui.same_line()
|
||||
imgui.text(f" | Total: {len(app.context_files)} files, {total_lines} lines, {total_ast} AST elements")
|
||||
|
||||
|
||||
def render_add_context_files_modal(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_auto_slices.py:test_add_selected_triggers_auto_slices]
|
||||
@@ -2252,12 +2131,9 @@ def render_add_context_files_modal(app: App) -> None:
|
||||
app._ui_picker_selected.clear()
|
||||
imgui.close_current_popup()
|
||||
imgui.end_popup()
|
||||
|
||||
|
||||
#endregion: Context Management
|
||||
|
||||
#region: Discussions
|
||||
|
||||
def render_discussion_hub(app: App) -> None:
|
||||
with imscope.tab_bar("discussion_hub_tabs"):
|
||||
with imscope.tab_item("Discussion") as (exp, opened):
|
||||
@@ -2270,7 +2146,6 @@ def render_discussion_hub(app: App) -> None:
|
||||
if exp: render_takes_panel(app)
|
||||
return
|
||||
|
||||
|
||||
def render_discussion_entry(app: App, entry: dict, index: int) -> None:
|
||||
with imscope.id(f"disc_{index}"):
|
||||
collapsed, read_mode = entry.get("collapsed", False), entry.get("read_mode", False)
|
||||
@@ -2316,7 +2191,6 @@ def render_discussion_entry(app: App, entry: dict, index: int) -> None:
|
||||
if not (bool(thinking_segments) and not has_content): ch, entry["content"] = imgui.input_text_multiline("##content", entry["content"], imgui.ImVec2(-1, 150))
|
||||
imgui.separator()
|
||||
|
||||
|
||||
def render_discussion_entry_read_mode(app: App, entry: dict, index: int) -> None:
|
||||
content = entry["content"]
|
||||
if not content.strip(): return
|
||||
@@ -2362,12 +2236,9 @@ def render_discussion_entry_read_mode(app: App, entry: dict, index: int) -> None
|
||||
with theme.ai_text_style():
|
||||
markdown_helper.render(after, context_id=f'disc_{index}_a')
|
||||
if app.ui_word_wrap: imgui.pop_text_wrap_pos()
|
||||
|
||||
|
||||
#endregion: Discussions
|
||||
|
||||
#region: Operations Monitor
|
||||
|
||||
def render_operations_hub(app: App) -> None:
|
||||
imgui.push_style_var(imgui.StyleVar_.item_spacing, imgui.ImVec2(10, 4))
|
||||
ch1, app.ui_separate_tool_calls_panel = imgui.checkbox("Pop Out Tool Calls", app.ui_separate_tool_calls_panel)
|
||||
@@ -2408,7 +2279,6 @@ def render_operations_hub(app: App) -> None:
|
||||
ch_combo, new_idx = imgui.combo(t, idx, profiles)
|
||||
if ch_combo: app.controller.ui_tier_layout_bindings[t] = profiles[new_idx]
|
||||
|
||||
|
||||
def render_message_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_message_panel")
|
||||
# LIVE indicator
|
||||
@@ -2448,7 +2318,6 @@ def render_message_panel(app: App) -> None:
|
||||
if imgui.button("Reset"): app._handle_reset_session()
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_message_panel")
|
||||
|
||||
|
||||
def render_response_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_response_panel")
|
||||
if app._trigger_blink:
|
||||
@@ -2489,7 +2358,6 @@ def render_response_panel(app: App) -> None:
|
||||
app.disc_entries.append(entry)
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_response_panel")
|
||||
|
||||
|
||||
def render_tool_calls_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_tool_calls_panel")
|
||||
imgui.text("Tool call history")
|
||||
@@ -2555,7 +2423,6 @@ def render_tool_calls_panel(app: App) -> None:
|
||||
app._scroll_tool_calls_to_bottom = False
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tool_calls_panel")
|
||||
|
||||
|
||||
def render_external_tools_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_external_tools_panel")
|
||||
if imgui.button("Refresh External MCPs"): app.event_queue.put("refresh_external_mcps", None)
|
||||
@@ -2599,12 +2466,9 @@ def render_external_tools_panel(app: App) -> None:
|
||||
imgui.text(tinfo.get('description', ''))
|
||||
imgui.end_table()
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_external_tools_panel")
|
||||
|
||||
|
||||
#endregion: Operations Monitor
|
||||
|
||||
#region: Misc Tools
|
||||
|
||||
def render_text_viewer(app: App, label: str, content: str, text_type: str = 'text', force_open: bool = False) -> None:
|
||||
if imgui.button("[+]##" + str(id(content))) or force_open:
|
||||
app.text_viewer_type = text_type
|
||||
@@ -2612,7 +2476,6 @@ def render_text_viewer(app: App, label: str, content: str, text_type: str = 'tex
|
||||
app.text_viewer_title = label
|
||||
app.text_viewer_content = content
|
||||
|
||||
|
||||
def render_heavy_text(app: App, label: str, content: str, id_suffix: str = "") -> None:
|
||||
imgui.text_colored(C_LBL, f"{label}:")
|
||||
imgui.same_line()
|
||||
@@ -2648,7 +2511,6 @@ def render_heavy_text(app: App, label: str, content: str, id_suffix: str = "") -
|
||||
else:
|
||||
imgui.text(content)
|
||||
|
||||
|
||||
def render_thinking_trace(app: App, segments: list[dict], entry_index: int, is_standalone: bool = False) -> None:
|
||||
if not segments:
|
||||
return
|
||||
@@ -2678,7 +2540,6 @@ def render_thinking_trace(app: App, segments: list[dict], entry_index: int, is_s
|
||||
|
||||
imgui.unindent()
|
||||
|
||||
|
||||
def render_selectable_label(app: App, label: str, value: str, width: float = 0.0, multiline: bool = False, height: float = 0.0, color: Optional[imgui.ImVec4] = None) -> None:
|
||||
with imscope.id(label + str(hash(value))):
|
||||
with imscope.style_color(imgui.Col_.frame_bg, vec4(0, 0, 0, 0)), \
|
||||
@@ -2700,12 +2561,9 @@ def render_selectable_label(app: App, label: str, value: str, width: float = 0.0
|
||||
else:
|
||||
if width > 0: imgui.set_next_item_width(width)
|
||||
imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only)
|
||||
|
||||
|
||||
#endregion: Misc Tools
|
||||
|
||||
#region: MMA
|
||||
|
||||
def render_mma_dashboard(app: App) -> None:
|
||||
"""
|
||||
Main MMA dashboard interface.
|
||||
@@ -2739,7 +2597,6 @@ def render_mma_dashboard(app: App) -> None:
|
||||
render_mma_agent_streams(app)
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_mma_dashboard")
|
||||
|
||||
|
||||
def render_mma_modals(app: App) -> None:
|
||||
"""Renders all MMA-specific approval and info modals."""
|
||||
is_nerv = theme.is_nerv_active()
|
||||
@@ -2816,7 +2673,6 @@ def render_mma_modals(app: App) -> None:
|
||||
if imgui.button("OK"): imgui.close_current_popup()
|
||||
imgui.end_popup()
|
||||
|
||||
|
||||
def render_mma_track_summary(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
|
||||
@@ -2848,7 +2704,6 @@ def render_mma_track_summary(app: App) -> None:
|
||||
eta_mins = (app._avg_ticket_time * remaining) / 60.0
|
||||
imgui.text_colored(C_LBL, "ETA:"); imgui.same_line(); imgui.text_colored(C_VAL, f"~{int(eta_mins)}m ({remaining} tickets remaining)")
|
||||
|
||||
|
||||
def render_mma_epic_planner(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
|
||||
@@ -2857,7 +2712,6 @@ def render_mma_epic_planner(app: App) -> None:
|
||||
_, app.ui_epic_input = imgui.input_text_multiline('##epic_input', app.ui_epic_input, imgui.ImVec2(-1, 80))
|
||||
if imgui.button('Plan Epic (Tier 1)', imgui.ImVec2(-1, 0)): app._cb_plan_epic()
|
||||
|
||||
|
||||
def render_mma_conductor_setup(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
|
||||
@@ -2865,7 +2719,6 @@ def render_mma_conductor_setup(app: App) -> None:
|
||||
if imgui.button("Run Setup Scan"): app._cb_run_conductor_setup()
|
||||
if app.ui_conductor_setup_summary: imgui.input_text_multiline("##setup_summary", app.ui_conductor_setup_summary, imgui.ImVec2(-1, 120), imgui.InputTextFlags_.read_only)
|
||||
|
||||
|
||||
def render_mma_track_browser(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
|
||||
@@ -2895,7 +2748,6 @@ def render_mma_track_browser(app: App) -> None:
|
||||
app._cb_create_track(app.ui_new_track_name, app.ui_new_track_desc, app.ui_new_track_type)
|
||||
app.ui_new_track_name = ""; app.ui_new_track_desc = ""
|
||||
|
||||
|
||||
def render_mma_global_controls(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
|
||||
@@ -2927,7 +2779,6 @@ def render_mma_global_controls(app: App) -> None:
|
||||
imgui.text_colored(imgui.ImVec4(1, 0, 0, 1), f"Error: {app._hot_reload_error or 'Unknown'}")
|
||||
imgui.same_line(); imgui.text_disabled("(Ctrl+Alt+R)")
|
||||
|
||||
|
||||
def render_mma_usage_section(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
|
||||
@@ -2974,7 +2825,6 @@ def render_mma_usage_section(app: App) -> None:
|
||||
imgui.end_combo()
|
||||
imgui.pop_item_width()
|
||||
|
||||
|
||||
def render_mma_ticket_editor(app: App) -> None:
|
||||
imgui.separator(); imgui.text_colored(C_VAL, f"Editing: {app.ui_selected_ticket_id}")
|
||||
ticket = next((t for t in app.active_tickets if str(t.get('id', '')) == app.ui_selected_ticket_id), None)
|
||||
@@ -2995,7 +2845,6 @@ def render_mma_ticket_editor(app: App) -> None:
|
||||
imgui.same_line()
|
||||
if imgui.button(f"Delete##{app.ui_selected_ticket_id}"): app.active_tickets = [t for t in app.active_tickets if str(t.get('id', '')) != app.ui_selected_ticket_id]; app.ui_selected_ticket_id = None; app._push_mma_state_update()
|
||||
|
||||
|
||||
def render_mma_agent_streams(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
|
||||
@@ -3016,7 +2865,6 @@ def render_mma_agent_streams(app: App) -> None:
|
||||
if exp: render_beads_tab(app)
|
||||
imgui.end_tab_bar()
|
||||
|
||||
|
||||
def render_tier_stream_panel(app: App, tier_key: str, stream_key: str | None) -> None:
|
||||
"""
|
||||
[C: tests/test_mma_dashboard_streams.py:TestMMADashboardStreams.test_tier1_renders_stream_content, tests/test_mma_dashboard_streams.py:TestMMADashboardStreams.test_tier3_renders_worker_subheaders]
|
||||
@@ -3067,7 +2915,6 @@ def render_tier_stream_panel(app: App, tier_key: str, stream_key: str | None) ->
|
||||
pass
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tier_stream_panel")
|
||||
|
||||
|
||||
def render_track_proposal_modal(app: App) -> None:
|
||||
if app._show_track_proposal_modal:
|
||||
imgui.open_popup("Track Proposal")
|
||||
@@ -3112,8 +2959,6 @@ def render_track_proposal_modal(app: App) -> None:
|
||||
else:
|
||||
imgui.close_current_popup()
|
||||
imgui.end_popup()
|
||||
|
||||
|
||||
#endregion: MMA
|
||||
|
||||
def render_save_preset_modal(app: App) -> None:
|
||||
@@ -3140,7 +2985,6 @@ def render_save_preset_modal(app: App) -> None:
|
||||
app._show_save_preset_modal = False
|
||||
imgui.close_current_popup()
|
||||
|
||||
|
||||
def render_main_interface(app: App) -> None:
|
||||
render_error_tint(app)
|
||||
app.perf_monitor.start_frame()
|
||||
@@ -3232,13 +3076,11 @@ def render_main_interface(app: App) -> None:
|
||||
render_approve_script_modal(app)
|
||||
render_mma_modals(app)
|
||||
|
||||
|
||||
def render_custom_title_bar(app: App) -> None:
|
||||
# Obsolete, removed since it renders behind the full screen dock space.
|
||||
# Controls are now embedded in _show_menus.
|
||||
pass
|
||||
|
||||
|
||||
def render_history_window(app: App) -> None:
|
||||
if not app.show_windows.get('Undo/Redo History', False):
|
||||
return
|
||||
@@ -3263,7 +3105,6 @@ def render_history_window(app: App) -> None:
|
||||
if not history: imgui.text("No history available.")
|
||||
else: iterate_history()
|
||||
|
||||
|
||||
def render_theme_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_theme_panel")
|
||||
exp, opened = imgui.begin("Theme", app.show_windows["Theme"])
|
||||
@@ -3346,7 +3187,6 @@ def render_theme_panel(app: App) -> None:
|
||||
imgui.end()
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_theme_panel")
|
||||
|
||||
|
||||
def render_shader_live_editor(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_shader_live_editor.py:test_shader_live_editor_renders]
|
||||
@@ -3359,7 +3199,6 @@ def render_shader_live_editor(app: App) -> None:
|
||||
changed_scan, app.shader_uniforms['scanline'] = imgui.slider_float('Scanline Intensity', app.shader_uniforms['scanline'], 0.0, 1.0)
|
||||
changed_bloom, app.shader_uniforms['bloom'] = imgui.slider_float('Bloom Threshold', app.shader_uniforms['bloom'], 0.0, 1.0)
|
||||
|
||||
|
||||
def render_cache_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_cache_panel")
|
||||
if app.current_provider != "gemini":
|
||||
@@ -3392,7 +3231,6 @@ def render_cache_panel(app: App) -> None:
|
||||
imgui.text_colored(imgui.ImVec4(0.2, 1.0, 0.2, 1.0), "Cache cleared - will rebuild on next request")
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_cache_panel")
|
||||
|
||||
|
||||
def render_tool_analytics_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_tool_analytics_panel")
|
||||
imgui.text_colored(C_LBL, 'Tool Usage')
|
||||
@@ -3431,7 +3269,6 @@ def render_tool_analytics_panel(app: App) -> None:
|
||||
imgui.end_table()
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_tool_analytics_panel")
|
||||
|
||||
|
||||
def render_token_budget_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_token_budget_panel")
|
||||
imgui.text_colored(C_LBL, 'Prompt Utilization')
|
||||
@@ -3528,7 +3365,6 @@ def render_token_budget_panel(app: App) -> None:
|
||||
imgui.text_disabled("Cache Usage: INACTIVE")
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_token_budget_panel")
|
||||
|
||||
|
||||
def render_session_insights_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_session_insights_panel")
|
||||
imgui.text_colored(C_LBL, 'Session Insights')
|
||||
@@ -3544,7 +3380,6 @@ def render_session_insights_panel(app: App) -> None:
|
||||
imgui.text(f"Tokens/Ticket: {efficiency:.0f}" if efficiency > 0 else "Tokens/Ticket: N/A")
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_session_insights_panel")
|
||||
|
||||
|
||||
def render_projects_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_projects_panel")
|
||||
proj_name = app.project.get("project", {}).get("name", Path(app.active_project_path).stem)
|
||||
@@ -3630,7 +3465,6 @@ def render_projects_panel(app: App) -> None:
|
||||
ch, app.ui_auto_scroll_tool_calls = imgui.checkbox("Auto-scroll Tool History", app.ui_auto_scroll_tool_calls)
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_projects_panel")
|
||||
|
||||
|
||||
def render_paths_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_paths_panel")
|
||||
path_info = paths.get_full_path_info()
|
||||
@@ -3638,7 +3472,6 @@ def render_paths_panel(app: App) -> None:
|
||||
imgui.text_colored(C_IN, "System Path Configuration")
|
||||
imgui.separator()
|
||||
|
||||
|
||||
def render_path_field(label: str, attr: str, key: str, tooltip: str):
|
||||
info = path_info.get(key, {'source': 'unknown'})
|
||||
imgui.text(label)
|
||||
@@ -3657,7 +3490,6 @@ def render_path_field(label: str, attr: str, key: str, tooltip: str):
|
||||
r.destroy()
|
||||
if d: setattr(app, attr, d)
|
||||
|
||||
|
||||
def render_rag_panel(app: App) -> None:
|
||||
conf = app.controller.rag_config
|
||||
if not conf: return
|
||||
@@ -3695,7 +3527,6 @@ def render_rag_panel(app: App) -> None:
|
||||
|
||||
if imgui.button("Rebuild Index"): app.controller.event_queue.put('click', 'btn_rebuild_rag_index')
|
||||
|
||||
|
||||
def render_system_prompts_panel(app: App) -> None:
|
||||
imgui.text("Global System Prompt (all projects)")
|
||||
preset_names = sorted(app.controller.presets.keys())
|
||||
@@ -3748,7 +3579,6 @@ def render_system_prompts_panel(app: App) -> None:
|
||||
imgui.set_item_tooltip("Open preset management modal")
|
||||
ch, app.ui_project_system_prompt = imgui.input_text_multiline("##psp", app.ui_project_system_prompt, imgui.ImVec2(-1, 100))
|
||||
|
||||
|
||||
def render_agent_tools_panel(app: App) -> None:
|
||||
if imgui.collapsing_header("Active Tool Presets & Biases", imgui.TreeNodeFlags_.default_open):
|
||||
imgui.text("Tool Preset")
|
||||
@@ -3814,7 +3644,6 @@ def render_agent_tools_panel(app: App) -> None:
|
||||
if imgui.radio_button(f"Ask##{cat_name}_{tool.name}", mode == "ask"): tool.approval = "ask"
|
||||
imgui.tree_pop()
|
||||
|
||||
|
||||
def render_provider_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_provider_panel")
|
||||
imgui.text("Provider")
|
||||
@@ -3881,7 +3710,6 @@ def render_provider_panel(app: App) -> None:
|
||||
ai_client._gemini_cli_adapter.binary_path = app.ui_gemini_cli_path
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_provider_panel")
|
||||
|
||||
|
||||
def render_persona_selector_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_persona_selector_panel")
|
||||
imgui.text("Persona")
|
||||
@@ -3964,7 +3792,6 @@ def render_persona_selector_panel(app: App) -> None:
|
||||
imgui.separator()
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_persona_selector_panel")
|
||||
|
||||
|
||||
def render_context_composition_panel(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_auto_slices.py:test_add_all_triggers_auto_slices, tests/test_gui_fast_render.py:test_render_context_composition_panel_fast]
|
||||
@@ -3980,7 +3807,6 @@ def render_context_composition_panel(app: App) -> None:
|
||||
imgui.separator()
|
||||
render_context_presets(app)
|
||||
|
||||
|
||||
def render_ast_inspector_modal(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_ast_inspector_extended.py:test_ast_inspector_line_range_parsing]
|
||||
@@ -3990,7 +3816,6 @@ def render_ast_inspector_modal(app: App) -> None:
|
||||
app._show_ast_inspector = False
|
||||
|
||||
#region: AST Inspector
|
||||
|
||||
expanded, opened = imgui.begin_popup_modal('AST Inspector', True, imgui.WindowFlags_.always_auto_resize)
|
||||
if opened:
|
||||
if expanded:
|
||||
@@ -4120,7 +3945,6 @@ def render_ast_inspector_modal(app: App) -> None:
|
||||
|
||||
if not opened: app.ui_inspecting_ast_file = None
|
||||
|
||||
|
||||
def render_save_workspace_profile_modal(app: App) -> None:
|
||||
if app._show_save_workspace_profile_modal:
|
||||
imgui.open_popup("Save Workspace Profile")
|
||||
@@ -4148,7 +3972,6 @@ def render_save_workspace_profile_modal(app: App) -> None:
|
||||
|
||||
imgui.end_popup()
|
||||
|
||||
|
||||
def render_context_presets_panel(app: App) -> None:
|
||||
imgui.text_colored(C_IN, "Context Presets")
|
||||
imgui.separator()
|
||||
@@ -4171,11 +3994,9 @@ def render_context_presets_panel(app: App) -> None:
|
||||
imgui.same_line()
|
||||
if imgui.button(f"Delete##{name}"): app.delete_context_preset(name)
|
||||
|
||||
|
||||
def render_context_screenshots(app: App) -> None:
|
||||
for i, s in enumerate(app.screenshots): imgui.text(s)
|
||||
|
||||
|
||||
def render_context_files_table(app: App) -> None:
|
||||
imgui.dummy(imgui.ImVec2(0, 4))
|
||||
grouped_files = aggregate.group_files_by_dir(app.context_files)
|
||||
@@ -4281,7 +4102,6 @@ def render_context_files_table(app: App) -> None:
|
||||
imgui.same_line()
|
||||
imgui.text_colored(imgui.ImVec4(1.0, 0.5, 0.0, 1.0), "[Slices Active]")
|
||||
|
||||
|
||||
def render_context_presets(app: App) -> None:
|
||||
imgui.text("Presets")
|
||||
presets = app.controller.project.get('context_presets', {})
|
||||
@@ -4310,7 +4130,6 @@ def render_context_presets(app: App) -> None:
|
||||
app.delete_context_preset(app.ui_active_context_preset)
|
||||
app.ui_active_context_preset = ""
|
||||
|
||||
|
||||
def render_discussion_entries(app: App) -> None:
|
||||
with imscope.child("disc_scroll"):
|
||||
display_entries = app.disc_entries
|
||||
@@ -4325,7 +4144,6 @@ def render_discussion_entries(app: App) -> None:
|
||||
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
|
||||
|
||||
|
||||
def render_discussion_entry_controls(app: App) -> None:
|
||||
if imgui.button("+ Entry"): app.disc_entries.append({"role": app.disc_roles[0] if app.disc_roles else "User", "content": "", "collapsed": True, "ts": project_manager.now_ts()})
|
||||
imgui.same_line()
|
||||
@@ -4347,7 +4165,6 @@ def render_discussion_entry_controls(app: App) -> None:
|
||||
with app._disc_entries_lock: app.disc_entries = truncate_entries(app.disc_entries, app.ui_disc_truncate_pairs)
|
||||
app.ai_status = f"history truncated to {app.ui_disc_truncate_pairs} pairs"
|
||||
|
||||
|
||||
def render_discussion_metadata(app: App) -> None:
|
||||
disc_data = app.project.get("discussion", {}).get("discussions", {}).get(app.active_discussion, {})
|
||||
git_commit, last_updated = disc_data.get("git_commit", ""), disc_data.get("last_updated", "")
|
||||
@@ -4370,7 +4187,6 @@ def render_discussion_metadata(app: App) -> None:
|
||||
imgui.same_line()
|
||||
if imgui.button("Delete"): app._delete_discussion(app.active_discussion)
|
||||
|
||||
|
||||
def render_discussion_panel(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_discussion_takes_gui.py:test_render_discussion_tabs, tests/test_discussion_takes_gui.py:test_switching_discussion_via_tabs, tests/test_gui_discussion_tabs.py:test_discussion_tabs_rendered, tests/test_gui_fast_render.py:test_render_discussion_panel_fast, tests/test_gui_phase4.py:test_track_discussion_toggle, tests/test_gui_symbol_navigation.py:test_render_discussion_panel_symbol_lookup]
|
||||
@@ -4393,7 +4209,6 @@ def render_discussion_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_discussion_panel")
|
||||
return
|
||||
|
||||
|
||||
def render_discussion_roles(app: App) -> None:
|
||||
if imgui.collapsing_header("Roles"):
|
||||
with imscope.child("roles_scroll", size_y=100, flags=True):
|
||||
@@ -4407,7 +4222,6 @@ def render_discussion_roles(app: App) -> None:
|
||||
if r and r not in app.disc_roles: app.disc_roles.append(r); app.ui_disc_new_role_input = ""
|
||||
return
|
||||
|
||||
|
||||
def render_discussion_selector(app: App) -> None:
|
||||
if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open):
|
||||
return
|
||||
@@ -4453,7 +4267,6 @@ def render_discussion_selector(app: App) -> None:
|
||||
render_discussion_metadata(app)
|
||||
return
|
||||
|
||||
|
||||
def render_discussion_tab(app: App) -> None:
|
||||
imgui.begin_child("HistoryChild", size=(0, -app.ui_discussion_split_h))
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_discussion_panel")
|
||||
@@ -4489,7 +4302,6 @@ def render_discussion_tab(app: App) -> None:
|
||||
else:
|
||||
imgui.text_disabled("Message & Response panels are detached.")
|
||||
|
||||
|
||||
def render_takes_panel(app: App) -> None:
|
||||
imgui.text("Takes & Synthesis")
|
||||
imgui.separator()
|
||||
@@ -4546,7 +4358,6 @@ def render_takes_panel(app: App) -> None:
|
||||
app.disc_entries.append({"role": "user", "content": prompt, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
app._handle_generate_send()
|
||||
|
||||
|
||||
def render_prior_session_view(app: App) -> None:
|
||||
with imscope.style_color(imgui.Col_.child_bg, vec4(50, 40, 20)):
|
||||
if imgui.button("Exit Prior Session"): app.controller.cb_exit_prior_session(); app._comms_log_dirty = True
|
||||
@@ -4572,7 +4383,6 @@ def render_prior_session_view(app: App) -> None:
|
||||
markdown_helper.render(content, context_id=f'prior_disc_{idx}')
|
||||
imgui.separator()
|
||||
|
||||
|
||||
def render_thinking_indicator(app: App) -> None:
|
||||
is_thinking = app.ai_status in ['sending...', 'streaming...', 'running powershell...']
|
||||
if is_thinking:
|
||||
@@ -4581,7 +4391,6 @@ def render_thinking_indicator(app: App) -> None:
|
||||
c = vec4(255, 50, 50, alpha) if theme.is_nerv_active() else vec4(255, 100, 100, alpha)
|
||||
imgui.text_colored(c, "THINKING..."); imgui.same_line()
|
||||
|
||||
|
||||
def render_synthesis_panel(app: App) -> None:
|
||||
"""
|
||||
|
||||
@@ -4614,7 +4423,6 @@ def render_synthesis_panel(app: App) -> None:
|
||||
with app._disc_entries_lock: app.disc_entries.append({"role": "User", "content": prompt, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
app._handle_generate_send()
|
||||
|
||||
|
||||
def render_snapshot_tab(app: App) -> None:
|
||||
if imgui.begin_tab_bar("snapshot_tabs"):
|
||||
if imgui.begin_tab_item("Aggregate MD")[0]:
|
||||
@@ -4651,7 +4459,6 @@ def render_snapshot_tab(app: App) -> None:
|
||||
imgui.end_tab_item()
|
||||
imgui.end_tab_bar()
|
||||
|
||||
|
||||
def render_comms_history_panel(app: App) -> None:
|
||||
if app.perf_profiling_enabled: app.perf_monitor.start_component("_render_comms_history_panel")
|
||||
st_col = vec4(200, 220, 160)
|
||||
@@ -4770,7 +4577,6 @@ def render_comms_history_panel(app: App) -> None:
|
||||
if app.is_viewing_prior_session: imgui.pop_style_color()
|
||||
if app.perf_profiling_enabled: app.perf_monitor.end_component("_render_comms_history_panel")
|
||||
|
||||
|
||||
def render_text_viewer_window(app: App) -> None:
|
||||
"""Renders the standalone text/code/markdown viewer window."""
|
||||
if not app.show_text_viewer: return
|
||||
@@ -4892,7 +4698,6 @@ def render_text_viewer_window(app: App) -> None:
|
||||
render_ast_inspector_modal(app)
|
||||
return
|
||||
|
||||
|
||||
def render_base_prompt_diff_modal(app: App) -> None:
|
||||
if not getattr(app.controller, "_show_base_prompt_diff_modal", False):
|
||||
return
|
||||
@@ -4922,7 +4727,6 @@ def render_base_prompt_diff_modal(app: App) -> None:
|
||||
imgui.close_current_popup()
|
||||
imgui.end_popup()
|
||||
|
||||
|
||||
def render_patch_modal(app: App) -> None:
|
||||
if not app._show_patch_modal:
|
||||
return
|
||||
@@ -4967,7 +4771,6 @@ def render_patch_modal(app: App) -> None:
|
||||
app._patch_error_message = None
|
||||
imgui.close_current_popup()
|
||||
|
||||
|
||||
def render_external_editor_panel(app: App) -> None:
|
||||
from src.external_editor import get_default_launcher
|
||||
imgui.text("External Editor for Diff Viewing")
|
||||
@@ -5014,7 +4817,6 @@ def render_external_editor_panel(app: App) -> None:
|
||||
except Exception as e:
|
||||
imgui.text_colored(C_TC, f"Error: {str(e)}")
|
||||
|
||||
|
||||
def render_approve_script_modal(app: App) -> None:
|
||||
"""Renders the modal dialog for approving AI-generated PowerShell scripts."""
|
||||
with app._pending_dialog_lock:
|
||||
@@ -5058,7 +4860,6 @@ def render_approve_script_modal(app: App) -> None:
|
||||
imgui.close_current_popup()
|
||||
imgui.end_popup()
|
||||
|
||||
|
||||
def render_markdown_test(app: App) -> None:
|
||||
imgui.text("Markdown Test Panel")
|
||||
imgui.separator()
|
||||
@@ -5083,7 +4884,6 @@ def hello():
|
||||
"""
|
||||
markdown_helper.render(md)
|
||||
|
||||
|
||||
def render_ticket_queue(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_kill_button.py:test_render_ticket_queue_table_columns]
|
||||
@@ -5199,7 +4999,6 @@ def render_ticket_queue(app: App) -> None:
|
||||
|
||||
imgui.end_table()
|
||||
|
||||
|
||||
def render_task_dag_panel(app: App) -> None: # 4. Task DAG Visualizer
|
||||
imgui.text("Task DAG")
|
||||
if (app.active_track or app.active_tickets) and app.node_editor_ctx:
|
||||
@@ -5343,7 +5142,6 @@ def render_task_dag_panel(app: App) -> None: # 4. Task DAG Visualizer
|
||||
else:
|
||||
imgui.text_disabled("No active MMA track or tickets.")
|
||||
|
||||
|
||||
def render_beads_tab(app: App) -> None:
|
||||
imgui.text("Beads Graph (Dolt-backed)")
|
||||
if imgui.button("Refresh Beads"):
|
||||
@@ -5385,7 +5183,6 @@ def render_beads_tab(app: App) -> None:
|
||||
except Exception as e:
|
||||
imgui.text_colored(imgui.ImVec4(1, 0, 0, 1), f"Error loading beads: {e}")
|
||||
|
||||
|
||||
def render_mma_focus_selector(app: App) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_progress.py:test_render_mma_dashboard_progress]
|
||||
@@ -5400,7 +5197,6 @@ def render_mma_focus_selector(app: App) -> None:
|
||||
imgui.same_line()
|
||||
if app.ui_focus_agent and imgui.button("x##clear_focus"): app.ui_focus_agent = None
|
||||
|
||||
|
||||
def render_error_tint(app: App) -> None:
|
||||
"""Renders a red tint overlay if hot reload failed."""
|
||||
if not HotReloader.is_error_state: return
|
||||
|
||||
Reference in New Issue
Block a user