1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 09:09:47 +00:00
Pixelorama/addons/dockable_container/floating_window.gd
2024-10-11 12:13:13 +03:00

74 lines
1.9 KiB
GDScript

class_name FloatingWindow
extends Window
## Emitted when the window's position or size changes, or when it's closed.
signal data_changed
var window_content: Control
var prevent_data_erasure := false
var _is_initialized := false
func _init(content: Control, data := {}) -> void:
window_content = content
title = window_content.name
name = window_content.name
min_size = window_content.get_minimum_size()
unresizable = false
wrap_controls = true
always_on_top = true
ready.connect(_deserialize.bind(data))
func _ready() -> void:
set_deferred(&"size", Vector2(300, 300))
await get_tree().process_frame
await get_tree().process_frame
if get_tree().current_scene.get_window().gui_embed_subwindows:
position = DisplayServer.window_get_size() / 2 - size / 2
else:
position = DisplayServer.screen_get_usable_rect().size / 2 - size / 2
func _input(event: InputEvent) -> void:
if event is InputEventMouse:
# Emit `data_changed` when the window is being moved.
if not window_content.get_rect().has_point(event.position) and _is_initialized:
data_changed.emit(name, serialize())
func serialize() -> Dictionary:
return {"size": size, "position": position}
func _deserialize(data: Dictionary) -> void:
window_content.get_parent().remove_child(window_content)
window_content.visible = true
window_content.global_position = Vector2.ZERO
add_child(window_content)
size_changed.connect(window_size_changed)
if "position" in data:
await get_tree().process_frame
await get_tree().process_frame
position = data["position"]
if "size" in data:
set_deferred(&"size", data["size"])
_is_initialized = true
func window_size_changed() -> void:
window_content.size = size
window_content.position = Vector2.ZERO
if _is_initialized:
data_changed.emit(name, serialize())
func destroy() -> void:
size_changed.disconnect(window_size_changed)
queue_free()
func _exit_tree() -> void:
if _is_initialized and !prevent_data_erasure:
data_changed.emit(name, {})