Bubble-Blower/addons/ai_assistant_hub/tools/assistant_tool_selection.gd

114 lines
4.2 KiB
GDScript3
Raw Normal View History

2025-01-25 21:40:19 +01:00
@tool
class_name AssistantToolSelection
var _plugin:EditorPlugin
var _code_editor:TextEdit
var _selected_script: Script
var _selected_code: String
var _selected_code_first_line: String
var _selected_code_last_line: String
var _selected_code_line_start: int
var _selected_code_line_start_column: int
var _selected_code_line_end: int
var _selected_code_line_end_column: int
func _init(plugin:EditorPlugin) -> void:
_plugin = plugin
func get_selection() -> String:
var script_editor:= _plugin.get_editor_interface().get_script_editor()
_code_editor = script_editor.get_current_editor().get_base_editor()
_selected_script = script_editor.get_current_script()
_selected_code = _code_editor.get_selected_text()
if _selected_code.strip_edges(true, true).length() == 0:
var curr_line = _code_editor.get_caret_line()
_code_editor.select(curr_line, 0, curr_line, line(curr_line).length())
_selected_code = _code_editor.get_selected_text().strip_edges(true, true)
if not _selected_code.is_empty():
#Make sure we don't start or end with empty lines, as that makes difficult to find the code again
var first_not_empty = line(first_line()).strip_edges(true, false)
while first_not_empty.is_empty() and first_line() + 1 <= last_line():
_code_editor.select(first_line() + 1, 0, last_line(), last_column())
first_not_empty = line(first_line()).strip_edges(true, false)
var last_not_empty = line(last_line()).strip_edges(false, true)
while last_not_empty.is_empty() and last_line() - 1 >= first_line():
_code_editor.select(first_line(), first_column(), last_line() - 1, line(last_line()-1).length())
last_not_empty = line(last_line()).strip_edges(false, true)
_selected_code = _code_editor.get_selected_text()
_selected_code_line_start = first_line()
_selected_code_line_start_column = first_column()
_selected_code_line_end = last_line()
_selected_code_line_end_column = last_column()
_selected_code_first_line = line(_selected_code_line_start)
_selected_code_last_line = line(_selected_code_line_end)
return _selected_code
func line(i:int) -> String:
return _code_editor.get_line(i)
func first_line() -> int:
return _code_editor.get_selection_from_line()
func first_column() -> int:
return _code_editor.get_selection_from_column()
func last_line() -> int:
return _code_editor.get_selection_to_line()
func last_column() -> int:
return _code_editor.get_selection_to_column()
func forget_selection() -> void:
_selected_script = null
# Attempts to select the original line range previously used and returns true on success.
func back_to_selection() -> bool:
if _selected_code.is_empty():
return false
#double check the script to edit is still open, if it's not open it
var editor_interface:EditorInterface = _plugin.get_editor_interface()
var curr_script:Script = editor_interface.get_script_editor().get_current_script()
if curr_script != _selected_script:
#print("The script for the original request was: %s" % _selected_script.resource_path)
#print("The script currently opened is: %s" % curr_script.resource_path)
print("Opening %s" % _selected_script.resource_path)
editor_interface.edit_script(_selected_script)
forget_selection()
var script_editor:= _plugin.get_editor_interface().get_script_editor()
var code_editor:TextEdit = script_editor.get_current_editor().get_base_editor()
var curr_selection: String = code_editor.get_selected_text()
if _selected_code != curr_selection:
print("The selection changed. Finding: %s" % _selected_code_first_line)
var search_start:Vector2i = code_editor.search(_selected_code_first_line, TextEdit.SearchFlags.SEARCH_MATCH_CASE, 0, 0)
if search_start.x == -1:
return false
else:
#print("First line found. Finding: %s" % _selected_code_last_line)
var original_line_diff = _selected_code_line_end - _selected_code_line_start
var search_end:Vector2i = code_editor.search(_selected_code_last_line, TextEdit.SearchFlags.SEARCH_MATCH_CASE, search_start.y + original_line_diff, 0)
if search_end.x == -1:
return false
else:
#print("Last line found.")
var line_diff = search_end.y - search_start.y
if original_line_diff == line_diff:
code_editor.select(search_start.y, search_start.x, search_end.y, _selected_code_line_end_column)
else:
return false
return true