FormEditorWidget.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #pragma once
  2. #include <LibGUI/GScrollableWidget.h>
  3. class FormWidget;
  4. class Tool;
  5. class FormEditorWidget final : public GScrollableWidget {
  6. C_OBJECT(FormEditorWidget)
  7. public:
  8. virtual ~FormEditorWidget() override;
  9. FormWidget& form_widget() { return *m_form_widget; }
  10. const FormWidget& form_widget() const { return *m_form_widget; }
  11. Tool& tool() { return *m_tool; }
  12. const Tool& tool() const { return *m_tool; }
  13. void set_tool(NonnullOwnPtr<Tool>);
  14. class WidgetSelection {
  15. public:
  16. bool is_empty() const
  17. {
  18. return m_widgets.is_empty();
  19. }
  20. bool contains(GWidget& widget) const
  21. {
  22. return m_widgets.contains(&widget);
  23. }
  24. void toggle(GWidget& widget)
  25. {
  26. if (contains(widget))
  27. remove(widget);
  28. else
  29. add(widget);
  30. }
  31. void set(GWidget& widget)
  32. {
  33. clear();
  34. add(widget);
  35. }
  36. void remove(GWidget& widget)
  37. {
  38. ASSERT(m_widgets.contains(&widget));
  39. m_widgets.remove(&widget);
  40. }
  41. void add(GWidget& widget)
  42. {
  43. m_widgets.set(&widget);
  44. }
  45. void clear()
  46. {
  47. m_widgets.clear();
  48. }
  49. template<typename Callback>
  50. void for_each(Callback callback)
  51. {
  52. for (auto& it : m_widgets) {
  53. if (callback(*it) == IterationDecision::Break)
  54. break;
  55. }
  56. }
  57. WidgetSelection() {}
  58. private:
  59. HashTable<GWidget*> m_widgets;
  60. };
  61. WidgetSelection& selection() { return m_selection; }
  62. private:
  63. virtual void paint_event(GPaintEvent&) override;
  64. explicit FormEditorWidget(GWidget* parent);
  65. RefPtr<FormWidget> m_form_widget;
  66. NonnullOwnPtr<Tool> m_tool;
  67. WidgetSelection m_selection;
  68. };