From 1ab708c4ebec18367d9837c3b974865d9b6e8d8e Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 12 Jun 2025 22:51:58 -0400 Subject: [PATCH] Clean up more of the FSM so that it's almost nothing.Now I'll try to make a stand-alone 'dnd' state machine to handle drag and drop functionality. --- gui/fsm.cpp | 74 +++++++++++++++++++---------------------------- gui/uisystems.cpp | 13 +++++++-- gui/uisystems.hpp | 6 ++-- 3 files changed, 43 insertions(+), 50 deletions(-) diff --git a/gui/fsm.cpp b/gui/fsm.cpp index 5e2b58d..ed2adb8 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -133,23 +133,17 @@ namespace gui { $loot_ui.active = false; state(State::IDLE); break; - case LOOT_SELECT: { - auto gui_id = std::any_cast(data); - $grab_source = UISystem::loot_grab($loot_ui.$gui, gui_id); - if(!$grab_source) state(State::LOOTING); - } break; - case INV_SELECT: { - if($grab_source) { - auto gui_id = std::any_cast(data); - bool dropped = UISystem::loot_drop( - $loot_ui.$gui, $status_ui.$gui, - *$grab_source, gui_id); - - if(dropped) { - state(State::LOOTING); - } - } - } break; + case LOOT_SELECT: + $grab_source = UISystem::loot_grab($loot_ui.$gui, data); + if($grab_source) state(State::LOOTING); + break; + case INV_SELECT: + if(UISystem::loot_drop($loot_ui.$gui, + $status_ui.$gui, $grab_source, data)) + { + state(State::LOOTING); + } + break; case MOUSE_CLICK: mouse_action(false); break; @@ -183,23 +177,17 @@ namespace gui { $loot_ui.active = false; state(State::IDLE); break; - case LOOT_SELECT: { - if($grab_source) { - auto gui_id = std::any_cast(data); - bool dropped = UISystem::loot_drop( - $status_ui.$gui, $loot_ui.$gui, - *$grab_source, gui_id); - - if(dropped) { - state(State::LOOTING); - } - } - } break; - case INV_SELECT: { - auto gui_id = std::any_cast(data); - $grab_source = UISystem::loot_grab($status_ui.$gui, gui_id); - if(!$grab_source) state(State::LOOTING); - } break; + case LOOT_SELECT: + if(UISystem::loot_drop($status_ui.$gui, + $loot_ui.$gui, $grab_source, data)) + { + state(State::LOOTING); + } + break; + case INV_SELECT: + $grab_source = UISystem::loot_grab($status_ui.$gui, data); + state(State::LOOTING); + break; case MOUSE_CLICK: mouse_action(false); break; @@ -230,16 +218,14 @@ namespace gui { $loot_ui.active = false; state(State::IDLE); break; - case LOOT_SELECT: { - auto gui_id = std::any_cast(data); - $grab_source = UISystem::loot_grab($loot_ui.$gui, gui_id); - if($grab_source) state(State::LOOT_GRAB); - } break; - case INV_SELECT: { - auto gui_id = std::any_cast(data); - $grab_source = UISystem::loot_grab($status_ui.$gui, gui_id); - if($grab_source) state(State::INV_GRAB); - } break; + case LOOT_SELECT: + $grab_source = UISystem::loot_grab($loot_ui.$gui, data); + if($grab_source) state(State::LOOT_GRAB); + break; + case INV_SELECT: + $grab_source = UISystem::loot_grab($status_ui.$gui, data); + if($grab_source) state(State::INV_GRAB); + break; case MOUSE_DRAG_START: case MOUSE_CLICK: mouse_action(false); diff --git a/gui/uisystems.cpp b/gui/uisystems.cpp index 02283bc..780c20a 100644 --- a/gui/uisystems.cpp +++ b/gui/uisystems.cpp @@ -2,7 +2,9 @@ #include "gui/guecstra.hpp" namespace UISystem { - std::optional loot_grab(guecs::UI& gui, guecs::Entity gui_id) { + std::optional loot_grab(guecs::UI& gui, std::any data) { + auto gui_id = std::any_cast(data); + if(auto source = gui.get_if(gui_id)) { source->grab(); return gui_id; @@ -11,9 +13,14 @@ namespace UISystem { } } - bool loot_drop(guecs::UI& source, guecs::UI& target, guecs::Entity source_id, guecs::Entity target_id) { + bool loot_drop(guecs::UI& source, guecs::UI& target, + std::optional source_id, std::any data) + { + if(!source_id) return false; + auto target_id = std::any_cast(data); + auto& drop = target.get(target_id); - auto& grab = source.get(source_id); + auto& grab = source.get(*source_id); if(drop.commit(grab.world_entity)) { grab.commit(); diff --git a/gui/uisystems.hpp b/gui/uisystems.hpp index 91a8fc3..ebc695f 100644 --- a/gui/uisystems.hpp +++ b/gui/uisystems.hpp @@ -3,8 +3,8 @@ #include namespace UISystem { - std::optional loot_grab(guecs::UI& gui, guecs::Entity gui_id); + std::optional loot_grab(guecs::UI& gui, std::any data); - - bool loot_drop(guecs::UI& source, guecs::UI& target, guecs::Entity grab_source, guecs::Entity target_id); + bool loot_drop(guecs::UI& source, guecs::UI& target, + std::optional source_id, std::any data); }