Private
Public Access
0
0

progress on context composition

This commit is contained in:
2026-05-17 07:27:55 -04:00
parent c1487d32bb
commit a5c0569417
4 changed files with 194 additions and 119 deletions
+92 -40
View File
@@ -627,7 +627,16 @@ class App:
[C: tests/test_context_presets.py:test_load_context_preset, tests/test_context_presets.py:test_load_nonexistent_preset]
"""
preset = self.controller.load_context_preset(name)
self.context_files = [models.FileItem(path=f.path, view_mode=f.view_mode) for f in preset.files]
from src import models
import copy
self.context_files = []
for f in preset.files:
fi = models.FileItem(path=f.path, view_mode=f.view_mode)
fi.custom_slices = copy.deepcopy(f.custom_slices) if hasattr(f, 'custom_slices') else []
fi.ast_mask = copy.deepcopy(f.ast_mask) if hasattr(f, 'ast_mask') else {}
fi.ast_signatures = getattr(f, 'ast_signatures', False)
fi.ast_definitions = getattr(f, 'ast_definitions', False)
self.context_files.append(fi)
self.screenshots = list(preset.screenshots)
self.ui_file_paths = [f.path for f in preset.files]
self.ui_screenshot_paths = list(preset.screenshots)
@@ -3017,7 +3026,6 @@ def render_ast_inspector_modal(app: App) -> None:
if imgui.is_item_hovered():
app._hovered_ast_node = full_path
# Calculate space left and align radio buttons to the right
btn_width = 150 # Estimated width of the 3 radio buttons
avail_width = imgui.get_content_region_avail().x
if avail_width > btn_width:
@@ -3255,7 +3263,6 @@ def render_context_files_table(app: App) -> None:
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', {})
preset_names = [""] + sorted(presets.keys())
active = getattr(app, "ui_active_context_preset", "")
@@ -3264,47 +3271,86 @@ def render_context_presets(app: App) -> None:
idx = preset_names.index(active)
except ValueError:
idx = 0
ch, new_idx = imgui.combo("##ctx_preset", idx, preset_names)
if ch:
app.ui_active_context_preset = preset_names[new_idx]
if preset_names[new_idx]: app.load_context_preset(preset_names[new_idx])
imgui.same_line()
changed, new_name = imgui.input_text("##new_preset", getattr(app, "ui_new_context_preset_name", ""))
if changed: app.ui_new_context_preset_name = new_name
imgui.same_line()
if imgui.button("Save##ctx") or getattr(app, "_pending_save_ctx_click", False):
app._pending_save_ctx_click = False
name = getattr(app, "ui_new_context_preset_name", "").strip()
if name:
missing = []
root = app.controller.active_project_root
for f in app.context_files:
path = f.path if hasattr(f, "path") else str(f)
if not os.path.isabs(path):
full_path = os.path.join(root, path)
else:
full_path = path
if not os.path.exists(full_path):
missing.append(path)
if missing:
app.missing_context_files = missing
app.show_missing_files_modal = True
app.target_context_preset_name = name
else:
with imscope.table("ctx_presets_layout", 2, imgui.TableFlags_.none):
imgui.table_next_column()
imgui.set_next_item_width(-1)
ch, new_idx = imgui.combo("##ctx_preset", idx, preset_names)
if ch:
app.ui_active_context_preset = preset_names[new_idx]
if preset_names[new_idx]:
app.controller.load_context_preset(preset_names[new_idx])
app.controller._refresh_from_project()
app.context_files = list(app.controller.files)
imgui.table_next_column()
if active:
if imgui.button("Update##override", imgui.ImVec2(-1, 0)):
preset_files = []
for f in app.context_files:
import copy
from src import models
p = f.path if hasattr(f, 'path') else str(f)
vm = f.view_mode if hasattr(f, 'view_mode') else 'summary'
preset_files.append(models.ContextFileEntry(path=p, view_mode=vm))
preset = models.ContextPreset(name=name, files=preset_files, screenshots=list(app.screenshots))
slc = copy.deepcopy(f.custom_slices) if hasattr(f, 'custom_slices') else []
msk = copy.deepcopy(f.ast_mask) if hasattr(f, 'ast_mask') else {}
sig = f.ast_signatures if hasattr(f, 'ast_signatures') else False
dfn = f.ast_definitions if hasattr(f, 'ast_definitions') else False
preset_files.append(models.ContextFileEntry(path=p, view_mode=vm, custom_slices=slc, ast_mask=msk, ast_signatures=sig, ast_definitions=dfn))
preset = models.ContextPreset(name=active, files=preset_files, screenshots=list(app.screenshots))
app.controller.save_context_preset(preset)
app.ui_new_context_preset_name = ""
imgui.same_line()
if imgui.button("Delete##ctx"):
if getattr(app, "ui_active_context_preset", ""):
app.delete_context_preset(app.ui_active_context_preset)
app.ui_active_context_preset = ""
else:
imgui.text_disabled("No active preset")
imgui.table_next_row()
imgui.table_next_column()
imgui.set_next_item_width(-1)
changed, new_name = imgui.input_text("##new_preset", getattr(app, "ui_new_context_preset_name", ""))
if changed: app.ui_new_context_preset_name = new_name
imgui.table_next_column()
if imgui.button("Save As##ctx", imgui.ImVec2(-1, 0)) or getattr(app, "_pending_save_ctx_click", False):
app._pending_save_ctx_click = False
name = getattr(app, "ui_new_context_preset_name", "").strip()
if name:
missing = []
root = app.controller.active_project_root
for f in app.context_files:
path = f.path if hasattr(f, "path") else str(f)
if not os.path.isabs(path):
full_path = os.path.join(root, path)
else:
full_path = path
if not os.path.exists(full_path):
missing.append(path)
if missing:
app.missing_context_files = missing
app.show_missing_files_modal = True
app.target_context_preset_name = name
else:
preset_files = []
for f in app.context_files:
import copy
from src import models
p = f.path if hasattr(f, 'path') else str(f)
vm = f.view_mode if hasattr(f, 'view_mode') else 'summary'
slc = copy.deepcopy(f.custom_slices) if hasattr(f, 'custom_slices') else []
msk = copy.deepcopy(f.ast_mask) if hasattr(f, 'ast_mask') else {}
sig = f.ast_signatures if hasattr(f, 'ast_signatures') else False
dfn = f.ast_definitions if hasattr(f, 'ast_definitions') else False
preset_files.append(models.ContextFileEntry(path=p, view_mode=vm, custom_slices=slc, ast_mask=msk, ast_signatures=sig, ast_definitions=dfn))
preset = models.ContextPreset(name=name, files=preset_files, screenshots=list(app.screenshots))
app.controller.save_context_preset(preset)
app.ui_new_context_preset_name = ""
if active:
imgui.table_next_row()
imgui.table_next_column()
imgui.table_next_column()
if imgui.button("Delete Active", imgui.ImVec2(-1, 0)):
app.delete_context_preset(active)
app.ui_active_context_preset = ""
def render_snapshot_tab(app: App) -> None:
if imgui.begin_tab_bar("snapshot_tabs"):
@@ -5380,9 +5426,15 @@ def render_context_modals(app: App) -> None:
name = app.target_context_preset_name
preset_files = []
for f in app.context_files:
import copy
from src import models
p = f.path if hasattr(f, 'path') else str(f)
vm = f.view_mode if hasattr(f, 'view_mode') else 'summary'
preset_files.append(models.ContextFileEntry(path=p, view_mode=vm))
slc = copy.deepcopy(f.custom_slices) if hasattr(f, 'custom_slices') else []
msk = copy.deepcopy(f.ast_mask) if hasattr(f, 'ast_mask') else {}
sig = f.ast_signatures if hasattr(f, 'ast_signatures') else False
dfn = f.ast_definitions if hasattr(f, 'ast_definitions') else False
preset_files.append(models.ContextFileEntry(path=p, view_mode=vm, custom_slices=slc, ast_mask=msk, ast_signatures=sig, ast_definitions=dfn))
preset = models.ContextPreset(name=name, files=preset_files, screenshots=list(app.screenshots))
app.controller.save_context_preset(preset)
app.ui_new_context_preset_name = ""