feat(context): Interactive Text Slice Highlighting with Fuzzy Anchors

This commit is contained in:
2026-05-10 13:57:01 -04:00
parent e9eda04a6c
commit 16b99d16a4
5 changed files with 154 additions and 6 deletions
+42 -2
View File
@@ -242,6 +242,7 @@ class App:
self.ui_inspecting_ast_file = None
self._cached_ast_nodes = []
self._cached_ast_file_path = ''
self.ui_editing_slices_file = None
"""UI-level wrapper for approving a pending tool execution ask."""
self._handle_approve_ask()
@@ -1259,7 +1260,37 @@ class App:
imgui.set_next_window_size(imgui.ImVec2(900, 700), imgui.Cond_.first_use_ever)
expanded, opened = imgui.begin(f"Text Viewer - {self.text_viewer_title}", self.show_text_viewer)
self.show_text_viewer = bool(opened)
if not opened:
self.ui_editing_slices_file = None
if expanded:
if self.ui_editing_slices_file is not None:
imgui.text("Slice Management")
if imgui.button("Add Selection as Slice"):
selected = self._text_viewer_editor.get_selected_text()
if selected:
# Find line range
full = self.text_viewer_content
start_idx = full.find(selected)
if start_idx != -1:
end_idx = start_idx + len(selected)
s_line = full.count('\n', 0, start_idx) + 1
e_line = full.count('\n', 0, end_idx) + 1
from src.fuzzy_anchor import FuzzyAnchor
slice_data = FuzzyAnchor.create_slice(full, s_line, e_line)
self.ui_editing_slices_file.custom_slices.append(slice_data)
# Render existing slices
to_remove = -1
for idx, slc in enumerate(self.ui_editing_slices_file.custom_slices):
imgui.text(f"Slice {idx+1}: Lines {slc['start_line']}-{slc['end_line']}")
imgui.same_line()
if imgui.button(f"Remove##slc{idx}"):
to_remove = idx
if to_remove != -1:
self.ui_editing_slices_file.custom_slices.pop(to_remove)
imgui.separator()
# Toolbar
if imgui.button("Copy"):
imgui.set_clipboard_text(self.text_viewer_content)
@@ -1274,14 +1305,14 @@ class App:
imgui.begin_child("tv_md_scroll", imgui.ImVec2(-1, -1), True)
markdown_helper.render(self.text_viewer_content, context_id='text_viewer')
imgui.end_child()
elif tv_type in renderer._lang_map:
elif tv_type in renderer._lang_map or self.ui_editing_slices_file is not None:
if self._text_viewer_editor is None:
self._text_viewer_editor = ced.TextEditor()
self._text_viewer_editor.set_read_only_enabled(True)
self._text_viewer_editor.set_show_line_numbers_enabled(True)
# Sync text and language
lang_id = renderer._lang_map[tv_type]
lang_id = renderer._lang_map.get(tv_type, ced.TextEditor.LanguageDefinitionId.none)
if self._text_viewer_editor.get_text().strip() != self.text_viewer_content.strip():
self._text_viewer_editor.set_text(self.text_viewer_content)
self._text_viewer_editor.set_language_definition(lang_id)
@@ -2710,6 +2741,15 @@ class App:
if imgui.button(f"[Inspect]##{i}"):
self.ui_inspecting_ast_file = f_item
imgui.open_popup('AST Inspector')
imgui.same_line()
if imgui.button(f"[Slices]##{i}"):
self.ui_editing_slices_file = f_item
f_path = f_item.path if hasattr(f_item, "path") else str(f_item)
self.text_viewer_title = f"Slices: {f_path}"
self.text_viewer_content = f_item.content or ""
self.text_viewer_type = 'cpp' if f_path.endswith(('.cpp', '.hpp', '.h')) else 'python' if f_path.endswith('.py') else 'text'
self.show_text_viewer = True
imgui.table_set_column_index(1)
if hasattr(f_item, "auto_aggregate"):