Drag now show the icon while you're dragging, so now need to work out all of the edge cases for each action.

master
Zed A. Shaw 11 months ago
parent ca74b817e5
commit 029a0f86ae
  1. 17
      gui/dnd_loot.cpp
  2. 2
      gui/dnd_loot.hpp
  3. 1
      gui/fsm.cpp

@ -115,6 +115,8 @@ namespace gui {
if(UISystem::loot_drop($loot_ui.$gui, if(UISystem::loot_drop($loot_ui.$gui,
$status_ui.$gui, $grab_source, data)) $status_ui.$gui, $grab_source, data))
{ {
$grab_source = std::nullopt;
$grab_sprite = nullptr;
state(DNDState::END); state(DNDState::END);
} }
break; break;
@ -134,11 +136,19 @@ namespace gui {
// NOTE: if > 1 items, go to LOOT_OPEN instead // NOTE: if > 1 items, go to LOOT_OPEN instead
auto gui_id = $loot_ui.$gui.entity("item_0"); auto gui_id = $loot_ui.$gui.entity("item_0");
$grab_source = UISystem::loot_grab($loot_ui.$gui, gui_id); $grab_source = UISystem::loot_grab($loot_ui.$gui, gui_id);
if($grab_source) state(DNDState::ITEM_PICKUP);
if($grab_source) {
auto& source = $loot_ui.$gui.get<guecs::GrabSource>(*$grab_source);
$grab_sprite = source.sprite;
// call this once to properly position the sprite
handle_mouse(Event::MOUSE_MOVE, $loot_ui.$gui);
state(DNDState::ITEM_PICKUP);
}
} break; } break;
case LOOT_OPEN: case LOOT_OPEN:
$loot_ui.active = true; $loot_ui.active = true;
$grab_source = std::nullopt; $grab_source = std::nullopt;
$grab_sprite = nullptr;
state(DNDState::LOOTING); state(DNDState::LOOTING);
break; break;
default: default:
@ -183,4 +193,9 @@ namespace gui {
} }
} }
void DNDLoot::render() {
if($grab_source && $grab_sprite) {
$window.draw(*$grab_sprite);
}
}
} }

@ -18,6 +18,7 @@ namespace gui {
class DNDLoot : public DeadSimpleFSM<DNDState, Event> { class DNDLoot : public DeadSimpleFSM<DNDState, Event> {
public: public:
std::optional<guecs::Entity> $grab_source = std::nullopt; std::optional<guecs::Entity> $grab_source = std::nullopt;
std::shared_ptr<sf::Sprite> $grab_sprite = nullptr;
StatusUI& $status_ui; StatusUI& $status_ui;
LootUI& $loot_ui; LootUI& $loot_ui;
sf::RenderWindow& $window; sf::RenderWindow& $window;
@ -37,6 +38,7 @@ namespace gui {
void ITEM_PICKUP(Event ev, std::any data); void ITEM_PICKUP(Event ev, std::any data);
void handle_mouse(Event ev, guecs::UI& gui); void handle_mouse(Event ev, guecs::UI& gui);
void mouse_action(bool hover); void mouse_action(bool hover);
void render();
sf::Vector2f mouse_position(); sf::Vector2f mouse_position();
}; };
} }

@ -366,6 +366,7 @@ namespace gui {
$combat_ui.render($window); $combat_ui.render($window);
if($loot_ui.active) $loot_ui.render($window); if($loot_ui.active) $loot_ui.render($window);
$dnd_loot.render();
if($map_open) { if($map_open) {
$map_ui.render($window, $main_ui.$compass_dir); $map_ui.render($window, $main_ui.$compass_dir);