70 lines
2.0 KiB
GDScript
70 lines
2.0 KiB
GDScript
@tool
|
|
extends EditorResourcePicker
|
|
|
|
signal on_resources_dropped(resources : Array)
|
|
|
|
var _prepared_for_drop := false
|
|
var _drop_hint_label : Label
|
|
|
|
|
|
func _ready():
|
|
resource_changed.connect(_on_resource_changed)
|
|
_drop_hint_label = Label.new()
|
|
_drop_hint_label.text = "[Drop Here to Add!]"
|
|
_drop_hint_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
|
_drop_hint_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
_drop_hint_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
|
_drop_hint_label.hide()
|
|
add_child(_drop_hint_label)
|
|
|
|
|
|
func set_prepared_for_drop(state : bool):
|
|
for x in get_children(true):
|
|
if not x is Popup and (not x is Label):
|
|
x.visible = not state
|
|
|
|
_drop_hint_label.visible = state
|
|
custom_minimum_size = size if state else Vector2.ZERO
|
|
_prepared_for_drop = state
|
|
|
|
|
|
func _can_drop_data(at_position: Vector2, data: Variant) -> bool:
|
|
var data_drop_type : StringName = data.get(&"type", &"")
|
|
if data_drop_type != &"files" or data_drop_type != &"resource":
|
|
return true
|
|
|
|
set_prepared_for_drop(true)
|
|
return false
|
|
|
|
|
|
func _drop_data(at_position: Vector2, data: Variant):
|
|
var data_drop_type : StringName = data.get(&"type", &"")
|
|
var new_array : Array[Resource] = []
|
|
if data_drop_type == &"files":
|
|
for x in data.files:
|
|
new_array.append(load(x))
|
|
|
|
if data_drop_type == &"resource":
|
|
new_array.append(data.resource)
|
|
|
|
if new_array.size() == 0:
|
|
return
|
|
|
|
edited_resource = new_array[0]
|
|
on_resources_dropped.emit(new_array)
|
|
|
|
|
|
func _input(event: InputEvent):
|
|
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
|
|
if !event.pressed:
|
|
set_prepared_for_drop(false)
|
|
|
|
if event is InputEventMouseMotion and not _prepared_for_drop:
|
|
# _can_drop_data() is only called when hovering over the picker. Items must be hidden before that.
|
|
if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) and not get_global_rect().has_point(event.global_position):
|
|
set_prepared_for_drop(true)
|
|
|
|
|
|
func _on_resource_changed(new_resource : Resource):
|
|
on_resources_dropped.emit([new_resource])
|