This commit is contained in:
2026-02-21 19:01:00 -05:00
parent 7427b7a9d7
commit 1d9c5a9b07
4 changed files with 787 additions and 81 deletions

94
gui.py
View File

@@ -10,6 +10,7 @@ import ai_client
from ai_client import ProviderError
import shell_runner
import session_logger
import theme
CONFIG_PATH = Path("config.toml")
PROVIDERS = ["gemini", "anthropic"]
@@ -459,6 +460,7 @@ class App:
"provider": self.current_provider,
"model": self.current_model,
}
theme.save_to_config(self.config)
def _do_generate(self) -> tuple[str, Path, list]:
self._flush_to_config()
@@ -792,6 +794,93 @@ class App:
self.disc_entries.append({"role": "AI", "content": resp})
self._rebuild_disc_list()
# ------------------------------------------------------------ theme
def cb_palette_changed(self, sender, app_data):
theme.apply(app_data, self._read_colour_overrides())
self._update_status(f"palette: {app_data}")
def cb_apply_font(self):
path = dpg.get_value("theme_font_path").strip()
size = dpg.get_value("theme_font_size")
theme.apply_font(path, size)
self._update_status(f"font applied: {path or '(default)'} @{size}px")
def cb_browse_font(self):
root = hide_tk_root()
p = filedialog.askopenfilename(
title="Select Font",
filetypes=[("TrueType / OpenType", "*.ttf *.otf"), ("All", "*.*")],
)
root.destroy()
if p:
dpg.set_value("theme_font_path", p)
self.cb_apply_font()
def cb_scale_changed(self, sender, app_data):
theme.set_scale(round(app_data, 2))
def _read_colour_overrides(self) -> dict:
return {}
def _build_theme_window(self):
t_cfg = self.config.get("theme", {})
cur_palette = t_cfg.get("palette", "DPG Default")
cur_font_path = t_cfg.get("font_path", "")
cur_font_size = float(t_cfg.get("font_size", 14.0))
cur_scale = float(t_cfg.get("scale", 1.0))
with dpg.window(
label="Theme",
tag="win_theme",
pos=(416, 516),
width=400,
height=280,
no_close=True,
):
dpg.add_text("Palette")
dpg.add_combo(
tag="theme_palette",
items=theme.PALETTE_NAMES,
default_value=cur_palette,
width=-1,
callback=self.cb_palette_changed,
)
dpg.add_separator()
dpg.add_text("Font")
with dpg.group(horizontal=True):
dpg.add_input_text(
tag="theme_font_path",
default_value=cur_font_path,
hint="Path to .ttf / .otf (blank = built-in)",
width=-148,
)
dpg.add_button(label="Browse##font", callback=self.cb_browse_font)
with dpg.group(horizontal=True):
dpg.add_text("Size (px)")
dpg.add_input_float(
tag="theme_font_size",
default_value=cur_font_size,
min_value=8.0,
max_value=64.0,
step=1.0,
width=90,
format="%.0f",
)
dpg.add_button(label="Apply Font", callback=self.cb_apply_font)
dpg.add_separator()
dpg.add_text("UI Scale (DPI)")
dpg.add_slider_float(
tag="theme_scale",
default_value=cur_scale,
min_value=0.5,
max_value=3.0,
width=-1,
callback=self.cb_scale_changed,
format="%.2f",
)
def _build_ui(self):
with dpg.window(
@@ -999,6 +1088,8 @@ class App:
with dpg.child_window(tag="comms_scroll", height=-1, border=False, horizontal_scrollbar=True):
pass
self._build_theme_window()
def run(self):
dpg.create_context()
dpg.configure_app(docking=True, docking_space=True, init_file="dpg_layout.ini")
@@ -1007,6 +1098,8 @@ class App:
dpg.show_viewport()
dpg.maximize_viewport()
self._build_ui()
theme.load_from_config(self.config)
self._rebuild_disc_list()
self._fetch_models(self.current_provider)
while dpg.is_dearpygui_running():
@@ -1037,3 +1130,4 @@ if __name__ == "__main__":