ModelEditingDelegate.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 <LibGUI/Model.h>
  8. #include <LibGUI/TextBox.h>
  9. #include <LibGUI/Widget.h>
  10. namespace GUI {
  11. class ModelEditingDelegate {
  12. public:
  13. virtual ~ModelEditingDelegate() { }
  14. void bind(Model& model, const ModelIndex& index)
  15. {
  16. if (m_model.ptr() == &model && m_index == index)
  17. return;
  18. m_model = model;
  19. m_index = index;
  20. m_widget = create_widget();
  21. }
  22. Widget* widget() { return m_widget; }
  23. const Widget* widget() const { return m_widget; }
  24. Function<void()> on_commit;
  25. Function<void()> on_rollback;
  26. virtual Variant value() const = 0;
  27. virtual void set_value(const Variant&) = 0;
  28. virtual void will_begin_editing() { }
  29. protected:
  30. ModelEditingDelegate() { }
  31. virtual RefPtr<Widget> create_widget() = 0;
  32. void commit()
  33. {
  34. if (on_commit)
  35. on_commit();
  36. }
  37. void rollback()
  38. {
  39. if (on_rollback)
  40. on_rollback();
  41. }
  42. const ModelIndex& index() const { return m_index; }
  43. private:
  44. RefPtr<Model> m_model;
  45. ModelIndex m_index;
  46. RefPtr<Widget> m_widget;
  47. };
  48. class StringModelEditingDelegate : public ModelEditingDelegate {
  49. public:
  50. StringModelEditingDelegate() { }
  51. virtual ~StringModelEditingDelegate() override { }
  52. virtual RefPtr<Widget> create_widget() override
  53. {
  54. auto textbox = TextBox::construct();
  55. textbox->on_return_pressed = [this] {
  56. commit();
  57. };
  58. textbox->on_escape_pressed = [this] {
  59. rollback();
  60. };
  61. return textbox;
  62. }
  63. virtual Variant value() const override { return static_cast<const TextBox*>(widget())->text(); }
  64. virtual void set_value(const Variant& value) override
  65. {
  66. auto& textbox = static_cast<TextBox&>(*widget());
  67. textbox.set_text(value.to_string());
  68. textbox.select_all();
  69. }
  70. };
  71. }