From 3e0adf0c22d96b432829276045c9bc7bcefa532d Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Sun, 8 Jun 2025 23:27:43 -0400 Subject: [PATCH] Better meaning API on both sides for the drag-n-drop operations, but I _swear_ there's a way to do this in the GrabSource/DropTarget instead. --- gui/fsm.cpp | 17 +++++++---------- gui/guecstra.hpp | 2 +- gui/loot_ui.cpp | 10 +++++----- gui/loot_ui.hpp | 8 ++++---- gui/status_ui.cpp | 8 ++++++-- gui/status_ui.hpp | 4 +++- 6 files changed, 26 insertions(+), 23 deletions(-) diff --git a/gui/fsm.cpp b/gui/fsm.cpp index fd3a999..e8ce90a 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -135,12 +135,12 @@ namespace gui { case LOOT_SELECT: { $grab_source = std::any_cast(data); - if(auto world_entity = $loot_ui.select_slot(*$grab_source)) { - auto& source = $loot_ui.get_grabber(*$grab_source); + if(auto world_entity = $loot_ui.start_grab(*$grab_source)) { + auto& source = $loot_ui.get_grab_source(*$grab_source); source.grab($window); source.move($router.position); - $status_ui.select_slot(*world_entity); + $status_ui.start_drop(*world_entity); } else { // BUG: need a cancel operation here $window.setMouseCursorVisible(true); @@ -149,14 +149,11 @@ namespace gui { } break; case INV_SELECT: { auto gui_id = std::any_cast(data); - dbc::log(fmt::format("INV_SELECT $grab_source null? {} gui_id {}", - $grab_source == std::nullopt, gui_id)); - if($grab_source) { - auto& drop = $status_ui.$gui.get(gui_id); + auto& drop = $status_ui.get_drop_target(gui_id); - if(drop.action()) { - $loot_ui.remove_slot(*$grab_source); + if(drop.commit()) { + $loot_ui.commit_drop(*$grab_source); $grab_source = std::nullopt; } @@ -171,7 +168,7 @@ namespace gui { case MOUSE_DRAG: case MOUSE_MOVE: { if($grab_source) { - auto& source = $loot_ui.get_grabber(*$grab_source); + auto& source = $loot_ui.get_grab_source(*$grab_source); source.move($router.position); } mouse_action(true); diff --git a/gui/guecstra.hpp b/gui/guecstra.hpp index 88be0c4..88fd3d1 100644 --- a/gui/guecstra.hpp +++ b/gui/guecstra.hpp @@ -14,6 +14,6 @@ namespace guecs { }; struct DropTarget { - std::function action; + std::function commit; }; } diff --git a/gui/loot_ui.cpp b/gui/loot_ui.cpp index fcb0a25..fd5bcb4 100644 --- a/gui/loot_ui.cpp +++ b/gui/loot_ui.cpp @@ -46,7 +46,7 @@ namespace gui { update(); } - std::optional LootUI::select_slot(DinkyECS::Entity slot_id) { + std::optional LootUI::start_grab(DinkyECS::Entity slot_id) { if(contents.contains(slot_id)) { return contents.at(slot_id); } else { @@ -54,7 +54,7 @@ namespace gui { } } - void LootUI::remove_slot(DinkyECS::Entity slot_id) { + void LootUI::commit_drop(DinkyECS::Entity slot_id) { contents.erase(slot_id); update(); } @@ -80,12 +80,12 @@ namespace gui { } } - bool LootUI::has_grabber(DinkyECS::Entity gui_id) { + bool LootUI::has_grab_source(DinkyECS::Entity gui_id) { return $gui.has(gui_id); } - guecs::GrabSource& LootUI::get_grabber(DinkyECS::Entity gui_id) { - dbc::check(has_grabber(gui_id), "invalid GrabSource requested, entity isn't in the GUI."); + guecs::GrabSource& LootUI::get_grab_source(DinkyECS::Entity gui_id) { + dbc::check(has_grab_source(gui_id), "invalid GrabSource requested, entity isn't in the GUI."); return static_cast($gui.get(gui_id)); } diff --git a/gui/loot_ui.hpp b/gui/loot_ui.hpp index 9b3cc95..44abdcd 100644 --- a/gui/loot_ui.hpp +++ b/gui/loot_ui.hpp @@ -21,9 +21,9 @@ namespace gui { void render(sf::RenderWindow& window); void update_level(GameLevel &level); bool mouse(float x, float y, bool hover); - std::optional select_slot(DinkyECS::Entity slot); - void remove_slot(DinkyECS::Entity slot_id); - guecs::GrabSource& get_grabber(DinkyECS::Entity entity); - bool has_grabber(DinkyECS::Entity gui_id); + std::optional start_grab(DinkyECS::Entity slot); + guecs::GrabSource& get_grab_source(DinkyECS::Entity entity); + bool has_grab_source(DinkyECS::Entity gui_id); + void commit_drop(DinkyECS::Entity slot_id); }; } diff --git a/gui/status_ui.cpp b/gui/status_ui.cpp index f681a0a..f12d02a 100644 --- a/gui/status_ui.cpp +++ b/gui/status_ui.cpp @@ -46,7 +46,7 @@ namespace gui { guecs::make_action(*$level.world, Events::GUI::INV_SELECT, {button}) }); $gui.set(button, { - [&, button]() -> bool { return place_slot(button); } + .commit=[&, button]() -> bool { return place_slot(button); } }); } } @@ -83,7 +83,7 @@ namespace gui { init(); } - void StatusUI::select_slot(DinkyECS::Entity entity) { + void StatusUI::start_drop(DinkyECS::Entity entity) { $selected_entity = entity; } @@ -99,4 +99,8 @@ namespace gui { return false; } } + + guecs::DropTarget& StatusUI::get_drop_target(DinkyECS::Entity gui_id) { + return $gui.get(gui_id); + } } diff --git a/gui/status_ui.hpp b/gui/status_ui.hpp index cacc294..5adde4f 100644 --- a/gui/status_ui.hpp +++ b/gui/status_ui.hpp @@ -5,6 +5,7 @@ #include "textures.hpp" #include #include "gui/ritual_ui.hpp" +#include "gui/guecstra.hpp" namespace gui { class StatusUI { @@ -22,7 +23,8 @@ namespace gui { void init(); void render(sf::RenderWindow &window); void update(); - void select_slot(DinkyECS::Entity entity); + void start_drop(DinkyECS::Entity entity); bool place_slot(DinkyECS::Entity gui_id); + guecs::DropTarget& get_drop_target(DinkyECS::Entity gui_id); }; }