Files
dockable_container/inspector_plugin/layout_editor_property.gd

72 lines
2.3 KiB
GDScript

extends EditorProperty
var _container := DockableContainer.new()
var _hidden_menu_button := MenuButton.new()
var _hidden_menu_popup: PopupMenu
var _hidden_menu_list: PackedStringArray
func _ready() -> void:
custom_minimum_size = Vector2(128, 256)
_hidden_menu_button.text = "Visible nodes"
add_child(_hidden_menu_button)
_hidden_menu_popup = _hidden_menu_button.get_popup()
_hidden_menu_popup.hide_on_checkable_item_selection = false
_hidden_menu_popup.about_to_popup.connect(_on_hidden_menu_popup_about_to_show)
_hidden_menu_popup.id_pressed.connect(_on_hidden_menu_popup_id_pressed)
_container.clone_layout_on_ready = false
_container.custom_minimum_size = custom_minimum_size
var value := _get_layout().clone() # The layout gets reset when selecting it without clone
for n in value.get_names():
var child := _create_child_control(n)
_container.add_child(child)
_container.set(get_edited_property(), value)
add_child(_container)
set_bottom_editor(_container)
func _exit_tree() -> void: # Not sure if this is needed, but just to be sure
queue_free()
func _update_property() -> void:
var value := _get_layout()
_container.set(get_edited_property(), value)
func _get_layout() -> DockableLayout:
var original_container := get_edited_object() as DockableContainer
return original_container.get(get_edited_property())
func _create_child_control(named: String) -> Label:
var new_control := Label.new()
new_control.name = named
new_control.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
new_control.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
new_control.clip_text = true
new_control.text = named
return new_control
func _on_hidden_menu_popup_about_to_show() -> void:
var layout := _get_layout().clone()
_hidden_menu_popup.clear()
_hidden_menu_list = layout.get_names()
for i in _hidden_menu_list.size():
var tab_name := _hidden_menu_list[i]
_hidden_menu_popup.add_check_item(tab_name, i)
_hidden_menu_popup.set_item_checked(i, not layout.is_tab_hidden(tab_name))
func _on_hidden_menu_popup_id_pressed(id: int) -> void:
var layout := _get_layout().clone()
var tab_name := _hidden_menu_list[id]
var new_hidden := not layout.is_tab_hidden(tab_name)
_get_layout().set_tab_hidden(tab_name, new_hidden)
_hidden_menu_popup.set_item_checked(id, not new_hidden)
emit_changed(get_edited_property(), _get_layout()) # This line may not be needed