113 lines
4.2 KiB
GDScript
113 lines
4.2 KiB
GDScript
@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
|