#ifndef EDITOR_VISITOR_H #define EDITOR_VISITOR_H #include "../sdlpp/sdlpp_visitor.hpp" #include "../sdlpp/sdlpp_geometry.hpp" #include "blocks.hpp" #include "gui/gui.hpp" #include struct VisitorType { enum Value { Terrain = 0xE001, Modifier = 0xE002, Character = 0xE003, }; }; class MouseVisitor : public SDLPP::Visitor { public: MouseVisitor() = default; void visit(const SDLPP::RenderObject &obj) override; void setFromId(uint64_t /*UNUSED*/) override {} uint64_t getFromId() const override { return 0; } uint64_t getFlags() const { return select_flags; } bool foundEditBox() const { return edit_box; } const SDLPP::Vec2D &getEditBoxIndexes() const { return edit_box_location; } bool foundToolBox() const { return tool_box; } const SDLPP::Vec2D &getToolBoxIndexes() const { return tool_box_location; } void setVisitorType(uint64_t type) override { _type = type; } uint64_t getVisitorType() const override { return _type; } uint64_t getToolType() const { return tool_box_type; } uint64_t getCurButton() const { return cur_button; } static bool moveMapLeft(uint64_t flags); static bool moveMapRight(uint64_t flags); static bool moveToolsLeft(uint64_t flags); static bool moveToolsRight(uint64_t flags); static bool moveModsLeft(uint64_t flags); static bool moveModsRight(uint64_t flags); static bool moveCharactersLeft(uint64_t flags); static bool moveCharactersRight(uint64_t flags); static bool button(uint64_t flags); private: uint64_t select_flags = 0; bool edit_box = false; bool tool_box = false; SDLPP::Vec2D edit_box_location = { -1, -1 }; SDLPP::Vec2D tool_box_location = { -1, -1 }; uint64_t _type{}; uint64_t tool_box_type = 0; uint64_t cur_button = -1; }; class ToolVisitor : public SDLPP::Visitor { public: ToolVisitor() = default; void visit(const SDLPP::RenderObject &obj) override; void setFromId(uint64_t id) override { source_id = id; } uint64_t getFromId() const override { return source_id; } void setVisitorType(uint64_t type) override { _type = type; } uint64_t getVisitorType() const override { return _type; } void setSourceType(LandType::Value type) { source_type = type; } void setSourceData(const uint64_t &data) { _data = data; } bool addBlock() const; bool removeBlock() const; private: bool remove_block = false; bool add_block = true; uint64_t source_id = 0; uint64_t _type = 0; uint64_t _data = 0; LandType::Value source_type{}; }; #endif