Files
GGJ26/addons/resources_spreadsheet_view/editor_resource_array_picker.gd
minimata 158e18f1fe
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 8s
Create tag and build when new code gets to main / Export (push) Successful in 1m13s
Added resource table plugin
2026-01-31 10:23:20 +01:00

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])