mirror of
https://github.com/lihop/godot-xterm.git
synced 2024-11-24 18:20:25 +01:00
256 lines
6.1 KiB
GDScript
256 lines
6.1 KiB
GDScript
@tool
|
|
extends Control
|
|
|
|
var _interface = null
|
|
var _font = null
|
|
var _font_size = null
|
|
var _editors = null # script_text_editor_controls.gd
|
|
var _output_control = null
|
|
|
|
@onready var _ctrls = {
|
|
tree = $VBox/Output/Scroll/Tree,
|
|
toolbar =
|
|
{
|
|
toolbar = $VBox/Toolbar,
|
|
collapse = $VBox/Toolbar/Collapse,
|
|
collapse_all = $VBox/Toolbar/CollapseAll,
|
|
expand = $VBox/Toolbar/Expand,
|
|
expand_all = $VBox/Toolbar/ExpandAll,
|
|
hide_passing = $VBox/Toolbar/HidePassing,
|
|
show_script = $VBox/Toolbar/ShowScript,
|
|
scroll_output = $VBox/Toolbar/ScrollOutput
|
|
}
|
|
}
|
|
|
|
|
|
func _ready():
|
|
var f = null
|
|
if $FontSampler.get_label_settings() == null:
|
|
f = get_theme_default_font()
|
|
else:
|
|
f = $FontSampler.get_label_settings().font
|
|
var s_size = f.get_string_size("000 of 000 passed")
|
|
_ctrls.tree.set_summary_min_width(s_size.x)
|
|
|
|
_set_toolbutton_icon(_ctrls.toolbar.collapse, "CollapseTree", "c")
|
|
_set_toolbutton_icon(_ctrls.toolbar.collapse_all, "CollapseTree", "c")
|
|
_set_toolbutton_icon(_ctrls.toolbar.expand, "ExpandTree", "e")
|
|
_set_toolbutton_icon(_ctrls.toolbar.expand_all, "ExpandTree", "e")
|
|
_set_toolbutton_icon(_ctrls.toolbar.show_script, "Script", "ss")
|
|
_set_toolbutton_icon(_ctrls.toolbar.scroll_output, "Font", "so")
|
|
|
|
_ctrls.tree.hide_passing = true
|
|
_ctrls.toolbar.hide_passing.button_pressed = false
|
|
_ctrls.tree.show_orphans = true
|
|
_ctrls.tree.item_selected.connect(_on_item_selected)
|
|
|
|
if get_parent() == get_tree().root:
|
|
_test_running_setup()
|
|
|
|
call_deferred("_update_min_width")
|
|
|
|
|
|
func _test_running_setup():
|
|
_ctrls.tree.hide_passing = true
|
|
_ctrls.tree.show_orphans = true
|
|
var _gut_config = load("res://addons/gut/gut_config.gd").new()
|
|
_gut_config.load_panel_options("res://.gut_editor_config.json")
|
|
set_font(
|
|
_gut_config.options.panel_options.font_name, _gut_config.options.panel_options.font_size
|
|
)
|
|
|
|
_ctrls.toolbar.hide_passing.text = "[hp]"
|
|
_ctrls.tree.load_json_file("user://.gut_editor.json")
|
|
|
|
|
|
func _set_toolbutton_icon(btn, icon_name, text):
|
|
if Engine.is_editor_hint():
|
|
btn.icon = get_theme_icon(icon_name, "EditorIcons")
|
|
else:
|
|
btn.text = str("[", text, "]")
|
|
|
|
|
|
func _update_min_width():
|
|
custom_minimum_size.x = _ctrls.toolbar.toolbar.size.x
|
|
|
|
|
|
func _open_script_in_editor(path, line_number):
|
|
if _interface == null:
|
|
print("Too soon, wait a bit and try again.")
|
|
return
|
|
|
|
var r = load(path)
|
|
if line_number != null and line_number != -1:
|
|
_interface.edit_script(r, line_number)
|
|
else:
|
|
_interface.edit_script(r)
|
|
|
|
if _ctrls.toolbar.show_script.pressed:
|
|
_interface.set_main_screen_editor("Script")
|
|
|
|
|
|
# starts at beginning of text edit and searches for each search term, moving
|
|
# through the text as it goes; ensuring that, when done, it found the first
|
|
# occurance of the last srting that happend after the first occurance of
|
|
# each string before it. (Generic way of searching for a method name in an
|
|
# inner class that may have be a duplicate of a method name in a different
|
|
# inner class)
|
|
func _get_line_number_for_seq_search(search_strings, te):
|
|
if te == null:
|
|
print("No Text editor to get line number for")
|
|
return 0
|
|
|
|
var result = null
|
|
var line = Vector2i(0, 0)
|
|
var s_flags = 0
|
|
|
|
var i = 0
|
|
var string_found = true
|
|
while i < search_strings.size() and string_found:
|
|
result = te.search(search_strings[i], s_flags, line.y, line.x)
|
|
if result.x != -1:
|
|
line = result
|
|
else:
|
|
string_found = false
|
|
i += 1
|
|
|
|
return line.y
|
|
|
|
|
|
func _goto_code(path, line, method_name = "", inner_class = ""):
|
|
if _interface == null:
|
|
print("going to ", [path, line, method_name, inner_class])
|
|
return
|
|
|
|
_open_script_in_editor(path, line)
|
|
if line == -1:
|
|
var search_strings = []
|
|
if inner_class != "":
|
|
search_strings.append(inner_class)
|
|
|
|
if method_name != "":
|
|
search_strings.append(method_name)
|
|
|
|
await get_tree().process_frame
|
|
line = _get_line_number_for_seq_search(search_strings, _editors.get_current_text_edit())
|
|
if line != null and line != -1:
|
|
_interface.get_script_editor().goto_line(line)
|
|
|
|
|
|
func _goto_output(path, method_name, inner_class):
|
|
if _output_control == null:
|
|
return
|
|
|
|
var search_strings = [path]
|
|
|
|
if inner_class != "":
|
|
search_strings.append(inner_class)
|
|
|
|
if method_name != "":
|
|
search_strings.append(method_name)
|
|
|
|
var line = _get_line_number_for_seq_search(search_strings, _output_control.get_rich_text_edit())
|
|
if line != null and line != -1:
|
|
_output_control.scroll_to_line(line)
|
|
|
|
|
|
# --------------
|
|
# Events
|
|
# --------------
|
|
func _on_Collapse_pressed():
|
|
collapse_selected()
|
|
|
|
|
|
func _on_Expand_pressed():
|
|
expand_selected()
|
|
|
|
|
|
func _on_CollapseAll_pressed():
|
|
collapse_all()
|
|
|
|
|
|
func _on_ExpandAll_pressed():
|
|
expand_all()
|
|
|
|
|
|
func _on_Hide_Passing_pressed():
|
|
_ctrls.tree.hide_passing = !_ctrls.toolbar.hide_passing.button_pressed
|
|
_ctrls.tree.load_json_file("user://.gut_editor.json")
|
|
|
|
|
|
func _on_item_selected(script_path, inner_class, test_name, line):
|
|
if _ctrls.toolbar.show_script.button_pressed:
|
|
_goto_code(script_path, line, test_name, inner_class)
|
|
if _ctrls.toolbar.scroll_output.button_pressed:
|
|
_goto_output(script_path, test_name, inner_class)
|
|
|
|
|
|
# --------------
|
|
# Public
|
|
# --------------
|
|
func add_centered_text(t):
|
|
_ctrls.tree.add_centered_text(t)
|
|
|
|
|
|
func clear_centered_text():
|
|
_ctrls.tree.clear_centered_text()
|
|
|
|
|
|
func clear():
|
|
_ctrls.tree.clear()
|
|
clear_centered_text()
|
|
|
|
|
|
func set_interface(which):
|
|
_interface = which
|
|
|
|
|
|
func set_script_text_editors(value):
|
|
_editors = value
|
|
|
|
|
|
func collapse_all():
|
|
_ctrls.tree.collapse_all()
|
|
|
|
|
|
func expand_all():
|
|
_ctrls.tree.expand_all()
|
|
|
|
|
|
func collapse_selected():
|
|
var item = _ctrls.tree.get_selected()
|
|
if item != null:
|
|
_ctrls.tree.set_collapsed_on_all(item, true)
|
|
|
|
|
|
func expand_selected():
|
|
var item = _ctrls.tree.get_selected()
|
|
if item != null:
|
|
_ctrls.tree.set_collapsed_on_all(item, false)
|
|
|
|
|
|
func set_show_orphans(should):
|
|
_ctrls.tree.show_orphans = should
|
|
|
|
|
|
func set_font(font_name, size):
|
|
pass
|
|
|
|
|
|
# var dyn_font = FontFile.new()
|
|
# var font_data = FontFile.new()
|
|
# font_data.font_path = 'res://addons/gut/fonts/' + font_name + '-Regular.ttf'
|
|
# font_data.antialiased = true
|
|
# dyn_font.font_data = font_data
|
|
#
|
|
# _font = dyn_font
|
|
# _font.size = size
|
|
# _font_size = size
|
|
|
|
|
|
func set_output_control(value):
|
|
_output_control = value
|
|
|
|
|
|
func load_json_results(j):
|
|
_ctrls.tree.load_json_results(j)
|