generated from mstar/godot-template
58 lines
1.4 KiB
GDScript
58 lines
1.4 KiB
GDScript
@tool
|
|
extends TextEdit
|
|
|
|
signal property_edited(property)
|
|
|
|
var focused_objects
|
|
var undo_redo
|
|
|
|
var _object_orig_text = ""
|
|
|
|
func _ready():
|
|
set_as_top_level(true)
|
|
connect("focus_exited", _on_focused_exited)
|
|
connect("text_changed", _on_text_changed)
|
|
hide()
|
|
|
|
func _on_text_changed():
|
|
if focused_objects:
|
|
# TODO: Option to set bbcode_text if is RichTextLabel
|
|
focused_objects.back().set("text", text)
|
|
|
|
func _on_focused_exited():
|
|
if get_menu().visible: # Support right-click context menu
|
|
return
|
|
|
|
hide()
|
|
# TODO: More efficient way to handle undo/redo of text, right now, whole chunks of string is cached everytime
|
|
change_text(focused_objects.back(), text)
|
|
|
|
# Popup at mouse position
|
|
func popup():
|
|
if focused_objects == null:
|
|
return
|
|
|
|
var focused_object = focused_objects.back()
|
|
if not ("text" in focused_object):
|
|
return
|
|
|
|
show()
|
|
global_position = get_viewport().get_mouse_position()
|
|
size = focused_object.size
|
|
text = focused_object.text
|
|
grab_focus()
|
|
|
|
_object_orig_text = focused_object.text
|
|
|
|
# Change text with undo/redo
|
|
func change_text(object, to):
|
|
var from = _object_orig_text
|
|
undo_redo.create_action("Change Text")
|
|
undo_redo.add_do_method(self, "set_object_text", object, to)
|
|
undo_redo.add_undo_method(self, "set_object_text", object, from)
|
|
undo_redo.commit_action()
|
|
_object_orig_text = ""
|
|
|
|
func set_object_text(object, text):
|
|
object.set("text", text)
|
|
emit_signal("property_edited", "text")
|