Worked out an initial stab at a GrabSource for drag-n-drop or just simple grabbing things in the UI.

master
Zed A. Shaw 11 hours ago
parent 94385b195d
commit 842aac3127
  1. 38
      gui/fsm.cpp
  2. 3
      gui/fsm.hpp
  3. 20
      gui/guecstra.hpp
  4. 15
      gui/loot_ui.cpp
  5. 3
      gui/loot_ui.hpp

@ -10,6 +10,7 @@
#include "sound.hpp" #include "sound.hpp"
#include "shaders.hpp" #include "shaders.hpp"
#include <fmt/xchar.h> #include <fmt/xchar.h>
#include "gui/guecstra.hpp"
namespace gui { namespace gui {
using namespace components; using namespace components;
@ -57,7 +58,6 @@ namespace gui {
} }
void FSM::START(Event ) { void FSM::START(Event ) {
$main_ui.update_level($level); $main_ui.update_level($level);
$main_ui.init(); $main_ui.init();
$loot_ui.init(); $loot_ui.init();
@ -133,37 +133,34 @@ namespace gui {
break; break;
case LOOT_SELECT: { case LOOT_SELECT: {
int slot_id = std::any_cast<int>(data); int slot_id = std::any_cast<int>(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); if(auto world_entity = $loot_ui.select_slot(slot_id)) {
$dumb_sprite->setOrigin({128, 128}); $grab_source = $loot_ui.$gui.entity("item_", slot_id);
$dumb_sprite->setPosition({ auto& source = $loot_ui.get_grabber(*$grab_source);
float($router.position.x),
float($router.position.y) source.grab($window);
}); source.move($router.position);
$status_ui.select_slot(slot_id, *world_entity);
} }
} break; } break;
case INV_SELECT: { case INV_SELECT: {
std::string slot_name = std::any_cast<std::string>(data); std::string slot_name = std::any_cast<std::string>(data);
int slot_id = $status_ui.place_slot(slot_name); 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) { if(slot_id != -1) {
$loot_ui.remove_slot(slot_id); $loot_ui.remove_slot(slot_id);
} }
$window.setMouseCursorVisible(true); $window.setMouseCursorVisible(true);
$dumb_sprite = nullptr;
state(State::LOOTING); state(State::LOOTING);
} break; } break;
case MOUSE_CLICK: case MOUSE_CLICK:
mouse_action(false); mouse_action(false);
break; break;
case MOUSE_MOVE: { case MOUSE_MOVE: {
if($dumb_sprite) { if($grab_source) {
$dumb_sprite->setPosition({ auto& source = $loot_ui.get_grabber(*$grab_source);
float($router.position.x), source.move($router.position);
float($router.position.y)
});
} }
mouse_action(true); mouse_action(true);
} break; } break;
@ -171,11 +168,9 @@ namespace gui {
mouse_action(false); mouse_action(false);
} break; } break;
case MOUSE_DRAG: { case MOUSE_DRAG: {
if($dumb_sprite) { if($grab_source) {
$dumb_sprite->setPosition({ auto& source = $loot_ui.get_grabber(*$grab_source);
float($router.position.x), source.move($router.position);
float($router.position.y)
});
} }
mouse_action(true); mouse_action(true);
} break; } break;
@ -241,6 +236,7 @@ namespace gui {
state(State::INV_GRAB); state(State::INV_GRAB);
INV_GRAB(ev, data); INV_GRAB(ev, data);
break; break;
case MOUSE_DRAG_START:
case MOUSE_CLICK: case MOUSE_CLICK:
mouse_action(false); mouse_action(false);
break; break;

@ -49,7 +49,8 @@ namespace gui {
LootUI $loot_ui; LootUI $loot_ui;
sf::Font $font; sf::Font $font;
gui::routing::Router $router; gui::routing::Router $router;
shared_ptr<sf::Sprite> $dumb_sprite = nullptr; std::optional<DinkyECS::Entity> $grab_source;
std::optional<DinkyECS::Entity> $drop_target;
FSM(); FSM();

@ -1,8 +1,28 @@
#pragma once
#include "components.hpp" #include "components.hpp"
#include "events.hpp" #include "events.hpp"
#include <guecs/ui.hpp> #include <guecs/ui.hpp>
#include "textures.hpp"
namespace guecs { namespace guecs {
Clickable make_action(DinkyECS::World& target, Events::GUI event); Clickable make_action(DinkyECS::World& target, Events::GUI event);
Clickable make_action(DinkyECS::World& target, Events::GUI event, std::any data); 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 {
};
} }

@ -1,7 +1,6 @@
#include "gui/loot_ui.hpp" #include "gui/loot_ui.hpp"
#include "constants.hpp" #include "constants.hpp"
#include <fmt/xchar.h> #include <fmt/xchar.h>
#include "gui/guecstra.hpp"
namespace gui { namespace gui {
using namespace guecs; using namespace guecs;
@ -55,12 +54,6 @@ namespace gui {
} }
} }
shared_ptr<sf::Sprite> LootUI::grab_sprite(int slot_id) {
auto id = $gui.entity("item_", slot_id);
auto& sprite = $gui.get<guecs::Sprite>(id);
return sprite.sprite;
}
void LootUI::remove_slot(int slot_id) { void LootUI::remove_slot(int slot_id) {
dbc::check(size_t(slot_id) < contents.size(), dbc::check(size_t(slot_id) < contents.size(),
fmt::format("invalid slot id {} give, contents.size={}", fmt::format("invalid slot id {} give, contents.size={}",
@ -83,12 +76,16 @@ namespace gui {
if(i < contents.size()) { if(i < contents.size()) {
auto item = contents.at(i); auto item = contents.at(i);
auto& sprite = $level.world->get<components::Sprite>(item); auto& sprite = $level.world->get<components::Sprite>(item);
fmt::println("NEW SPRITE SPRITE {}", sprite.name); guecs::GrabSource grabber{sprite.name};
$gui.set_init<guecs::Sprite>(id, {sprite.name}); $gui.set_init<guecs::Sprite>(id, grabber);
} }
} }
} }
guecs::GrabSource& LootUI::get_grabber(DinkyECS::Entity entity) {
return static_cast<guecs::GrabSource&>($gui.get<guecs::Sprite>(entity));
}
void LootUI::render(sf::RenderWindow& window) { void LootUI::render(sf::RenderWindow& window) {
$gui.render(window); $gui.render(window);
} }

@ -1,4 +1,5 @@
#pragma once #pragma once
#include "gui/guecstra.hpp"
#include "levelmanager.hpp" #include "levelmanager.hpp"
#include <SFML/Graphics/RenderWindow.hpp> #include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Font.hpp> #include <SFML/Graphics/Font.hpp>
@ -22,6 +23,6 @@ namespace gui {
bool mouse(float x, float y, bool hover); bool mouse(float x, float y, bool hover);
std::optional<DinkyECS::Entity> select_slot(int slot); std::optional<DinkyECS::Entity> select_slot(int slot);
void remove_slot(int slot_id); void remove_slot(int slot_id);
shared_ptr<sf::Sprite> grab_sprite(int slot_id); guecs::GrabSource& get_grabber(DinkyECS::Entity entity);
}; };
} }

Loading…
Cancel
Save