Can now drag an item out of inventory and drop it.

This commit is contained in:
Zed A. Shaw 2025-06-18 11:26:38 -04:00
parent 87459d41bb
commit 68e50342e5
4 changed files with 41 additions and 9 deletions

View file

@ -21,7 +21,8 @@ namespace gui {
FSM_STATE(DNDState, LOOT_GRAB, ev, data);
FSM_STATE(DNDState, INV_GRAB, ev, data);
FSM_STATE(DNDState, ITEM_PICKUP, ev, data);
FSM_STATE(DNDState, END, ev);
FSM_STATE(DNDState, INV_PICKUP, ev, data);
FSM_STATE(DNDState, END, ev, data);
default:
dbc::log(fmt::format("event received with data but state={} is not handled", int($state)));
}
@ -104,6 +105,22 @@ namespace gui {
}
}
void DNDLoot::INV_PICKUP(Event ev, std::any data) {
using enum Event;
(void)data;
switch(ev) {
case MOUSE_CLICK:
case MOUSE_DROP: {
auto& grab = $status_ui.$gui.get<guecs::GrabSource>(*$grab_source);
grab.commit();
END(Event::CLOSE);
} break;
default:
handle_mouse(ev, $status_ui.$gui);
}
}
void DNDLoot::ITEM_PICKUP(Event ev, std::any data) {
using enum Event;
@ -123,7 +140,7 @@ namespace gui {
}
}
void DNDLoot::END(Event ev) {
void DNDLoot::END(Event ev, std::any data) {
using enum Event;
switch(ev) {
@ -140,6 +157,17 @@ namespace gui {
state(DNDState::ITEM_PICKUP);
}
} break;
case INV_SELECT: {
$grab_source = UISystem::loot_grab($status_ui.$gui, data);
if($grab_source) {
auto& source = $status_ui.$gui.get<guecs::GrabSource>(*$grab_source);
$grab_sprite = source.sprite;
state(DNDState::INV_PICKUP);
} else {
dbc::log("inv slot empty");
}
} break;
case LOOT_OPEN:
open();
state(DNDState::LOOTING);
@ -149,6 +177,8 @@ namespace gui {
close();
state(DNDState::END);
break;
case TICK: // ignored
break;
default:
dbc::sentinel(fmt::format("invalid event: {}", int(ev)));
}