FilteringProxyModel.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/DeprecatedString.h>
  8. #include <AK/EnumBits.h>
  9. #include <AK/NonnullRefPtr.h>
  10. #include <AK/Optional.h>
  11. #include <LibGUI/Model.h>
  12. #include <LibGUI/TextBox.h>
  13. namespace GUI {
  14. class FilteringProxyModel final : public Model
  15. , public ModelClient {
  16. public:
  17. enum class FilteringOptions {
  18. None,
  19. SortByScore = 1 << 1
  20. };
  21. static ErrorOr<NonnullRefPtr<FilteringProxyModel>> create(NonnullRefPtr<Model> model, FilteringOptions filtering_options = FilteringOptions::None)
  22. {
  23. return adopt_nonnull_ref_or_enomem(new (nothrow) FilteringProxyModel(move(model), filtering_options));
  24. }
  25. virtual ~FilteringProxyModel() override
  26. {
  27. m_model->unregister_client(*this);
  28. }
  29. virtual int row_count(ModelIndex const& = ModelIndex()) const override;
  30. virtual int column_count(ModelIndex const& = ModelIndex()) const override;
  31. virtual ErrorOr<String> column_name(int) const override;
  32. virtual Variant data(ModelIndex const&, ModelRole = ModelRole::Display) const override;
  33. virtual void invalidate() override;
  34. virtual ModelIndex index(int row, int column = 0, ModelIndex const& parent = ModelIndex()) const override;
  35. virtual bool is_searchable() const override;
  36. virtual Vector<ModelIndex> matches(StringView, unsigned = MatchesFlag::AllMatching, ModelIndex const& = ModelIndex()) override;
  37. void set_filter_term(StringView term);
  38. ModelIndex map(ModelIndex const&) const;
  39. protected:
  40. virtual void model_did_update([[maybe_unused]] unsigned flags) override { invalidate(); }
  41. private:
  42. struct ModelIndexWithScore {
  43. ModelIndex index;
  44. int score { 0 };
  45. };
  46. void filter();
  47. explicit FilteringProxyModel(NonnullRefPtr<Model> model, FilteringOptions filtering_options = FilteringOptions::None)
  48. : m_model(move(model))
  49. , m_filtering_options(filtering_options)
  50. {
  51. m_model->register_client(*this);
  52. }
  53. NonnullRefPtr<Model> m_model;
  54. // Maps row to actual model index.
  55. Vector<ModelIndexWithScore> m_matching_indices;
  56. DeprecatedString m_filter_term;
  57. FilteringOptions m_filtering_options;
  58. };
  59. AK_ENUM_BITWISE_OPERATORS(FilteringProxyModel::FilteringOptions);
  60. }