#ifndef FRONTEND_GUI_GUI_HPP_ #define FRONTEND_GUI_GUI_HPP_ #include "../../delegates.hpp" #include #include #include #include #include #include class Viewport; class DrawContext; class Assets; class Camera; /* Some info about padding and margin. Padding is element inner space, margin is outer glm::vec4 usage: x - left y - top z - right w - bottom Outer element +======================================================================+ | . . . . | | .padding.y . . . | | padding.x . . . . padding.z | |- - - - - - + - - - - - + - - - - - - - - - -+- - - - - + - - - - - - | | . . . . | | . .margin.y . . | | .margin.x . . margin.z. | |- - - - - - + - - - - - +====================+- - - - - + - - - - - - | | . | Inner element | . | |- - - - - - + - - - - - +====================+- - - - - + - - - - - - | | . . . . | | . .margin.w . . | | . . . . | |- - - - - - + - - - - - + - - - - - - - - - -+- - - - - + - - - - - - | | . . . . | | .padding.w . . . | | . . . . | +======================================================================+ */ namespace gui { class UINode; class Container; class Menu; /// @brief The main UI controller class GUI { std::shared_ptr container; std::shared_ptr hover = nullptr; std::shared_ptr pressed = nullptr; std::shared_ptr focus = nullptr; std::unordered_map> storage; std::unique_ptr uicamera; std::shared_ptr menu; std::queue postRunnables; void actMouse(); void actFocused(); public: GUI(); ~GUI(); /// @brief Get the main menu (Menu) node std::shared_ptr getMenu(); /// @brief Get current focused node /// @return focused node or nullptr std::shared_ptr getFocused() const; /// @brief Check if all user input is caught by some element like TextBox bool isFocusCaught() const; /// @brief Main input handling and logic update method /// @param delta delta time /// @param viewport window size void act(float delta, const Viewport& viewport); /// @brief Draw all visible elements on main container /// @param pctx parent graphics context /// @param assets active assets storage void draw(const DrawContext* pctx, Assets* assets); /// @brief Add element to the main container /// @param node UI element void add(std::shared_ptr node); /// @brief Remove node from the main container void remove(std::shared_ptr node) noexcept; /// @brief Store node in the GUI nodes dictionary /// (does not add node to the main container) /// @param name node key /// @param node target node void store(std::string name, std::shared_ptr node); /// @brief Get node from the GUI nodes dictionary /// @param name node key /// @return stored node or nullptr std::shared_ptr get(std::string name) noexcept; /// @brief Remove node from the GUI nodes dictionary /// @param name node key void remove(std::string name) noexcept; /// @brief Set node as focused /// @param node new focused node or nullptr to remove focus void setFocus(std::shared_ptr node); /// @brief Get the main container /// @deprecated std::shared_ptr getContainer() const; void onAssetsLoad(Assets* assets); void postRunnable(runnable callback); }; } #endif // FRONTEND_GUI_GUI_HPP_