ModelEditingDelegate.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <LibGUI/Model.h>
  9. #include <LibGUI/TextBox.h>
  10. #include <LibGUI/Widget.h>
  11. namespace GUI {
  12. class ModelEditingDelegate {
  13. public:
  14. enum SelectionBehavior {
  15. DoNotSelect,
  16. SelectAll,
  17. };
  18. virtual ~ModelEditingDelegate() = default;
  19. void bind(Model& model, ModelIndex const& index)
  20. {
  21. if (m_model.ptr() == &model && m_index == index)
  22. return;
  23. m_model = model;
  24. m_index = index;
  25. m_widget = create_widget();
  26. }
  27. Widget* widget() { return m_widget; }
  28. Widget const* widget() const { return m_widget; }
  29. Function<void()> on_commit;
  30. Function<void()> on_rollback;
  31. Function<void()> on_change;
  32. virtual Variant value() const = 0;
  33. virtual void set_value(Variant const&, SelectionBehavior selection_behavior = SelectionBehavior::SelectAll) = 0;
  34. virtual void will_begin_editing() { }
  35. protected:
  36. ModelEditingDelegate() = default;
  37. virtual RefPtr<Widget> create_widget() = 0;
  38. void commit()
  39. {
  40. if (on_commit)
  41. on_commit();
  42. }
  43. void rollback()
  44. {
  45. if (on_rollback)
  46. on_rollback();
  47. }
  48. void change()
  49. {
  50. if (on_change)
  51. on_change();
  52. }
  53. ModelIndex const& index() const { return m_index; }
  54. private:
  55. RefPtr<Model> m_model;
  56. ModelIndex m_index;
  57. RefPtr<Widget> m_widget;
  58. };
  59. class StringModelEditingDelegate : public ModelEditingDelegate {
  60. public:
  61. StringModelEditingDelegate() = default;
  62. virtual ~StringModelEditingDelegate() override = default;
  63. virtual RefPtr<Widget> create_widget() override
  64. {
  65. auto textbox = TextBox::construct();
  66. textbox->set_frame_shape(Gfx::FrameShape::NoFrame);
  67. textbox->on_return_pressed = [this] {
  68. commit();
  69. };
  70. textbox->on_escape_pressed = [this] {
  71. rollback();
  72. };
  73. textbox->on_change = [this] {
  74. change();
  75. };
  76. return textbox;
  77. }
  78. virtual Variant value() const override { return static_cast<TextBox const*>(widget())->text(); }
  79. virtual void set_value(Variant const& value, SelectionBehavior selection_behavior) override
  80. {
  81. auto& textbox = static_cast<TextBox&>(*widget());
  82. textbox.set_text(value.to_string());
  83. if (selection_behavior == SelectionBehavior::SelectAll)
  84. textbox.select_all();
  85. }
  86. };
  87. }