diff --git a/gui/fsm.cpp b/gui/fsm.cpp index 189cb58..c1a5f1b 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -10,6 +10,7 @@ #include "sound.hpp" #include "shaders.hpp" #include +#include "gui/guecstra.hpp" namespace gui { using namespace components; @@ -57,7 +58,6 @@ namespace gui { } void FSM::START(Event ) { - $main_ui.update_level($level); $main_ui.init(); $loot_ui.init(); @@ -133,37 +133,34 @@ namespace gui { break; case LOOT_SELECT: { int slot_id = std::any_cast(data); - if(auto entity = $loot_ui.select_slot(slot_id)) { - $status_ui.select_slot(slot_id, *entity); - $dumb_sprite = $loot_ui.grab_sprite(slot_id); - - $window.setMouseCursorVisible(false); - $dumb_sprite->setOrigin({128, 128}); - $dumb_sprite->setPosition({ - float($router.position.x), - float($router.position.y) - }); + + if(auto world_entity = $loot_ui.select_slot(slot_id)) { + $grab_source = $loot_ui.$gui.entity("item_", slot_id); + auto& source = $loot_ui.get_grabber(*$grab_source); + + source.grab($window); + source.move($router.position); + + $status_ui.select_slot(slot_id, *world_entity); } } break; case INV_SELECT: { std::string slot_name = std::any_cast(data); int slot_id = $status_ui.place_slot(slot_name); + dbc::check(slot_id != -1, "status_ui is trying to place -1 slot_id"); if(slot_id != -1) { $loot_ui.remove_slot(slot_id); } $window.setMouseCursorVisible(true); - $dumb_sprite = nullptr; state(State::LOOTING); } break; case MOUSE_CLICK: mouse_action(false); break; case MOUSE_MOVE: { - if($dumb_sprite) { - $dumb_sprite->setPosition({ - float($router.position.x), - float($router.position.y) - }); + if($grab_source) { + auto& source = $loot_ui.get_grabber(*$grab_source); + source.move($router.position); } mouse_action(true); } break; @@ -171,11 +168,9 @@ namespace gui { mouse_action(false); } break; case MOUSE_DRAG: { - if($dumb_sprite) { - $dumb_sprite->setPosition({ - float($router.position.x), - float($router.position.y) - }); + if($grab_source) { + auto& source = $loot_ui.get_grabber(*$grab_source); + source.move($router.position); } mouse_action(true); } break; @@ -241,6 +236,7 @@ namespace gui { state(State::INV_GRAB); INV_GRAB(ev, data); break; + case MOUSE_DRAG_START: case MOUSE_CLICK: mouse_action(false); break; diff --git a/gui/fsm.hpp b/gui/fsm.hpp index d31b801..d7366b7 100644 --- a/gui/fsm.hpp +++ b/gui/fsm.hpp @@ -49,7 +49,8 @@ namespace gui { LootUI $loot_ui; sf::Font $font; gui::routing::Router $router; - shared_ptr $dumb_sprite = nullptr; + std::optional $grab_source; + std::optional $drop_target; FSM(); diff --git a/gui/guecstra.hpp b/gui/guecstra.hpp index 686fb05..4ad2d0c 100644 --- a/gui/guecstra.hpp +++ b/gui/guecstra.hpp @@ -1,8 +1,28 @@ +#pragma once #include "components.hpp" #include "events.hpp" #include +#include "textures.hpp" namespace guecs { Clickable make_action(DinkyECS::World& target, Events::GUI event); Clickable make_action(DinkyECS::World& target, Events::GUI event, std::any data); + + struct GrabSource : public Sprite { + void grab(sf::RenderWindow& window) { + window.setMouseCursorVisible(false); + sprite->setOrigin({128, 128}); + } + + void move(sf::Vector2i position) { + sprite->setPosition({ + float(position.x), + float(position.y) + }); + } + }; + + struct DropTarget { + + }; } diff --git a/gui/loot_ui.cpp b/gui/loot_ui.cpp index 6fffe3c..1a5d51d 100644 --- a/gui/loot_ui.cpp +++ b/gui/loot_ui.cpp @@ -1,7 +1,6 @@ #include "gui/loot_ui.hpp" #include "constants.hpp" #include -#include "gui/guecstra.hpp" namespace gui { using namespace guecs; @@ -55,12 +54,6 @@ namespace gui { } } - shared_ptr LootUI::grab_sprite(int slot_id) { - auto id = $gui.entity("item_", slot_id); - auto& sprite = $gui.get(id); - return sprite.sprite; - } - void LootUI::remove_slot(int slot_id) { dbc::check(size_t(slot_id) < contents.size(), fmt::format("invalid slot id {} give, contents.size={}", @@ -83,12 +76,16 @@ namespace gui { if(i < contents.size()) { auto item = contents.at(i); auto& sprite = $level.world->get(item); - fmt::println("NEW SPRITE SPRITE {}", sprite.name); - $gui.set_init(id, {sprite.name}); + guecs::GrabSource grabber{sprite.name}; + $gui.set_init(id, grabber); } } } + guecs::GrabSource& LootUI::get_grabber(DinkyECS::Entity entity) { + return static_cast($gui.get(entity)); + } + void LootUI::render(sf::RenderWindow& window) { $gui.render(window); } diff --git a/gui/loot_ui.hpp b/gui/loot_ui.hpp index 66fea97..9367f34 100644 --- a/gui/loot_ui.hpp +++ b/gui/loot_ui.hpp @@ -1,4 +1,5 @@ #pragma once +#include "gui/guecstra.hpp" #include "levelmanager.hpp" #include #include @@ -22,6 +23,6 @@ namespace gui { bool mouse(float x, float y, bool hover); std::optional select_slot(int slot); void remove_slot(int slot_id); - shared_ptr grab_sprite(int slot_id); + guecs::GrabSource& get_grabber(DinkyECS::Entity entity); }; }