Files
2025-07-20 10:34:21 +02:00

178 lines
4.9 KiB
GDScript

@tool
extends Window
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Script Spliter
# https://github.com/CodeNameTwister/Script-Spliter
#
# Script Spliter addon for godot 4f
# author: "Twister"
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
signal on_close(window : Window)
@export var _container : Control = null
@export var _base_control : TabContainer = null
@export var _always_top : Button = null
@export var _close : Button = null
@export var _root : Control = null
var proxy : Control = null
var replacer : Node = null
var controller : Object = null
func set_base_control(node : Node) -> void:
if _base_control:
_base_control.queue_sort()
_base_control = node
if _container:
_container.add_child(node)
return
add_child(node)
if node is Control:
node.size = node.get_parent().size
func get_base_control() -> TabContainer:
return _base_control
func _init() -> void:
visible = false
close_requested.connect(_on_close)
visibility_changed.connect(_on_visibility)
focus_entered.connect(_on_focus)
focus_exited.connect(_on_focus_exited)
func _get_edit(n : Node) -> CodeEdit:
if n is CodeEdit:
return n
for x : Node in n.get_children():
return _get_edit(x)
return null
func _on_focus() -> void:
if replacer == null:
var script_editor: ScriptEditor = EditorInterface.get_script_editor()
var root : Node = script_editor.get_child(0).get_child(1).get_child(1)
if root.get_child_count() > 2:
replacer = root.get_child(2)
if "FindReplaceBar" in replacer.name:
replacer.get_parent().remove_child(replacer)
if is_instance_valid(_root):
_root.add_child(replacer)
else:
add_child(replacer)
if is_instance_valid(controller):
controller.emit_signal.call_deferred(&"focus", controller)
func _update_name() -> void:
if is_queued_for_deletion():
return
if is_instance_valid(_base_control):
if _base_control.current_tab > -1:
title = "Script-Spliter: {0}".format([_base_control.get_tab_title(_base_control.current_tab)])
return
title = "Script-Spliter: Pop Script"
func _on_tabity(__ : int) -> void:
_update_name.call_deferred()
func _on_always_top() -> void:
if transient:
return
always_on_top = !always_on_top
func _shortcut_input(event: InputEvent) -> void:
if is_instance_valid(proxy):
var vp : Viewport = proxy.get_viewport()
if vp and vp != get_viewport():
vp.push_input(event)
func _ready() -> void:
set_process_shortcut_input(true)
if _always_top:
if !_always_top.pressed.is_connected(_on_always_top):
_always_top.pressed.connect(_on_always_top)
if _close:
if !_close.pressed.is_connected(_on_close):
_close.pressed.connect(_on_close)
if _base_control:
if !_base_control.tab_changed.is_connected(_on_tabity):
_base_control.tab_changed.connect(_on_tabity)
if !_base_control.child_entered_tree.is_connected(_on_child):
_base_control.child_entered_tree.connect(_on_child)
if !_base_control.child_exiting_tree.is_connected(_out_child):
_base_control.child_exiting_tree.connect(_out_child)
var root : Control = EditorInterface.get_base_control()
if root:
add_theme_stylebox_override(&"Panel",root.get_theme_stylebox("panel", "PanelContainer"))
func _connect(n : Node, e : bool) -> void:
if n is CodeEdit:
if e:
if !n.focus_entered.is_connected(_on_focus):
n.focus_entered.connect(_on_focus)
else:
if n.focus_entered.is_connected(_on_focus):
n.focus_entered.disconnect(_on_focus)
return
for x : Node in n.get_children():
_connect(x, e)
func _on_child(n : Node) -> void:
if n is Control:
_connect(n, true)
func _out_child(n : Node) -> void:
if n is Control:
_connect(n, false)
func _on_visibility() -> void:
if !visible:
_on_focus_exited()
_on_close()
return
set_deferred(&"always_top", false)
set_process(true)
_update_name.call_deferred()
func _on_close() -> void:
on_close.emit(self)
if _base_control and _base_control.get_child_count() < 1:
queue_free()
func _on_focus_exited() -> void:
if replacer != null:
var script_editor: ScriptEditor = EditorInterface.get_script_editor()
var root : Node = script_editor.get_child(0).get_child(1).get_child(1)
var parent : Node = replacer.get_parent()
if parent != root:
if is_instance_valid(parent):
parent.remove_child(replacer)
root.add_child(replacer)
replacer = null
func _notification(what: int) -> void:
if what == NOTIFICATION_PREDELETE:
if is_instance_valid(replacer):
var script_editor: ScriptEditor = EditorInterface.get_script_editor()
var root : Node = script_editor.get_child(0).get_child(1).get_child(1)
var parent : Node = replacer.get_parent()
if parent != root:
if is_instance_valid(parent):
parent.remove_child(replacer)
root.add_child(replacer)
replacer = null
if is_instance_valid(controller):
controller.call(&"reset")
func _move_to_center() -> void:
move_to_center()
func _alpha_value(v : float) -> void:
get_child(0).modulate.a = v