progress on context composition
This commit is contained in:
+92
-40
@@ -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 = ""
|
||||
|
||||
Reference in New Issue
Block a user