diff options
Diffstat (limited to 'src/openvic-simulation/interface/GUI.hpp')
-rw-r--r-- | src/openvic-simulation/interface/GUI.hpp | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/src/openvic-simulation/interface/GUI.hpp b/src/openvic-simulation/interface/GUI.hpp new file mode 100644 index 0000000..1a76ca0 --- /dev/null +++ b/src/openvic-simulation/interface/GUI.hpp @@ -0,0 +1,235 @@ +#pragma once + +#include "openvic-simulation/interface/GFX.hpp" + +namespace OpenVic { + class UIManager; +} +namespace OpenVic::GUI { + class Scene; + + class Element : public Named<UIManager const&> { + friend class Scene; + + public: + enum class orientation_t { + UPPER_LEFT, LOWER_LEFT, LOWER_RIGHT, UPPER_RIGHT, CENTER + }; + + private: + ivec2_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<std::unique_ptr<Element>&&> 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<UIManager const&> { + friend std::unique_ptr<Scene> std::make_unique<Scene>(); + + NamedInstanceRegistry<Element, UIManager const&> elements; + + protected: + Scene(); + + 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<std::unique_ptr<Scene>&&> callback, UIManager const& ui_manager + ); + + IDENTIFIER_REGISTRY_ACCESSORS(element) + }; + + class Window final : public Element { + friend std::unique_ptr<Window> std::make_unique<Window>(); + + NamedInstanceRegistry<Element, UIManager const&> elements; + + ivec2_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 + + IDENTIFIER_REGISTRY_ACCESSORS(element) + }; + + class Icon final : public Element { + friend std::unique_ptr<Icon> std::make_unique<Icon>(); + + 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<Button> std::make_unique<Button>(); + + std::string PROPERTY(text); + GFX::Font const* PROPERTY(font); + + // TODO - clicksound + + protected: + Button() ; + + bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; + + public: + Button(Button&&) = default; + virtual ~Button() = default; + + OV_DETAIL_GET_TYPE + }; + + class Checkbox final : public BaseButton { + friend std::unique_ptr<Checkbox> std::make_unique<Checkbox>(); + + protected: + Checkbox() = default; + + bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; + + public: + Checkbox(Checkbox&&) = default; + virtual ~Checkbox() = default; + + OV_DETAIL_GET_TYPE + }; + + class AlignedElement : public Element { + public: + enum class format_t { + left, centre, right + }; + + private: + format_t PROPERTY(format); + + protected: + AlignedElement(); + + bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; + + public: + AlignedElement(AlignedElement&&) = default; + virtual ~AlignedElement() = default; + + OV_DETAIL_GET_TYPE + }; + + class Text final : public AlignedElement { + friend std::unique_ptr<Text> std::make_unique<Text>(); + + std::string PROPERTY(text); + GFX::Font const* PROPERTY(font); + ivec2_t PROPERTY(max_size); // maxWidth, maxHeight + + // TODO - borderSize, fixedsize, textureFile + + protected: + Text(); + + bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; + + public: + Text(Text&&) = default; + virtual ~Text() = default; + + OV_DETAIL_GET_TYPE + }; + + class OverlappingElementsBox final : public AlignedElement { + friend std::unique_ptr<OverlappingElementsBox> std::make_unique<OverlappingElementsBox>(); + + ivec2_t PROPERTY(size); + + // TODO - spacing + + protected: + OverlappingElementsBox(); + + bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; + + public: + OverlappingElementsBox(OverlappingElementsBox&&) = default; + virtual ~OverlappingElementsBox() = default; + + OV_DETAIL_GET_TYPE + }; + + class ListBox final : public Element { + friend std::unique_ptr<ListBox> std::make_unique<ListBox>(); + + ivec2_t PROPERTY(size); + + // TODO - backGround, spacing, scrollbartype, borderSize + + protected: + ListBox(); + + bool _fill_key_map(NodeTools::key_map_t& key_map, UIManager const& ui_manager) override; + + public: + ListBox(ListBox&&) = default; + virtual ~ListBox() = default; + + OV_DETAIL_GET_TYPE + }; +} |