#ifndef GUI_Frame_h__ #define GUI_Frame_h__ #include #include "Util/Rectangle.h" #include "EventBroker.h" // HACK: Decouple renderer plz #include "Renderer.h" namespace GUI { class Frame : public Rectangle { public: enum class Anchor { Left, Right, Top, Bottom }; // Set up a base frame with an event broker Frame(std::shared_ptr<::EventBroker> eventBroker) : EventBroker(eventBroker) , Rectangle() { Initialize(); } // Create a frame as a child Frame(std::shared_ptr parent) : Rectangle(static_cast(*parent)) // Clone parent rectangle using copy constructor { SetParent(parent); Initialize(); } virtual void Initialize() { } std::shared_ptr Parent() const { return m_Parent; } void SetParent(std::shared_ptr parent) { parent->AddChild(std::shared_ptr(this)); m_Parent = parent; EventBroker = parent->EventBroker; } void AddChild(std::shared_ptr child) { m_Children.push_back(child); if (m_Parent != nullptr) { m_Parent->AddChild(child); } } typedef std::list>::const_iterator FrameChildrenIterator; FrameChildrenIterator begin() { return m_Children.begin(); } FrameChildrenIterator end() { return m_Children.end(); } virtual void Update(double dt) { } virtual void Draw(Renderer* renderer) { } protected: std::shared_ptr<::EventBroker> EventBroker; std::shared_ptr m_Parent; std::list> m_Children; }; } #endif // GUI_Frame_h__