GModelEditingDelegate.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #pragma once
  2. #include <LibGUI/GModel.h>
  3. #include <LibGUI/GTextBox.h>
  4. #include <LibGUI/GWidget.h>
  5. class GModelEditingDelegate {
  6. public:
  7. GModelEditingDelegate() {}
  8. virtual ~GModelEditingDelegate() {}
  9. void bind(GModel& model, const GModelIndex& index)
  10. {
  11. if (m_model.ptr() == &model && m_index == index)
  12. return;
  13. m_model = model;
  14. m_index = index;
  15. m_widget = create_widget();
  16. }
  17. GWidget* widget() { return m_widget; }
  18. const GWidget* widget() const { return m_widget; }
  19. Function<void()> on_commit;
  20. virtual GVariant value() const = 0;
  21. virtual void set_value(const GVariant&) = 0;
  22. virtual void will_begin_editing() { }
  23. protected:
  24. virtual ObjectPtr<GWidget> create_widget() = 0;
  25. void commit()
  26. {
  27. if (on_commit)
  28. on_commit();
  29. }
  30. private:
  31. RefPtr<GModel> m_model;
  32. GModelIndex m_index;
  33. ObjectPtr<GWidget> m_widget;
  34. };
  35. class GStringModelEditingDelegate : public GModelEditingDelegate {
  36. public:
  37. GStringModelEditingDelegate() {}
  38. virtual ~GStringModelEditingDelegate() override {}
  39. virtual ObjectPtr<GWidget> create_widget() override
  40. {
  41. auto textbox = GTextBox::construct(nullptr);
  42. textbox->on_return_pressed = [this] {
  43. commit();
  44. };
  45. return textbox;
  46. }
  47. virtual GVariant value() const override { return static_cast<const GTextBox*>(widget())->text(); }
  48. virtual void set_value(const GVariant& value) override { static_cast<GTextBox*>(widget())->set_text(value.to_string()); }
  49. };