#pragma once #include "openvic-simulation/interface/GFX.hpp" namespace OpenVic { class UIManager; } namespace OpenVic::GUI { class Scene; class Element : public Named { friend class Scene; public: enum class orientation_t { UPPER_LEFT, LOWER_LEFT, LOWER_RIGHT, UPPER_RIGHT, CENTER }; private: fvec2_t PROPERTY(position); orientation_t PROPERTY(orientation); protected: Element(); bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; static bool _fill_elements_key_map( NodeTools::key_map_t& key_map, NodeTools::callback_t&&> callback, UIManager const& ui_manager ); public: Element(Element&&) = default; virtual ~Element() = default; OV_DETAIL_GET_BASE_TYPE(Element) OV_DETAIL_GET_TYPE }; class Scene : public Named { friend std::unique_ptr std::make_unique(); NamedInstanceRegistry IDENTIFIER_REGISTRY(scene_element); protected: Scene() = default; bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; public: Scene(Scene&&) = default; virtual ~Scene() = default; OV_DETAIL_GET_TYPE static NodeTools::node_callback_t expect_scene( std::string_view scene_name, NodeTools::callback_t&&> callback, UIManager const& ui_manager ); }; class Window final : public Element { friend std::unique_ptr std::make_unique(); NamedInstanceRegistry IDENTIFIER_REGISTRY(window_element); fvec2_t PROPERTY(size); bool PROPERTY(moveable); bool PROPERTY(fullscreen); // TODO - background, dontRender, horizontalBorder, verticalBorder protected: Window(); bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; public: Window(Window&&) = default; virtual ~Window() = default; OV_DETAIL_GET_TYPE }; class Icon final : public Element { friend std::unique_ptr std::make_unique(); GFX::Sprite const* PROPERTY(sprite); GFX::frame_t PROPERTY(frame); protected: Icon(); bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; public: Icon(Icon&&) = default; virtual ~Icon() = default; OV_DETAIL_GET_TYPE }; class BaseButton : public Element { GFX::Sprite const* PROPERTY(sprite); // TODO - shortcut protected: BaseButton(); bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; public: BaseButton(BaseButton&&) = default; virtual ~BaseButton() = default; OV_DETAIL_GET_TYPE }; class Button final : public BaseButton { friend std::unique_ptr