gemini 3.1 fails
This commit is contained in:
+43
-92
@@ -15,7 +15,7 @@ import threading
|
|||||||
import time
|
import time
|
||||||
# from defer import defer
|
# from defer import defer
|
||||||
import tomli_w
|
import tomli_w
|
||||||
# from contextlib import ExitStack
|
# from contextlib import ExitStack, nullcontext
|
||||||
import traceback
|
import traceback
|
||||||
import typing
|
import typing
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -605,8 +605,8 @@ class App:
|
|||||||
def _render_thinking_trace(self, segments: list[dict], entry_index: int, is_standalone: bool = False) -> None:
|
def _render_thinking_trace(self, segments: list[dict], entry_index: int, is_standalone: bool = False) -> None:
|
||||||
if not segments:
|
if not segments:
|
||||||
return
|
return
|
||||||
imgui.push_style_color(imgui.Col_.child_bg, vec4(40, 35, 25, 180))
|
with imscope.style_color(imgui.Col_.child_bg, vec4(40, 35, 25, 180)), \
|
||||||
imgui.push_style_color(imgui.Col_.text, vec4(200, 200, 150))
|
imscope.style_color(imgui.Col_.text, vec4(200, 200, 150)):
|
||||||
imgui.indent()
|
imgui.indent()
|
||||||
|
|
||||||
show_content = True
|
show_content = True
|
||||||
@@ -623,35 +623,35 @@ class App:
|
|||||||
with imscope.id(f"think_{entry_index}_{idx}"):
|
with imscope.id(f"think_{entry_index}_{idx}"):
|
||||||
imgui.text_colored(vec4(180, 150, 80), f"[{marker}]")
|
imgui.text_colored(vec4(180, 150, 80), f"[{marker}]")
|
||||||
if self.ui_word_wrap:
|
if self.ui_word_wrap:
|
||||||
imscope.text_wrap(imgui.get_content_region_avail().x)
|
with imscope.text_wrap(imgui.get_content_region_avail().x):
|
||||||
imgui.text_colored(vec4(200, 200, 150), content)
|
imgui.text_colored(vec4(200, 200, 150), content)
|
||||||
else:
|
else:
|
||||||
imgui.text_colored(vec4(200, 200, 150), content)
|
imgui.text_colored(vec4(200, 200, 150), content)
|
||||||
imgui.separator()
|
imgui.separator()
|
||||||
|
|
||||||
imgui.unindent()
|
imgui.unindent()
|
||||||
imgui.pop_style_color(2)
|
|
||||||
|
|
||||||
def _render_selectable_label(self, label: str, value: str, width: float = 0.0, multiline: bool = False, height: float = 0.0, color: Optional[imgui.ImVec4] = None) -> None:
|
def _render_selectable_label(self, label: str, value: str, width: float = 0.0, multiline: bool = False, height: float = 0.0, color: Optional[imgui.ImVec4] = None) -> None:
|
||||||
imgui.push_id(label + str(hash(value)))
|
with imscope.id(label + str(hash(value))):
|
||||||
pops = 4
|
with imscope.style_color(imgui.Col_.frame_bg, vec4(0, 0, 0, 0)), \
|
||||||
imgui.push_style_color(imgui.Col_.frame_bg, vec4(0, 0, 0, 0))
|
imscope.style_color(imgui.Col_.frame_bg_hovered, vec4(0, 0, 0, 0)), \
|
||||||
imgui.push_style_color(imgui.Col_.frame_bg_hovered, vec4(0, 0, 0, 0))
|
imscope.style_color(imgui.Col_.frame_bg_active, vec4(0, 0, 0, 0)), \
|
||||||
imgui.push_style_color(imgui.Col_.frame_bg_active, vec4(0, 0, 0, 0))
|
imscope.style_color(imgui.Col_.border, vec4(0, 0, 0, 0)):
|
||||||
imgui.push_style_color(imgui.Col_.border, vec4(0, 0, 0, 0))
|
with imscope.style_var(imgui.StyleVar_.frame_border_size, 0.0), \
|
||||||
|
imscope.style_var(imgui.StyleVar_.frame_padding, imgui.ImVec2(0, 0)):
|
||||||
if color:
|
if color:
|
||||||
imgui.push_style_color(imgui.Col_.text, color)
|
with imscope.style_color(imgui.Col_.text, color):
|
||||||
pops += 1
|
if multiline:
|
||||||
imgui.push_style_var(imgui.StyleVar_.frame_border_size, 0.0)
|
imgui.input_text_multiline("##" + label, value, imgui.ImVec2(width, height), imgui.InputTextFlags_.read_only)
|
||||||
imgui.push_style_var(imgui.StyleVar_.frame_padding, imgui.ImVec2(0, 0))
|
else:
|
||||||
|
if width > 0: imgui.set_next_item_width(width)
|
||||||
|
imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only)
|
||||||
|
else:
|
||||||
if multiline:
|
if multiline:
|
||||||
imgui.input_text_multiline("##" + label, value, imgui.ImVec2(width, height), imgui.InputTextFlags_.read_only)
|
imgui.input_text_multiline("##" + label, value, imgui.ImVec2(width, height), imgui.InputTextFlags_.read_only)
|
||||||
else:
|
else:
|
||||||
if width > 0: imgui.set_next_item_width(width)
|
if width > 0: imgui.set_next_item_width(width)
|
||||||
imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only)
|
imgui.input_text("##" + label, value, imgui.InputTextFlags_.read_only)
|
||||||
imgui.pop_style_color(pops)
|
|
||||||
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:
|
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."""
|
"""Helper to render a window only if its toggle is active."""
|
||||||
@@ -1220,7 +1220,7 @@ class App:
|
|||||||
imgui.text_colored(c, "THINKING..."); imgui.same_line()
|
imgui.text_colored(c, "THINKING..."); imgui.same_line()
|
||||||
|
|
||||||
def _render_prior_session_view(self) -> None:
|
def _render_prior_session_view(self) -> None:
|
||||||
imgui.push_style_color(imgui.Col_.child_bg, vec4(50, 40, 20))
|
with imscope.style_color(imgui.Col_.child_bg, vec4(50, 40, 20)):
|
||||||
if imgui.button("Exit Prior Session"): self.controller.cb_exit_prior_session(); self._comms_log_dirty = True
|
if imgui.button("Exit Prior Session"): self.controller.cb_exit_prior_session(); self._comms_log_dirty = True
|
||||||
imgui.separator()
|
imgui.separator()
|
||||||
with imscope.child("prior_scroll"):
|
with imscope.child("prior_scroll"):
|
||||||
@@ -1241,13 +1241,9 @@ class App:
|
|||||||
imgui.text_colored(vec4(180, 180, 180), preview)
|
imgui.text_colored(vec4(180, 180, 180), preview)
|
||||||
else:
|
else:
|
||||||
is_nerv = theme.is_nerv_active()
|
is_nerv = theme.is_nerv_active()
|
||||||
if is_nerv: imgui.push_style_color(imgui.Col_.text, vec4(80, 255, 80))
|
with imscope.style_color(imgui.Col_.text, vec4(80, 255, 80)) if is_nerv else nullcontext():
|
||||||
markdown_helper.render(content, context_id=f'prior_disc_{idx}')
|
markdown_helper.render(content, context_id=f'prior_disc_{idx}')
|
||||||
if is_nerv: imgui.pop_style_color()
|
|
||||||
imgui.separator()
|
imgui.separator()
|
||||||
imgui.pop_style_color()
|
|
||||||
|
|
||||||
def _render_discussion_selector(self) -> None:
|
|
||||||
if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return
|
if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return
|
||||||
names = self._get_discussion_names(); grouped = {}
|
names = self._get_discussion_names(); grouped = {}
|
||||||
for name in names:
|
for name in names:
|
||||||
@@ -2204,11 +2200,12 @@ class App:
|
|||||||
if not self.show_preset_manager_window and not is_embedded: return
|
if not self.show_preset_manager_window and not is_embedded: return
|
||||||
if not is_embedded:
|
if not is_embedded:
|
||||||
imgui.set_next_window_size(imgui.ImVec2(1000, 800), imgui.Cond_.first_use_ever)
|
imgui.set_next_window_size(imgui.ImVec2(1000, 800), imgui.Cond_.first_use_ever)
|
||||||
opened, self.show_preset_manager_window = imgui.begin("Prompt Presets Manager", self.show_preset_manager_window)
|
with imscope.window("Prompt Presets Manager", self.show_preset_manager_window) as (opened, visible):
|
||||||
if not opened:
|
self.show_preset_manager_window = visible
|
||||||
imgui.end(); return
|
if opened:
|
||||||
|
self._render_preset_manager_content(is_embedded=is_embedded)
|
||||||
|
else:
|
||||||
self._render_preset_manager_content(is_embedded=is_embedded)
|
self._render_preset_manager_content(is_embedded=is_embedded)
|
||||||
if not is_embedded: imgui.end()
|
|
||||||
|
|
||||||
def _render_tool_preset_manager_content(self, is_embedded: bool = False) -> None:
|
def _render_tool_preset_manager_content(self, is_embedded: bool = False) -> None:
|
||||||
avail = imgui.get_content_region_avail()
|
avail = imgui.get_content_region_avail()
|
||||||
@@ -2382,16 +2379,16 @@ class App:
|
|||||||
if not is_embedded:
|
if not is_embedded:
|
||||||
if imgui.button("Close##tp", imgui.ImVec2(100, 0)): self.show_tool_preset_manager_window = False
|
if imgui.button("Close##tp", imgui.ImVec2(100, 0)): self.show_tool_preset_manager_window = False
|
||||||
imgui.end_table()
|
imgui.end_table()
|
||||||
|
|
||||||
def _render_tool_preset_manager_window(self, is_embedded: bool = False) -> None:
|
def _render_tool_preset_manager_window(self, is_embedded: bool = False) -> None:
|
||||||
if not self.show_tool_preset_manager_window and not is_embedded: return
|
if not self.show_tool_preset_manager_window and not is_embedded: return
|
||||||
if not is_embedded:
|
if not is_embedded:
|
||||||
imgui.set_next_window_size(imgui.ImVec2(1000, 800), imgui.Cond_.first_use_ever)
|
imgui.set_next_window_size(imgui.ImVec2(1000, 800), imgui.Cond_.first_use_ever)
|
||||||
opened, self.show_tool_preset_manager_window = imgui.begin("Tool Preset Manager", self.show_tool_preset_manager_window)
|
with imscope.window("Tool Preset Manager", self.show_tool_preset_manager_window) as (opened, visible):
|
||||||
if not opened:
|
self.show_tool_preset_manager_window = visible
|
||||||
imgui.end(); return
|
if opened:
|
||||||
self._render_tool_preset_manager_content(is_embedded=is_embedded)
|
self._render_tool_preset_manager_content(is_embedded=is_embedded)
|
||||||
if not is_embedded: imgui.end()
|
else:
|
||||||
|
self._render_preset_manager_content(is_embedded=is_embedded)
|
||||||
|
|
||||||
def _render_persona_editor_window(self, is_embedded: bool = False) -> None:
|
def _render_persona_editor_window(self, is_embedded: bool = False) -> None:
|
||||||
if not self.show_persona_editor_window and not is_embedded: return
|
if not self.show_persona_editor_window and not is_embedded: return
|
||||||
@@ -2557,7 +2554,6 @@ class App:
|
|||||||
if imgui.button("Close##pers", imgui.ImVec2(100, 0)):
|
if imgui.button("Close##pers", imgui.ImVec2(100, 0)):
|
||||||
self.show_persona_editor_window = False
|
self.show_persona_editor_window = False
|
||||||
imgui.end_table()
|
imgui.end_table()
|
||||||
if not is_embedded: imgui.end()
|
|
||||||
|
|
||||||
def _render_projects_panel(self) -> None:
|
def _render_projects_panel(self) -> None:
|
||||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_projects_panel")
|
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_projects_panel")
|
||||||
@@ -2908,12 +2904,9 @@ class App:
|
|||||||
[C: tests/test_log_management_ui.py:test_render_log_management_logic]
|
[C: tests/test_log_management_ui.py:test_render_log_management_logic]
|
||||||
"""
|
"""
|
||||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_log_management")
|
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_log_management")
|
||||||
exp, opened = imgui.begin("Log Management", self.show_windows["Log Management"])
|
with imscope.window("Log Management", self.show_windows["Log Management"]) as (exp, opened):
|
||||||
self.show_windows["Log Management"] = bool(opened)
|
self.show_windows["Log Management"] = bool(opened)
|
||||||
if not exp:
|
if exp:
|
||||||
imgui.end()
|
|
||||||
return
|
|
||||||
|
|
||||||
if self._log_registry is None:
|
if self._log_registry is None:
|
||||||
self._log_registry = log_registry.LogRegistry(str(paths.get_logs_dir() / "log_registry.toml"))
|
self._log_registry = log_registry.LogRegistry(str(paths.get_logs_dir() / "log_registry.toml"))
|
||||||
else:
|
else:
|
||||||
@@ -2983,17 +2976,12 @@ class App:
|
|||||||
imgui.end_table()
|
imgui.end_table()
|
||||||
|
|
||||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_log_management")
|
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_log_management")
|
||||||
imgui.end()
|
|
||||||
|
|
||||||
def _render_diagnostics_panel(self) -> None:
|
def _render_diagnostics_panel(self) -> None:
|
||||||
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_diagnostics_panel")
|
if self.perf_profiling_enabled: self.perf_monitor.start_component("_render_diagnostics_panel")
|
||||||
exp, opened = imgui.begin("Diagnostics", self.show_windows.get("Diagnostics", False))
|
with imscope.window("Diagnostics", self.show_windows.get("Diagnostics", False)) as (exp, opened):
|
||||||
self.show_windows["Diagnostics"] = bool(opened)
|
self.show_windows["Diagnostics"] = bool(opened)
|
||||||
if not exp:
|
if exp:
|
||||||
imgui.end()
|
|
||||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_diagnostics_panel")
|
|
||||||
return
|
|
||||||
|
|
||||||
metrics = self.perf_monitor.get_metrics()
|
metrics = self.perf_monitor.get_metrics()
|
||||||
imgui.text("Performance Telemetry")
|
imgui.text("Performance Telemetry")
|
||||||
imgui.same_line()
|
imgui.same_line()
|
||||||
@@ -3093,7 +3081,6 @@ class App:
|
|||||||
imgui.end_table()
|
imgui.end_table()
|
||||||
|
|
||||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_diagnostics_panel")
|
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_diagnostics_panel")
|
||||||
imgui.end()
|
|
||||||
|
|
||||||
def _render_discussion_tab(self) -> None:
|
def _render_discussion_tab(self) -> None:
|
||||||
imgui.begin_child("HistoryChild", size=(0, -self.ui_discussion_split_h))
|
imgui.begin_child("HistoryChild", size=(0, -self.ui_discussion_split_h))
|
||||||
@@ -3215,7 +3202,8 @@ class App:
|
|||||||
|
|
||||||
grouped_files = aggregate.group_files_by_dir(self.context_files)
|
grouped_files = aggregate.group_files_by_dir(self.context_files)
|
||||||
|
|
||||||
if imgui.begin_table("ctx_comp_table", 2, imgui.TableFlags_.resizable | imgui.TableFlags_.borders):
|
with imscope.table("ctx_comp_table", 2, imgui.TableFlags_.resizable | imgui.TableFlags_.borders) as active:
|
||||||
|
if active:
|
||||||
imgui.table_setup_column("File", imgui.TableColumnFlags_.width_stretch)
|
imgui.table_setup_column("File", imgui.TableColumnFlags_.width_stretch)
|
||||||
imgui.table_setup_column("Flags", imgui.TableColumnFlags_.width_fixed, 200)
|
imgui.table_setup_column("Flags", imgui.TableColumnFlags_.width_fixed, 200)
|
||||||
imgui.table_headers_row()
|
imgui.table_headers_row()
|
||||||
@@ -3225,7 +3213,7 @@ class App:
|
|||||||
for dir_name, g_files in grouped_files.items():
|
for dir_name, g_files in grouped_files.items():
|
||||||
imgui.table_next_row()
|
imgui.table_next_row()
|
||||||
imgui.table_set_column_index(0)
|
imgui.table_set_column_index(0)
|
||||||
is_open = imgui.tree_node_ex(f"{dir_name}##dir_{dir_name}", imgui.TreeNodeFlags_.default_open)
|
with imscope.tree_node_ex(f"{dir_name}##dir_{dir_name}", imgui.TreeNodeFlags_.default_open) as is_open:
|
||||||
imgui.table_set_column_index(1)
|
imgui.table_set_column_index(1)
|
||||||
if is_open:
|
if is_open:
|
||||||
for f_item in g_files:
|
for f_item in g_files:
|
||||||
@@ -3324,9 +3312,6 @@ class App:
|
|||||||
if hasattr(f_item, "custom_slices") and f_item.custom_slices:
|
if hasattr(f_item, "custom_slices") and f_item.custom_slices:
|
||||||
imgui.same_line()
|
imgui.same_line()
|
||||||
imgui.text_colored(imgui.ImVec4(1.0, 0.5, 0.0, 1.0), "[Slices Active]")
|
imgui.text_colored(imgui.ImVec4(1.0, 0.5, 0.0, 1.0), "[Slices Active]")
|
||||||
imgui.tree_pop()
|
|
||||||
|
|
||||||
imgui.end_table()
|
|
||||||
# Context Composition collasping header
|
# Context Composition collasping header
|
||||||
|
|
||||||
imgui.separator()
|
imgui.separator()
|
||||||
@@ -4089,6 +4074,7 @@ def hello():
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
is_blinking = False
|
is_blinking = False
|
||||||
|
blink_color = vec4(0, 0, 0, 0)
|
||||||
if self._is_blinking:
|
if self._is_blinking:
|
||||||
elapsed = time.time() - self._blink_start_time
|
elapsed = time.time() - self._blink_start_time
|
||||||
if elapsed > 1.5:
|
if elapsed > 1.5:
|
||||||
@@ -4097,23 +4083,18 @@ def hello():
|
|||||||
is_blinking = True
|
is_blinking = True
|
||||||
val = math.sin(elapsed * 8 * math.pi)
|
val = math.sin(elapsed * 8 * math.pi)
|
||||||
alpha = 50/255 if val > 0 else 0
|
alpha = 50/255 if val > 0 else 0
|
||||||
imgui.push_style_color(imgui.Col_.frame_bg, vec4(0, 255, 0, alpha))
|
blink_color = vec4(0, 255, 0, alpha)
|
||||||
imgui.push_style_color(imgui.Col_.child_bg, vec4(0, 255, 0, alpha))
|
|
||||||
# --- Always Render Content ---
|
|
||||||
|
|
||||||
imgui.begin_child("response_scroll_area", imgui.ImVec2(0, -40), True)
|
with imscope.style_color(imgui.Col_.frame_bg, blink_color) if is_blinking else nullcontext():
|
||||||
|
with imscope.style_color(imgui.Col_.child_bg, blink_color) if is_blinking else nullcontext():
|
||||||
|
with imscope.child("response_scroll_area", imgui.ImVec2(0, -40), True):
|
||||||
is_nerv = theme.is_nerv_active()
|
is_nerv = theme.is_nerv_active()
|
||||||
if is_nerv: imgui.push_style_color(imgui.Col_.text, vec4(80, 255, 80))
|
with imscope.style_color(imgui.Col_.text, vec4(80, 255, 80)) if is_nerv else nullcontext():
|
||||||
|
|
||||||
segments, parsed_response = thinking_parser.parse_thinking_trace(self.ai_response)
|
segments, parsed_response = thinking_parser.parse_thinking_trace(self.ai_response)
|
||||||
if segments:
|
if segments:
|
||||||
self._render_thinking_trace([{"content": s.content, "marker": s.marker} for s in segments], 9999)
|
self._render_thinking_trace([{"content": s.content, "marker": s.marker} for s in segments], 9999)
|
||||||
|
|
||||||
markdown_helper.render(parsed_response, context_id="response")
|
markdown_helper.render(parsed_response, context_id="response")
|
||||||
|
|
||||||
if is_nerv: imgui.pop_style_color()
|
|
||||||
imgui.end_child()
|
|
||||||
|
|
||||||
imgui.separator()
|
imgui.separator()
|
||||||
if imgui.button("-> History"):
|
if imgui.button("-> History"):
|
||||||
if self.ai_response:
|
if self.ai_response:
|
||||||
@@ -4122,8 +4103,6 @@ def hello():
|
|||||||
if segments:
|
if segments:
|
||||||
entry["thinking_segments"] = [{"content": s.content, "marker": s.marker} for s in segments]
|
entry["thinking_segments"] = [{"content": s.content, "marker": s.marker} for s in segments]
|
||||||
self.disc_entries.append(entry)
|
self.disc_entries.append(entry)
|
||||||
if is_blinking:
|
|
||||||
imgui.pop_style_color(2)
|
|
||||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_response_panel")
|
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_response_panel")
|
||||||
|
|
||||||
def _render_external_tools_panel(self) -> None:
|
def _render_external_tools_panel(self) -> None:
|
||||||
@@ -5188,34 +5167,6 @@ def hello():
|
|||||||
imgui.end()
|
imgui.end()
|
||||||
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_theme_panel")
|
if self.perf_profiling_enabled: self.perf_monitor.end_component("_render_theme_panel")
|
||||||
|
|
||||||
def _render_prior_session_view(self) -> None: imgui.push_style_color(imgui.Col_.child_bg, vec4(50, 40, 20))
|
|
||||||
if imgui.button("Exit Prior Session"): self.controller.cb_exit_prior_session(); self._comms_log_dirty = True
|
|
||||||
imgui.separator()
|
|
||||||
with imscope.child("prior_scroll"):
|
|
||||||
clipper = imgui.ListClipper(); clipper.begin(len(self.prior_disc_entries))
|
|
||||||
while clipper.step():
|
|
||||||
for idx in range(clipper.display_start, clipper.display_end):
|
|
||||||
entry = self.prior_disc_entries[idx];
|
|
||||||
with imscope.id(f"prior_disc_{idx}"):
|
|
||||||
collapsed = entry.get("collapsed", False)
|
|
||||||
if imgui.button("+" if collapsed else "-"): entry["collapsed"] = not collapsed
|
|
||||||
imgui.same_line(); role, ts = entry.get("role", "??"), entry.get("ts", "")
|
|
||||||
imgui.text_colored(C_LBL, f"[{role}]")
|
|
||||||
if ts: imgui.same_line(); imgui.text_colored(vec4(160, 160, 160), str(ts))
|
|
||||||
content = entry.get("content", "")
|
|
||||||
if collapsed:
|
|
||||||
imgui.same_line(); preview = content.replace("\n", " ")[:80]
|
|
||||||
if len(content) > 80: preview += "..."
|
|
||||||
imgui.text_colored(vec4(180, 180, 180), preview)
|
|
||||||
else:
|
|
||||||
is_nerv = theme.is_nerv_active()
|
|
||||||
if is_nerv: imgui.push_style_color(imgui.Col_.text, vec4(80, 255, 80))
|
|
||||||
markdown_helper.render(content, context_id=f'prior_disc_{idx}')
|
|
||||||
if is_nerv: imgui.pop_style_color()
|
|
||||||
imgui.separator()
|
|
||||||
imgui.pop_style_color()
|
|
||||||
|
|
||||||
def _render_discussion_selector(self) -> None:
|
|
||||||
if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return
|
if not imgui.collapsing_header("Discussions", imgui.TreeNodeFlags_.default_open): return
|
||||||
names = self._get_discussion_names(); grouped = {}
|
names = self._get_discussion_names(); grouped = {}
|
||||||
for name in names:
|
for name in names:
|
||||||
|
|||||||
@@ -160,3 +160,39 @@ class _ScopeTabItem:
|
|||||||
if self._expanded:
|
if self._expanded:
|
||||||
imgui.end_tab_item()
|
imgui.end_tab_item()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def style_color(col: int, val: Any): return _ScopeStyleColor(col, val)
|
||||||
|
class _ScopeStyleColor:
|
||||||
|
def __init__(self, col: int, val: Any):
|
||||||
|
self._col = col
|
||||||
|
self._val = val
|
||||||
|
def __enter__(self):
|
||||||
|
imgui.push_style_color(self._col, self._val)
|
||||||
|
def __exit__(self, *args):
|
||||||
|
imgui.pop_style_color()
|
||||||
|
return False
|
||||||
|
|
||||||
|
def style_var(var: int, val: Any): return _ScopeStyleVar(var, val)
|
||||||
|
class _ScopeStyleVar:
|
||||||
|
def __init__(self, var: int, val: Any):
|
||||||
|
self._var = var
|
||||||
|
self._val = val
|
||||||
|
def __enter__(self):
|
||||||
|
imgui.push_style_var(self._var, self._val)
|
||||||
|
def __exit__(self, *args):
|
||||||
|
imgui.pop_style_var()
|
||||||
|
return False
|
||||||
|
|
||||||
|
def tree_node_ex(label: str, flags: int = 0): return _ScopeTreeNodeEx(label, flags)
|
||||||
|
class _ScopeTreeNodeEx:
|
||||||
|
def __init__(self, label: str, flags: int):
|
||||||
|
self._label = label
|
||||||
|
self._flags = flags
|
||||||
|
self._opened = False
|
||||||
|
def __enter__(self):
|
||||||
|
self._opened = imgui.tree_node_ex(self._label, self._flags)
|
||||||
|
return self._opened
|
||||||
|
def __exit__(self, *args):
|
||||||
|
if self._opened:
|
||||||
|
imgui.tree_pop()
|
||||||
|
return False
|
||||||
|
|||||||
Reference in New Issue
Block a user