From 68e50342e559f1c760e0b14ab27fe0b8bc17edf2 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Wed, 18 Jun 2025 11:26:38 -0400 Subject: [PATCH] Can now drag an item out of inventory and drop it. --- gui/dnd_loot.cpp | 34 ++++++++++++++++++++++++++++++++-- gui/dnd_loot.hpp | 6 ++++-- gui/fsm.cpp | 8 ++++---- gui/fsm.hpp | 2 +- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/gui/dnd_loot.cpp b/gui/dnd_loot.cpp index 338fc9f..57d4055 100644 --- a/gui/dnd_loot.cpp +++ b/gui/dnd_loot.cpp @@ -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(*$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(*$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))); } diff --git a/gui/dnd_loot.hpp b/gui/dnd_loot.hpp index 836882f..4e5ff99 100644 --- a/gui/dnd_loot.hpp +++ b/gui/dnd_loot.hpp @@ -12,7 +12,8 @@ namespace gui { LOOT_GRAB=102, INV_GRAB=103, ITEM_PICKUP=104, - END=105 + INV_PICKUP=105, + END=106 }; class DNDLoot : public DeadSimpleFSM { @@ -34,8 +35,9 @@ namespace gui { void LOOTING(Event ev, std::any data); void LOOT_GRAB(Event ev, std::any data); void INV_GRAB(Event ev, std::any data); - void END(Event ev); + void END(Event ev, std::any data={}); void ITEM_PICKUP(Event ev, std::any data); + void INV_PICKUP(Event ev, std::any data); void handle_mouse(Event ev, guecs::UI& gui); void mouse_action(bool hover); void render(); diff --git a/gui/fsm.cpp b/gui/fsm.cpp index c9b251a..3d919df 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -39,7 +39,7 @@ namespace gui { FSM_STATE(State, MOVING, ev); FSM_STATE(State, ATTACKING, ev); FSM_STATE(State, ROTATING, ev); - FSM_STATE(State, IDLE, ev); + FSM_STATE(State, IDLE, ev, data); FSM_STATE(State, IN_COMBAT, ev); FSM_STATE(State, COMBAT_ROTATE, ev); FSM_STATE(State, NEXT_LEVEL, ev); @@ -120,7 +120,7 @@ namespace gui { } } - void FSM::IDLE(Event ev) { + void FSM::IDLE(Event ev, std::any data) { using enum Event; sound::stop("walk"); @@ -176,8 +176,8 @@ namespace gui { state(State::LOOTING); break; case INV_SELECT: - dbc::log("Dropping/grabbing items not yet supported."); - state(State::IDLE); + $dnd_loot.event(Event::INV_SELECT, data); + state(State::LOOTING); break; case MOUSE_CLICK: mouse_action(false); diff --git a/gui/fsm.hpp b/gui/fsm.hpp index f3e9182..6000820 100644 --- a/gui/fsm.hpp +++ b/gui/fsm.hpp @@ -61,7 +61,7 @@ namespace gui { void ATTACKING(Event ); void MAPPING(Event); void ROTATING(Event ); - void IDLE(Event ev); + void IDLE(Event ev, std::any data); void IN_COMBAT(Event ev); void COMBAT_ROTATE(Event ev); void NEXT_LEVEL(Event ev);