forked from woofmeow/straywild
feat: add persistent inventory storage slots
This commit is contained in:
parent
6db6fbba7f
commit
a88e76848b
13 changed files with 875 additions and 65 deletions
72
ui/components/bubble_menu/bag_storage_slot.gd
Normal file
72
ui/components/bubble_menu/bag_storage_slot.gd
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
class_name BagStorageSlot
|
||||
extends Button
|
||||
|
||||
signal bag_item_dropped(item_id: StringName, slot_index: int)
|
||||
|
||||
var storage_slot_index: int = -1
|
||||
var _preview: TextureRect
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
focus_mode = Control.FOCUS_NONE
|
||||
toggle_mode = false
|
||||
mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
|
||||
_apply_style()
|
||||
_preview = TextureRect.new()
|
||||
_preview.name = "PlacementPreview"
|
||||
_preview.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||||
_preview.offset_left = 8.0
|
||||
_preview.offset_top = 7.0
|
||||
_preview.offset_right = -8.0
|
||||
_preview.offset_bottom = -7.0
|
||||
_preview.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
|
||||
_preview.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
|
||||
_preview.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
_preview.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST
|
||||
_preview.visible = false
|
||||
add_child(_preview)
|
||||
|
||||
|
||||
func configure(slot_index: int) -> void:
|
||||
storage_slot_index = slot_index
|
||||
name = "BagStorageSlot%d" % slot_index
|
||||
accessibility_name = "storage slot %d" % (slot_index + 1)
|
||||
|
||||
|
||||
func set_placement_preview(texture: Texture2D, active: bool) -> void:
|
||||
if _preview == null:
|
||||
return
|
||||
_preview.texture = texture
|
||||
_preview.visible = active and texture != null
|
||||
z_index = 2 if _preview.visible else 0
|
||||
|
||||
|
||||
func _can_drop_data(_at_position: Vector2, data: Variant) -> bool:
|
||||
return (
|
||||
typeof(data) == TYPE_DICTIONARY
|
||||
and str((data as Dictionary).get("kind", "")) == "bag_item"
|
||||
and not str((data as Dictionary).get("item_id", "")).is_empty()
|
||||
)
|
||||
|
||||
|
||||
func _drop_data(_at_position: Vector2, data: Variant) -> void:
|
||||
if not _can_drop_data(Vector2.ZERO, data):
|
||||
return
|
||||
bag_item_dropped.emit(
|
||||
StringName(str((data as Dictionary)["item_id"])),
|
||||
storage_slot_index,
|
||||
)
|
||||
|
||||
|
||||
func _apply_style() -> void:
|
||||
var normal := UtilityPageStyle.rounded_style(
|
||||
Color(UtilityPageStyle.OCEAN_FIELD, 0.72),
|
||||
14,
|
||||
)
|
||||
var hover := UtilityPageStyle.rounded_style(
|
||||
Color(UtilityPageStyle.OCEAN_SELECTED, 0.68),
|
||||
14,
|
||||
)
|
||||
for state: StringName in [&"normal", &"pressed", &"focus", &"disabled"]:
|
||||
add_theme_stylebox_override(state, normal)
|
||||
add_theme_stylebox_override(&"hover", hover)
|
||||
1
ui/components/bubble_menu/bag_storage_slot.gd.uid
Normal file
1
ui/components/bubble_menu/bag_storage_slot.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://ofac40nwf1oa
|
||||
Loading…
Add table
Add a link
Reference in a new issue