feat(context): Interactive Text Slice Highlighting with Fuzzy Anchors
This commit is contained in:
+42
-2
@@ -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"):
|
||||
|
||||
Reference in New Issue
Block a user