170 lines
4.3 KiB
GDScript
170 lines
4.3 KiB
GDScript
@tool
|
|
extends EditorPlugin
|
|
|
|
signal typing
|
|
|
|
# Scenes preloaded
|
|
const Boom: PackedScene = preload("res://addons/ridiculous_coding/boom.tscn")
|
|
const Blip: PackedScene = preload("res://addons/ridiculous_coding/blip.tscn")
|
|
const Newline: PackedScene = preload("res://addons/ridiculous_coding/newline.tscn")
|
|
const Dock: PackedScene = preload("res://addons/ridiculous_coding/dock.tscn")
|
|
|
|
# Inner Variables
|
|
const PITCH_DECREMENT := 2.0
|
|
|
|
var shake: float = 0.0
|
|
var shake_intensity:float = 0.0
|
|
var timer: float = 0.0
|
|
var last_key: String = ""
|
|
var pitch_increase: float = 0.0
|
|
var editors = {}
|
|
var dock
|
|
|
|
|
|
func _enter_tree():
|
|
var editor: EditorInterface = get_editor_interface()
|
|
var script_editor: ScriptEditor = editor.get_script_editor()
|
|
script_editor.editor_script_changed.connect(editor_script_changed)
|
|
|
|
# Add the main panel
|
|
dock = Dock.instantiate()
|
|
typing.connect(Callable(dock,"_on_typing"))
|
|
add_control_to_dock(DOCK_SLOT_RIGHT_BL, dock)
|
|
|
|
|
|
func _exit_tree():
|
|
if dock:
|
|
remove_control_from_docks(dock)
|
|
dock.free()
|
|
|
|
|
|
func get_all_text_editors(parent : Node):
|
|
for child in parent.get_children():
|
|
if child.get_child_count():
|
|
get_all_text_editors(child)
|
|
|
|
if child is TextEdit:
|
|
editors[child] = {
|
|
"text": child.text,
|
|
"line": child.get_caret_line()
|
|
}
|
|
|
|
if child.caret_changed.is_connected(caret_changed):
|
|
child.caret_changed.disconnect(caret_changed)
|
|
child.caret_changed.connect(caret_changed.bind(child))
|
|
|
|
if child.text_changed.is_connected(text_changed):
|
|
child.text_changed.disconnect(text_changed)
|
|
child.text_changed.connect(text_changed.bind(child))
|
|
|
|
if child.gui_input.is_connected(gui_input):
|
|
child.gui_input.disconnect(gui_input)
|
|
child.gui_input.connect(gui_input)
|
|
|
|
|
|
func gui_input(event):
|
|
# Get last key typed
|
|
if event is InputEventKey and event.pressed:
|
|
event = event as InputEventKey
|
|
last_key = OS.get_keycode_string(event.get_keycode_with_modifiers())
|
|
|
|
|
|
func editor_script_changed(script):
|
|
var editor = get_editor_interface()
|
|
var script_editor = editor.get_script_editor()
|
|
|
|
editors.clear()
|
|
get_all_text_editors(script_editor)
|
|
|
|
|
|
func _process(delta):
|
|
var editor = get_editor_interface()
|
|
|
|
if shake > 0:
|
|
shake -= delta
|
|
editor.get_base_control().position = Vector2(randf_range(-shake_intensity,shake_intensity), randf_range(-shake_intensity,shake_intensity))
|
|
else:
|
|
editor.get_base_control().position = Vector2.ZERO
|
|
|
|
timer += delta
|
|
if (pitch_increase > 0.0):
|
|
pitch_increase -= delta * PITCH_DECREMENT
|
|
|
|
|
|
func shake_screen(duration, intensity):
|
|
if shake > 0:
|
|
return
|
|
|
|
shake = duration
|
|
shake_intensity = intensity
|
|
|
|
|
|
func caret_changed(textedit):
|
|
var editor = get_editor_interface()
|
|
|
|
if not editors.has(textedit):
|
|
# For some reason the editor instances all change
|
|
# when the file is saved so you need to reload them
|
|
editors.clear()
|
|
get_all_text_editors(editor.get_script_editor())
|
|
|
|
editors[textedit]["line"] = textedit.get_caret_line()
|
|
|
|
|
|
func text_changed(textedit : TextEdit):
|
|
var line_height = textedit.get_line_height()
|
|
var pos = textedit.get_caret_draw_pos() + Vector2(0,-line_height/2.0)
|
|
emit_signal("typing")
|
|
|
|
if editors.has(textedit):
|
|
# Deleting
|
|
if timer > 0.1 and len(textedit.text) < len(editors[textedit]["text"]):
|
|
timer = 0.0
|
|
|
|
if dock.explosions:
|
|
# Draw the thing
|
|
var thing = Boom.instantiate()
|
|
thing.position = pos
|
|
thing.destroy = true
|
|
if dock.chars: thing.last_key = last_key
|
|
thing.sound = dock.sound
|
|
textedit.add_child(thing)
|
|
|
|
if dock.shake:
|
|
# Shake
|
|
shake_screen(0.2, 10)
|
|
|
|
# Typing
|
|
if timer > 0.02 and len(textedit.text) >= len(editors[textedit]["text"]):
|
|
timer = 0.0
|
|
|
|
# Draw the thing
|
|
var thing = Blip.instantiate()
|
|
thing.pitch_increase = pitch_increase
|
|
pitch_increase += 1.0
|
|
thing.position = pos
|
|
thing.destroy = true
|
|
thing.blips = dock.blips
|
|
if dock.chars: thing.last_key = last_key
|
|
thing.sound = dock.sound
|
|
textedit.add_child(thing)
|
|
|
|
if dock.shake:
|
|
# Shake
|
|
shake_screen(0.05, 5)
|
|
|
|
# Newline
|
|
if textedit.get_caret_line() != editors[textedit]["line"]:
|
|
# Draw the thing
|
|
var thing = Newline.instantiate()
|
|
thing.position = pos
|
|
thing.destroy = true
|
|
thing.blips = dock.blips
|
|
textedit.add_child(thing)
|
|
|
|
if dock.shake:
|
|
# Shake
|
|
shake_screen(0.05, 5)
|
|
|
|
editors[textedit]["text"] = textedit.text
|
|
editors[textedit]["line"] = textedit.get_caret_line()
|