#pragma once #include #include #include #include #include class GWidget; class GLayout { public: GLayout(); virtual ~GLayout(); void add_widget(GWidget&); void add_layout(OwnPtr&&); void add_spacer(); void remove_widget(GWidget&); virtual void run(GWidget&) = 0; void notify_adopted(Badge, GWidget&); void notify_disowned(Badge, GWidget&); GMargins margins() const { return m_margins; } void set_margins(const GMargins&); int spacing() const { return m_spacing; } void set_spacing(int); protected: struct Entry { enum class Type { Invalid = 0, Widget, Layout, Spacer, }; Type type { Type::Invalid }; WeakPtr widget; OwnPtr layout; }; void add_entry(Entry&&); WeakPtr m_owner; Vector m_entries; GMargins m_margins; int m_spacing { 3 }; };