progress on fixing up gui code
This commit is contained in:
+91
-182
@@ -653,6 +653,67 @@ class App:
|
||||
imgui.pop_style_var(2)
|
||||
imgui.pop_id()
|
||||
|
||||
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
|
||||
with imscope.window(name, self.show_windows[name]) as (exp, opened):
|
||||
self.show_windows[name] = bool(opened)
|
||||
if exp: render_func()
|
||||
|
||||
def _render_project_settings_hub(self) -> None:
|
||||
with imscope.tab_bar('context_hub_tabs'):
|
||||
with imscope.tab_item('Projects'): self._render_projects_panel()
|
||||
with imscope.tab_item('Paths'): self._render_paths_panel()
|
||||
|
||||
def _render_ai_settings_hub(self) -> None:
|
||||
self._render_persona_selector_panel()
|
||||
if imgui.collapsing_header("Provider & Model"): self._render_provider_panel()
|
||||
if imgui.collapsing_header("System Prompts"): self._render_system_prompts_panel()
|
||||
if imgui.collapsing_header("RAG Settings"): self._render_rag_panel()
|
||||
self._render_agent_tools_panel()
|
||||
|
||||
def _render_discussion_hub(self) -> None:
|
||||
with imscope.tab_bar("discussion_hub_tabs"):
|
||||
with imscope.tab_item("Discussion"): self._render_discussion_tab()
|
||||
with imscope.tab_item("Context Composition"): self._render_context_composition_panel()
|
||||
with imscope.tab_item("Snapshot"): self._render_snapshot_tab()
|
||||
with imscope.tab_item("Takes"): self._render_takes_panel()
|
||||
|
||||
def _render_operations_hub(self) -> None:
|
||||
imgui.push_style_var(imgui.StyleVar_.item_spacing, imgui.ImVec2(10, 4))
|
||||
ch1, self.ui_separate_tool_calls_panel = imgui.checkbox("Pop Out Tool Calls", self.ui_separate_tool_calls_panel)
|
||||
if ch1: self.show_windows["Tool Calls"] = self.ui_separate_tool_calls_panel
|
||||
imgui.same_line()
|
||||
ch2, self.ui_separate_usage_analytics = imgui.checkbox("Pop Out Usage Analytics", self.ui_separate_usage_analytics)
|
||||
if ch2: self.show_windows["Usage Analytics"] = self.ui_separate_usage_analytics
|
||||
imgui.same_line()
|
||||
ch3, self.ui_separate_external_tools = imgui.checkbox('Pop Out External Tools', self.ui_separate_external_tools)
|
||||
if ch3: self.show_windows['External Tools'] = self.ui_separate_external_tools
|
||||
imgui.pop_style_var()
|
||||
show_tc_tab, show_usage_tab = not self.ui_separate_tool_calls_panel, not self.ui_separate_usage_analytics
|
||||
with imscope.tab_bar("ops_tabs"):
|
||||
with imscope.tab_item("Comms History"): self._render_comms_history_panel()
|
||||
if show_tc_tab:
|
||||
with imscope.tab_item("Tool Calls"): self._render_tool_calls_panel()
|
||||
if show_usage_tab:
|
||||
with imscope.tab_item("Usage Analytics"): self._render_usage_analytics_panel()
|
||||
if not self.ui_separate_external_tools:
|
||||
with imscope.tab_item("External Tools"):
|
||||
self._render_external_tools_panel()
|
||||
imgui.separator(); imgui.text("")
|
||||
try: self._render_external_editor_panel()
|
||||
except Exception as e: imgui.text_colored(vec4(1, 0.3, 0.3, 1), f"Error: {str(e)}")
|
||||
with imscope.tab_item("Workspace Layouts"):
|
||||
imgui.text("Experimental: Auto-switch layout by Tier")
|
||||
ch, self.controller.ui_auto_switch_layout = imgui.checkbox("Enable Auto-Switch", self.controller.ui_auto_switch_layout)
|
||||
if self.controller.ui_auto_switch_layout:
|
||||
imgui.separator(); imgui.text("Tier Bindings (select profile for each tier)")
|
||||
profiles = [""] + [p.name for p in self.controller.workspace_profiles.values()]
|
||||
for t in ["Tier 1", "Tier 2", "Tier 3", "Tier 4"]:
|
||||
curr = self.controller.ui_tier_layout_bindings.get(t, ""); idx = profiles.index(curr) if curr in profiles else 0
|
||||
ch_combo, new_idx = imgui.combo(t, idx, profiles)
|
||||
if ch_combo: self.controller.ui_tier_layout_bindings[t] = profiles[new_idx]
|
||||
|
||||
def _show_menus(self) -> None:
|
||||
"""
|
||||
[C: tests/test_gui_window_controls.py:test_gui_window_controls_minimize_maximize_close]
|
||||
@@ -732,16 +793,16 @@ class App:
|
||||
|
||||
if hwnd:
|
||||
btn_w = 40
|
||||
display_w = imgui.get_io().display_size.x
|
||||
right_x = display_w - (btn_w * 3)
|
||||
# Use window width (points) instead of display_size (pixels) for correct scaling
|
||||
window_w = imgui.get_window_width()
|
||||
bar_h = imgui.get_window_height()
|
||||
right_x = window_w - (btn_w * 3)
|
||||
|
||||
# Drag area check using an explicit invisible button spanning the empty space
|
||||
curr_x = imgui.get_cursor_pos_x()
|
||||
drag_w = right_x - curr_x
|
||||
if drag_w > 0:
|
||||
# Use a small positive height to satisfy IM_ASSERT(size_arg.y != 0.0f)
|
||||
# The menu bar naturally constrains the hit box height anyway.
|
||||
imgui.invisible_button("##drag_area", (drag_w, 20.0))
|
||||
imgui.invisible_button("##drag_area", (drag_w, bar_h))
|
||||
if imgui.is_item_active() and imgui.is_mouse_dragging(0):
|
||||
# CRITICAL: We must reset ImGui's mouse_down state BEFORE passing control to Windows.
|
||||
# Otherwise, the Windows modal drag loop swallows the WM_LBUTTONUP event,
|
||||
@@ -757,17 +818,18 @@ class App:
|
||||
except Exception:
|
||||
is_max = False
|
||||
|
||||
imgui.set_cursor_pos_x(right_x)
|
||||
if imgui.button("_", (btn_w, 0)):
|
||||
# Explicitly set Y to 0 and match button height to bar height for perfect alignment
|
||||
imgui.set_cursor_pos((right_x, 0))
|
||||
if imgui.button("_", (btn_w, bar_h)):
|
||||
win32gui.ShowWindow(hwnd, win32con.SW_MINIMIZE)
|
||||
|
||||
imgui.set_cursor_pos_x(right_x + btn_w)
|
||||
if imgui.button("[=]" if is_max else "[]", (btn_w, 0)):
|
||||
imgui.set_cursor_pos((right_x + btn_w, 0))
|
||||
if imgui.button("[=]" if is_max else "[]", (btn_w, bar_h)):
|
||||
win32gui.ShowWindow(hwnd, win32con.SW_RESTORE if is_max else win32con.SW_MAXIMIZE)
|
||||
|
||||
imgui.set_cursor_pos_x(right_x + btn_w * 2)
|
||||
imgui.set_cursor_pos((right_x + btn_w * 2, 0))
|
||||
imgui.push_style_color(imgui.Col_.button_hovered, vec4(200, 50, 50, 255))
|
||||
if imgui.button("X", (btn_w, 0)):
|
||||
if imgui.button("X", (btn_w, bar_h)):
|
||||
win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
|
||||
imgui.pop_style_color()
|
||||
|
||||
@@ -985,182 +1047,29 @@ class App:
|
||||
else: self._tool_log_cache = log_raw
|
||||
self._tool_log_dirty = False
|
||||
|
||||
#region: Project Settings
|
||||
if self.show_windows.get("Project Settings", False):
|
||||
with imscope.window("Project Settings", self.show_windows["Project Settings"]) as (exp, opened):
|
||||
self.show_windows["Project Settings"] = bool(opened)
|
||||
if exp and imscope.tab_bar('context_hub_tabs'):
|
||||
if imscope.tab_item('Projects'): self._render_projects_panel()
|
||||
if imscope.tab_item('Paths'): self._render_paths_panel()
|
||||
#endregion: Project Settings
|
||||
self._render_window_if_open("Project Settings", self._render_project_settings_hub)
|
||||
self._render_window_if_open("Files & Media", self._render_files_and_media)
|
||||
self._render_window_if_open("AI Settings", self._render_ai_settings_hub)
|
||||
self._render_window_if_open("Usage Analytics", self._render_usage_analytics_panel, self.ui_separate_usage_analytics)
|
||||
self._render_window_if_open("MMA Dashboard", self._render_mma_dashboard)
|
||||
self._render_window_if_open("Task DAG", self._render_task_dag_panel, self.ui_separate_task_dag)
|
||||
|
||||
#region: Files & Media window
|
||||
if self.show_windows.get("Files & Media", False):
|
||||
exp, opened = imgui.begin("Files & Media", self.show_windows["Files & Media"])
|
||||
self.show_windows["Files & Media"] = bool(opened)
|
||||
if opened and exp: self._render_files_and_media()
|
||||
imgui.end()
|
||||
#endregion: Files & Media window
|
||||
|
||||
#region: AI Settings
|
||||
if self.show_windows.get("AI Settings", False):
|
||||
with imscope.window("AI Settings", self.show_windows["AI Settings"]) as (exp, opened):
|
||||
self.show_windows["AI Settings"] = bool(opened)
|
||||
if exp:
|
||||
self._render_persona_selector_panel()
|
||||
if imgui.collapsing_header("Provider & Model"): self._render_provider_panel()
|
||||
if imgui.collapsing_header("System Prompts"): self._render_system_prompts_panel()
|
||||
if imgui.collapsing_header("RAG Settings"): self._render_rag_panel()
|
||||
self._render_agent_tools_panel()
|
||||
#endregion: AI Settings
|
||||
|
||||
if self.ui_separate_usage_analytics and self.show_windows.get("Usage Analytics", False):
|
||||
exp, opened = imgui.begin("Usage Analytics", self.show_windows["Usage Analytics"])
|
||||
self.show_windows["Usage Analytics"] = bool(opened)
|
||||
if exp:
|
||||
self._render_usage_analytics_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.show_windows.get("MMA Dashboard", False):
|
||||
exp, opened = imgui.begin("MMA Dashboard", self.show_windows["MMA Dashboard"])
|
||||
self.show_windows["MMA Dashboard"] = bool(opened)
|
||||
if exp:
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_mma_dashboard")
|
||||
self._render_mma_dashboard()
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_mma_dashboard")
|
||||
imgui.end()
|
||||
|
||||
#region: Seprate Task Dag to Tier 4
|
||||
if self.ui_separate_task_dag and self.show_windows.get("Task DAG", False):
|
||||
exp, opened = imgui.begin("Task DAG", self.show_windows["Task DAG"])
|
||||
self.show_windows["Task DAG"] = bool(opened)
|
||||
if exp: self._render_task_dag_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tier1 and self.show_windows.get("Tier 1: Strategy", False):
|
||||
exp, opened = imgui.begin("Tier 1: Strategy", self.show_windows["Tier 1: Strategy"])
|
||||
self.show_windows["Tier 1: Strategy"] = bool(opened)
|
||||
if exp: self._render_tier_stream_panel("Tier 1", "Tier 1")
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tier2 and self.show_windows.get("Tier 2: Tech Lead", False):
|
||||
exp, opened = imgui.begin("Tier 2: Tech Lead", self.show_windows["Tier 2: Tech Lead"])
|
||||
self.show_windows["Tier 2: Tech Lead"] = bool(opened)
|
||||
if exp: self._render_tier_stream_panel("Tier 2", "Tier 2 (Tech Lead)")
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tier3 and self.show_windows.get("Tier 3: Workers", False):
|
||||
exp, opened = imgui.begin("Tier 3: Workers", self.show_windows["Tier 3: Workers"])
|
||||
self.show_windows["Tier 3: Workers"] = bool(opened)
|
||||
if exp: self._render_tier_stream_panel("Tier 3", None)
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tier4 and self.show_windows.get("Tier 4: QA", False):
|
||||
exp, opened = imgui.begin("Tier 4: QA", self.show_windows["Tier 4: QA"])
|
||||
self.show_windows["Tier 4: QA"] = bool(opened)
|
||||
if exp: self._render_tier_stream_panel("Tier 4", "Tier 4 (QA)")
|
||||
imgui.end()
|
||||
#endregion: Separate Task Dag to Tier 4
|
||||
self._render_window_if_open("Tier 1: Strategy", lambda: self._render_tier_stream_panel("Tier 1", "Tier 1"), self.ui_separate_tier1)
|
||||
self._render_window_if_open("Tier 2: Tech Lead", lambda: self._render_tier_stream_panel("Tier 2", "Tier 2 (Tech Lead)"), self.ui_separate_tier2)
|
||||
self._render_window_if_open("Tier 3: Workers", lambda: self._render_tier_stream_panel("Tier 3", None), self.ui_separate_tier3)
|
||||
self._render_window_if_open("Tier 4: QA", lambda: self._render_tier_stream_panel("Tier 4", "Tier 4 (QA)"), self.ui_separate_tier4)
|
||||
|
||||
if self.show_windows.get("Theme", False): self._render_theme_panel()
|
||||
|
||||
#region: Discussion Hub
|
||||
if self.show_windows.get("Discussion Hub", False):
|
||||
with imscope.window("Discussion Hub", self.show_windows["Discussion Hub"]) as (exp, opened):
|
||||
self.show_windows["Discussion Hub"] = bool(opened)
|
||||
if exp:
|
||||
if imscope.tab_bar("discussion_hub_tabs"):
|
||||
if imscope.tab_item("Discussion"):
|
||||
self._render_discussion_tab()
|
||||
if imscope.tab_item("Context Composition"):
|
||||
self._render_context_composition_panel()
|
||||
if imscope.tab_item("Snapshot"):
|
||||
self._render_snapshot_tab()
|
||||
if imscope.tab_item("Takes"):
|
||||
self._render_takes_panel()
|
||||
#endregion: Discussion Hub
|
||||
self._render_window_if_open("Discussion Hub", self._render_discussion_hub)
|
||||
self._render_window_if_open("Operations Hub", self._render_operations_hub)
|
||||
|
||||
#region: Operations Hub
|
||||
if self.show_windows.get("Operations Hub", False):
|
||||
exp, opened = imgui.begin("Operations Hub", self.show_windows["Operations Hub"])
|
||||
self.show_windows["Operations Hub"] = bool(opened)
|
||||
if exp:
|
||||
imgui.push_style_var(imgui.StyleVar_.item_spacing, imgui.ImVec2(10, 4))
|
||||
ch1, self.ui_separate_tool_calls_panel = imgui.checkbox("Pop Out Tool Calls", self.ui_separate_tool_calls_panel)
|
||||
if ch1: self.show_windows["Tool Calls"] = self.ui_separate_tool_calls_panel
|
||||
imgui.same_line()
|
||||
ch2, self.ui_separate_usage_analytics = imgui.checkbox("Pop Out Usage Analytics", self.ui_separate_usage_analytics)
|
||||
if ch2: self.show_windows["Usage Analytics"] = self.ui_separate_usage_analytics
|
||||
imgui.same_line()
|
||||
ch3, self.ui_separate_external_tools = imgui.checkbox('Pop Out External Tools', self.ui_separate_external_tools)
|
||||
if ch3: self.show_windows['External Tools'] = self.ui_separate_external_tools
|
||||
imgui.pop_style_var()
|
||||
|
||||
show_tc_tab = not self.ui_separate_tool_calls_panel
|
||||
show_usage_tab = not self.ui_separate_usage_analytics
|
||||
|
||||
with imscope.tab_bar("ops_tabs"):
|
||||
with imscope.tab_item("Comms History"): self._render_comms_history_panel()
|
||||
if show_tc_tab:
|
||||
with imscope.tab_item("Tool Calls"): self._render_tool_calls_panel()
|
||||
if show_usage_tab:
|
||||
with imscope.tab_item("Usage Analytics"): self._render_usage_analytics_panel()
|
||||
if not self.ui_separate_external_tools:
|
||||
with imscope.tab_item("External Tools"):
|
||||
self._render_external_tools_panel()
|
||||
imgui.separator()
|
||||
imgui.text("")
|
||||
try:
|
||||
self._render_external_editor_panel()
|
||||
except Exception as e:
|
||||
imgui.text_colored(vec4(1, 0.3, 0.3, 1), f"Error: {str(e)}")
|
||||
with imscope.tab_item("Workspace Layouts"):
|
||||
imgui.text("Experimental: Auto-switch layout by Tier")
|
||||
ch, self.controller.ui_auto_switch_layout = imgui.checkbox("Enable Auto-Switch", self.controller.ui_auto_switch_layout)
|
||||
if self.controller.ui_auto_switch_layout:
|
||||
imgui.separator()
|
||||
imgui.text("Tier Bindings (select profile for each tier)")
|
||||
profiles = [""] + [p.name for p in self.controller.workspace_profiles.values()]
|
||||
for t in ["Tier 1", "Tier 2", "Tier 3", "Tier 4"]:
|
||||
curr = self.controller.ui_tier_layout_bindings.get(t, "")
|
||||
idx = profiles.index(curr) if curr in profiles else 0
|
||||
ch_combo, new_idx = imgui.combo(t, idx, profiles)
|
||||
if ch_combo: self.controller.ui_tier_layout_bindings[t] = profiles[new_idx]
|
||||
imgui.end()
|
||||
#endregion: Operations Hub
|
||||
|
||||
#region: Separate Message, Response, Tool Calls, External Tools
|
||||
if self.ui_separate_message_panel and self.show_windows.get("Message", False):
|
||||
exp, opened = imgui.begin("Message", self.show_windows["Message"])
|
||||
self.show_windows["Message"] = bool(opened)
|
||||
if exp: self._render_message_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_response_panel and self.show_windows.get("Response", False):
|
||||
exp, opened = imgui.begin("Response", self.show_windows["Response"])
|
||||
self.show_windows["Response"] = bool(opened)
|
||||
if exp: self._render_response_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_tool_calls_panel and self.show_windows.get("Tool Calls", False):
|
||||
exp, opened = imgui.begin("Tool Calls", self.show_windows["Tool Calls"])
|
||||
self.show_windows["Tool Calls"] = bool(opened)
|
||||
if exp: self._render_tool_calls_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.ui_separate_external_tools and self.show_windows.get('External Tools', False):
|
||||
exp, opened = imgui.begin('External Tools', self.show_windows['External Tools'])
|
||||
self.show_windows['External Tools'] = bool(opened)
|
||||
if exp: self._render_external_tools_panel()
|
||||
imgui.end()
|
||||
|
||||
if self.show_windows.get("Log Management", False):
|
||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_log_management")
|
||||
self._render_log_management()
|
||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_log_management")
|
||||
#endregion: Separate Message, Response, Tool Calls, External Tools
|
||||
|
||||
if self.show_windows.get("Diagnostics", False): self._render_diagnostics_panel()
|
||||
self._render_window_if_open("Message", self._render_message_panel, self.ui_separate_message_panel)
|
||||
self._render_window_if_open("Response", self._render_response_panel, self.ui_separate_response_panel)
|
||||
self._render_window_if_open("Tool Calls", self._render_tool_calls_panel, self.ui_separate_tool_calls_panel)
|
||||
self._render_window_if_open("External Tools", self._render_external_tools_panel, self.ui_separate_external_tools)
|
||||
self._render_window_if_open("Log Management", self._render_log_management)
|
||||
self._render_window_if_open("Diagnostics", self._render_diagnostics_panel)
|
||||
|
||||
self.perf_monitor.end_frame()
|
||||
|
||||
|
||||
+32
-14
@@ -24,7 +24,8 @@ class _ScopeChild:
|
||||
self._sy = size_y
|
||||
self._flags = flags
|
||||
def __enter__(self):
|
||||
return imgui.begin_child(self._id, self._sx, self._sy, self._flags)
|
||||
res = imgui.begin_child(self._id, self._sx, self._sy, self._flags)
|
||||
return res
|
||||
def __exit__(self, *args):
|
||||
imgui.end_child()
|
||||
return False
|
||||
@@ -35,38 +36,51 @@ class _ScopeTable:
|
||||
self._name = name
|
||||
self._columns = columns
|
||||
self._flags = flags
|
||||
self._active = False
|
||||
def __enter__(self):
|
||||
return imgui.begin_table(self._name, self._columns, self._flags)
|
||||
self._active = imgui.begin_table(self._name, self._columns, self._flags)
|
||||
return self._active
|
||||
def __exit__(self, *args):
|
||||
imgui.end_table()
|
||||
if self._active:
|
||||
imgui.end_table()
|
||||
return False
|
||||
|
||||
def menu_bar(): return _ScopeMenuBar()
|
||||
class _ScopeMenuBar:
|
||||
def __init__(self):
|
||||
self._active = False
|
||||
def __enter__(self):
|
||||
return imgui.begin_menu_bar()
|
||||
self._active = imgui.begin_menu_bar()
|
||||
return self._active
|
||||
def __exit__(self, *args):
|
||||
imgui.end_menu_bar()
|
||||
if self._active:
|
||||
imgui.end_menu_bar()
|
||||
return False
|
||||
|
||||
def menu(label: str): return _ScopeMenu(label)
|
||||
class _ScopeMenu:
|
||||
def __init__(self, label: str):
|
||||
self._label = label
|
||||
self._active = False
|
||||
def __enter__(self):
|
||||
return imgui.begin_menu(self._label)
|
||||
self._active = imgui.begin_menu(self._label)
|
||||
return self._active
|
||||
def __exit__(self, *args):
|
||||
imgui.end_menu()
|
||||
if self._active:
|
||||
imgui.end_menu()
|
||||
return False
|
||||
|
||||
def popup(id_str: str): return _ScopePopup(id_str)
|
||||
class _ScopePopup:
|
||||
def __init__(self, id_str: str):
|
||||
self._id = id_str
|
||||
self._active = False
|
||||
def __enter__(self):
|
||||
return imgui.begin_popup(self._id)
|
||||
self._active = imgui.begin_popup(self._id)
|
||||
return self._active
|
||||
def __exit__(self, *args):
|
||||
imgui.end_popup()
|
||||
if self._active:
|
||||
imgui.end_popup()
|
||||
return False
|
||||
|
||||
def tooltip(): return _ScopeTooltip()
|
||||
@@ -120,10 +134,13 @@ class _ScopeTabBar:
|
||||
def __init__(self, id_str: str, flags: int):
|
||||
self._id = id_str
|
||||
self._flags = flags
|
||||
self._active = False
|
||||
def __enter__(self):
|
||||
return imgui.begin_tab_bar(self._id, self._flags)
|
||||
self._active = imgui.begin_tab_bar(self._id, self._flags)
|
||||
return self._active
|
||||
def __exit__(self, *args):
|
||||
imgui.end_tab_bar()
|
||||
if self._active:
|
||||
imgui.end_tab_bar()
|
||||
return False
|
||||
|
||||
def tab_item(label: str, flags: int = 0): return _ScopeTabItem(label, flags)
|
||||
@@ -131,11 +148,12 @@ class _ScopeTabItem:
|
||||
def __init__(self, label: str, flags: int):
|
||||
self._label = label
|
||||
self._flags = flags
|
||||
self._expanded = False
|
||||
self._open = None
|
||||
def __enter__(self):
|
||||
exp, self._open = imgui.begin_tab_item(self._label, None, self._flags)
|
||||
return exp, self._open
|
||||
self._expanded, self._open = imgui.begin_tab_item(self._label, None, self._flags)
|
||||
return self._expanded, self._open
|
||||
def __exit__(self, *args):
|
||||
if self._open:
|
||||
if self._expanded:
|
||||
imgui.end_tab_item()
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user