Layout.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/OwnPtr.h>
  8. #include <AK/Vector.h>
  9. #include <AK/WeakPtr.h>
  10. #include <LibCore/Object.h>
  11. #include <LibGUI/Forward.h>
  12. #include <LibGUI/Margins.h>
  13. #include <LibGfx/Forward.h>
  14. namespace GUI {
  15. class Layout : public Core::Object {
  16. C_OBJECT_ABSTRACT(Layout);
  17. public:
  18. virtual ~Layout();
  19. void add_widget(Widget&);
  20. void insert_widget_before(Widget& widget, Widget& before_widget);
  21. void add_layout(OwnPtr<Layout>&&);
  22. void add_spacer();
  23. void remove_widget(Widget&);
  24. virtual void run(Widget&) = 0;
  25. virtual Gfx::IntSize preferred_size() const = 0;
  26. void notify_adopted(Badge<Widget>, Widget&);
  27. void notify_disowned(Badge<Widget>, Widget&);
  28. const Margins& margins() const { return m_margins; }
  29. void set_margins(const Margins&);
  30. int spacing() const { return m_spacing; }
  31. void set_spacing(int);
  32. protected:
  33. Layout();
  34. struct Entry {
  35. enum class Type {
  36. Invalid = 0,
  37. Widget,
  38. Layout,
  39. Spacer,
  40. };
  41. Type type { Type::Invalid };
  42. WeakPtr<Widget> widget;
  43. OwnPtr<Layout> layout;
  44. };
  45. void add_entry(Entry&&);
  46. WeakPtr<Widget> m_owner;
  47. Vector<Entry> m_entries;
  48. Margins m_margins;
  49. int m_spacing { 3 };
  50. };
  51. }