#ifndef FRONTEND_GUI_GUI_H_ #define FRONTEND_GUI_GUI_H_ #include #include #include #include #include #include #include #include "../../delegates.h" class GfxContext; 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 PagesControl; /** 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(float delta); public: GUI(); ~GUI(); /** Get the main menu (PagesControl) node */ std::shared_ptr getMenu(); /** Get current focused node * @return focused node or nullptr */ std::shared_ptr getFocused() const; /** Check if all user input is caught by some element like TextBox */ bool isFocusCaught() const; /** Main input handling and logic update method * @param delta delta time */ void act(float delta); /** Draw all visible elements on main container * @param pctx parent graphics context * @param assets active assets storage */ void draw(const GfxContext* pctx, Assets* assets); /** Add node to the main container */ void add(std::shared_ptr node); /** Remove node from the main container */ void remove(std::shared_ptr node) noexcept; /** 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); /** Get node from the GUI nodes dictionary * @param name node key * @return stored node or nullptr */ std::shared_ptr get(std::string name) noexcept; /** Remove node from the GUI nodes dictionary * @param name node key */ void remove(std::string name) noexcept; /** Set node as focused * @param node new focused node or nullptr to remove focus */ void setFocus(std::shared_ptr node); /** Get the main container */ std::shared_ptr getContainer() const; void postRunnable(runnable callback); }; } #endif // FRONTEND_GUI_GUI_H_