Private
Public Access
0
0

feat(presets): Implement NamedViewPresets for per-file view settings

This commit is contained in:
2026-05-11 18:31:56 -04:00
parent 6e53906715
commit cb0fa89730
4 changed files with 213 additions and 0 deletions
+43
View File
@@ -226,6 +226,7 @@ class AppController:
self._pending_actions: Dict[str, ConfirmDialog] = {}
self._pending_ask_dialog: bool = False
self.mcp_config: models.MCPConfiguration = models.MCPConfiguration()
self.view_presets: list[models.NamedViewPreset] = []
self.rag_config: Optional[models.RAGConfig] = None
self.rag_engine: Optional[rag_engine.RAGEngine] = None
self.rag_status: str = 'idle'
@@ -2449,6 +2450,12 @@ class AppController:
self.tool_presets = self.tool_preset_manager.load_all_presets()
self.bias_profiles = self.tool_preset_manager.load_all_bias_profiles()
raw_presets = proj.get("view_presets", [])
if isinstance(raw_presets, dict):
self.view_presets = [models.NamedViewPreset.from_dict({"name": name, **data}) for name, data in raw_presets.items()]
else:
self.view_presets = [models.NamedViewPreset.from_dict(p) for p in raw_presets if isinstance(p, dict)]
if self.rag_config and self.rag_config.enabled:
self._rebuild_rag_index()
@@ -2561,6 +2568,41 @@ class AppController:
self.persona_manager.delete_persona(name, scope)
self.personas = self.persona_manager.load_all()
def _cb_save_view_preset(self, name: str, f_item: models.FileItem) -> None:
"""
[C: src/gui_2.py:App._render_files_panel]
"""
preset = models.NamedViewPreset(
name=name,
view_mode=f_item.view_mode,
ast_mask=copy.deepcopy(f_item.ast_mask) if hasattr(f_item, "ast_mask") else {},
custom_slices=copy.deepcopy(f_item.custom_slices) if hasattr(f_item, "custom_slices") else []
)
for i, vp in enumerate(self.view_presets):
if vp.name == name:
self.view_presets[i] = preset
break
else:
self.view_presets.append(preset)
self._flush_to_project()
def _cb_apply_view_preset(self, name: str, f_item: models.FileItem) -> None:
"""
[C: src/gui_2.py:App._render_files_panel]
"""
preset = next((vp for vp in self.view_presets if vp.name == name), None)
if preset:
f_item.view_mode = preset.view_mode
f_item.ast_mask = copy.deepcopy(preset.ast_mask)
f_item.custom_slices = copy.deepcopy(preset.custom_slices)
def _cb_delete_view_preset(self, name: str) -> None:
"""
[C: src/gui_2.py:App._render_files_panel]
"""
self.view_presets = [vp for vp in self.view_presets if vp.name != name]
self._flush_to_project()
def _cb_load_track(self, track_id: str) -> None:
"""
@@ -3011,6 +3053,7 @@ class AppController:
disc_sec["roles"] = self.disc_roles
disc_sec["active"] = self.active_discussion
disc_sec["auto_add"] = self.ui_auto_add_history
proj["view_presets"] = [vp.to_dict() for vp in self.view_presets]
# Save MMA State
mma_sec = proj.setdefault("mma", {})
mma_sec["epic"] = self.ui_epic_input