/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace GUI { class Layout : public Core::Object { C_OBJECT_ABSTRACT(Layout); public: virtual ~Layout(); void add_widget(Widget&); void insert_widget_before(Widget& widget, Widget& before_widget); void add_layout(OwnPtr&&); void add_spacer(); void remove_widget(Widget&); virtual void run(Widget&) = 0; virtual Gfx::IntSize preferred_size() const = 0; void notify_adopted(Badge, Widget&); void notify_disowned(Badge, Widget&); const Margins& margins() const { return m_margins; } void set_margins(const Margins&); int spacing() const { return m_spacing; } void set_spacing(int); protected: Layout(); 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; Margins m_margins; int m_spacing { 3 }; }; }