#pragma once #include "openvic-simulation/interface/GFXSprite.hpp" namespace OpenVic { class UIManager; } namespace OpenVic::GUI { class Scene; class Position final : public Named<> { friend class LoadBase; fvec2_t PROPERTY(position); protected: Position(); bool _fill_key_map(NodeTools::case_insensitive_key_map_t& key_map) override; public: Position(Position&&) = default; virtual ~Position() = default; }; class Element : public Named { friend class Scene; public: enum class orientation_t { UPPER_LEFT, LOWER_LEFT, LOWER_RIGHT, UPPER_RIGHT, CENTER, CENTER_UP, CENTER_DOWN }; private: fvec2_t PROPERTY(position); orientation_t PROPERTY(orientation); protected: Element(); bool _fill_key_map(NodeTools::case_insensitive_key_map_t& key_map, UIManager const& ui_manager) override; static bool _fill_elements_key_map( NodeTools::case_insensitive_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 }; using element_instance_registry_t = NamedInstanceRegistry; class Scene : public Named { friend std::unique_ptr std::make_unique(); element_instance_registry_t IDENTIFIER_REGISTRY(scene_element); NamedRegistry IDENTIFIER_REGISTRY(scene_position); protected: Scene() = default; bool _fill_key_map(NodeTools::case_insensitive_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(); element_instance_registry_t IDENTIFIER_REGISTRY(window_element); std::string PROPERTY(background); /* The name of a child button who's sprite is used as the background. */ fvec2_t PROPERTY(size); bool PROPERTY(moveable); bool PROPERTY(fullscreen); // TODO - dontRender, horizontalBorder, verticalBorder protected: Window(); bool _fill_key_map(NodeTools::case_insensitive_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); fixed_point_t PROPERTY(scale); fixed_point_t PROPERTY(rotation); /* In radians, usually one of 0, PI/2 or -PI/2. */ protected: Icon(); bool _fill_key_map(NodeTools::case_insensitive_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); std::string PROPERTY(text); GFX::Font const* PROPERTY(font); // TODO - shortcut protected: BaseButton(); bool _fill_key_map(NodeTools::case_insensitive_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