Files
Bubberstation/code/datums/storage/storage_interface.dm
SmArtKar 503d689ad1 Players can now reorder items inside storages by dragging them (#85318)
## About The Pull Request

https://github.com/user-attachments/assets/8949965f-a78a-4f3d-b528-afcdfe5c4e72

Drag'n'dropping items inside of an open storage that you can access will
reorder them. I had to register dropping onto items themselves instead
of cells as they ignore icon transparency when in storage for QOL
reasons, so bear with that.
## Why It's Good For The Game

Reordering your storage currently requires taking out all items in front
of position that you want a certain item to be and putting them back in
which could be rather annoying with large storages.

## Changelog
🆑
qol: You can now reorder items inside storages by dragging them
/🆑
2024-07-31 11:05:06 -04:00

69 lines
3.1 KiB
Plaintext

/// Datum tracker for storage UI
/datum/storage_interface
/// UI elements for this theme
var/atom/movable/screen/close/closer
var/atom/movable/screen/storage/cell/cells
var/atom/movable/screen/storage/corner/corner_top_left
var/atom/movable/screen/storage/corner/top_right/corner_top_right
var/atom/movable/screen/storage/corner/bottom_left/corner_bottom_left
var/atom/movable/screen/storage/corner/bottom_right/corner_bottom_right
var/atom/movable/screen/storage/rowjoin/rowjoin_left
var/atom/movable/screen/storage/rowjoin/right/rowjoin_right
/// Storage that owns us
var/datum/storage/parent_storage
/datum/storage_interface/New(ui_style, parent_storage)
..()
src.parent_storage = parent_storage
closer = new(null, null, parent_storage)
cells = new(null, null, parent_storage)
corner_top_left = new(null, null, parent_storage)
corner_top_right = new(null, null, parent_storage)
corner_bottom_left = new(null, null, parent_storage)
corner_bottom_right = new(null, null, parent_storage)
rowjoin_left = new(null, null, parent_storage)
rowjoin_right = new(null, null, parent_storage)
for (var/atom/movable/screen/ui_elem as anything in list_ui_elements())
ui_elem.icon = ui_style
/// Returns all UI elements under this theme
/datum/storage_interface/proc/list_ui_elements()
return list(cells, corner_top_left, corner_top_right, corner_bottom_left, corner_bottom_right, rowjoin_left, rowjoin_right, closer)
/datum/storage_interface/Destroy(force)
QDEL_NULL(cells)
QDEL_NULL(corner_top_left)
QDEL_NULL(corner_top_right)
QDEL_NULL(corner_bottom_left)
QDEL_NULL(corner_bottom_right)
QDEL_NULL(rowjoin_left)
QDEL_NULL(rowjoin_right)
parent_storage = null
return ..()
/// Updates position of all UI elements
/datum/storage_interface/proc/update_position(screen_start_x, screen_pixel_x, screen_start_y, screen_pixel_y, columns, rows)
var/start_pixel_x = screen_start_x * 32 + screen_pixel_x
var/start_pixel_y = screen_start_y * 32 + screen_pixel_y
var/end_pixel_x = start_pixel_x + (columns - 1) * 32
var/end_pixel_y = start_pixel_y + (rows - 1) * 32
cells.screen_loc = spanning_screen_loc(start_pixel_x, start_pixel_y, end_pixel_x, end_pixel_y)
var/left_edge_loc = spanning_screen_loc(min(start_pixel_x + 32, end_pixel_x), start_pixel_y, end_pixel_x, end_pixel_y)
var/right_edge_loc = spanning_screen_loc(start_pixel_x, start_pixel_y, max(start_pixel_x, end_pixel_x - 32), end_pixel_y)
corner_top_left.screen_loc = left_edge_loc
corner_bottom_left.screen_loc = left_edge_loc
corner_top_right.screen_loc = right_edge_loc
corner_bottom_right.screen_loc = right_edge_loc
var/row_left_loc = spanning_screen_loc(start_pixel_x, start_pixel_y + 27, start_pixel_x, start_pixel_y + 27 + max(0, rows - 2) * 32)
rowjoin_left.screen_loc = row_left_loc
rowjoin_left.alpha = (rows > 1) * 255
var/row_right_loc = spanning_screen_loc(end_pixel_x, start_pixel_y + 27, end_pixel_x, start_pixel_y + 27 + max(0, rows - 2) * 32)
rowjoin_right.screen_loc = row_right_loc
rowjoin_right.alpha = (rows > 1) * 255
closer.screen_loc = "[screen_start_x + columns]:[screen_pixel_x - 5],[screen_start_y]:[screen_pixel_y]"