From 8fb52c696201740b7c427a5fa34d5e13996d1936 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Thu, 2 Dec 2021 21:16:26 +0100 Subject: [PATCH] LibGUI: Make FilteringProxyModel reference-count its parent model Before this change, the destructor of FilteringProxyModel would crash if the parent model had been destroyed earlier. This unifies the behaviour of FilteringProxyModel with SortingProxyModel in this respect. --- Userland/Libraries/LibGUI/FilteringProxyModel.cpp | 12 ++++++------ Userland/Libraries/LibGUI/FilteringProxyModel.h | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Userland/Libraries/LibGUI/FilteringProxyModel.cpp b/Userland/Libraries/LibGUI/FilteringProxyModel.cpp index 8c80f7318f..bb243b572c 100644 --- a/Userland/Libraries/LibGUI/FilteringProxyModel.cpp +++ b/Userland/Libraries/LibGUI/FilteringProxyModel.cpp @@ -30,7 +30,7 @@ int FilteringProxyModel::column_count(ModelIndex const& index) const if ((size_t)index.row() > m_matching_indices.size() || index.row() < 0) return 0; - return m_model.column_count(m_matching_indices[index.row()]); + return m_model->column_count(m_matching_indices[index.row()]); } Variant FilteringProxyModel::data(ModelIndex const& index, ModelRole role) const @@ -55,12 +55,12 @@ void FilteringProxyModel::filter() m_matching_indices.clear(); Function add_matching = [&](ModelIndex& parent_index) { - for (auto i = 0; i < m_model.row_count(parent_index); ++i) { - auto index = m_model.index(i, 0, parent_index); + for (auto i = 0; i < m_model->row_count(parent_index); ++i) { + auto index = m_model->index(i, 0, parent_index); if (!index.is_valid()) continue; - auto filter_matches = m_model.data_matches(index, m_filter_term); + auto filter_matches = m_model->data_matches(index, m_filter_term); bool matches = filter_matches == TriState::True; if (filter_matches == TriState::Unknown) { auto data = index.data(); @@ -100,12 +100,12 @@ ModelIndex FilteringProxyModel::map(ModelIndex const& index) const bool FilteringProxyModel::is_searchable() const { - return m_model.is_searchable(); + return m_model->is_searchable(); } Vector FilteringProxyModel::matches(StringView searching, unsigned flags, ModelIndex const& index) { - auto found_indices = m_model.matches(searching, flags, index); + auto found_indices = m_model->matches(searching, flags, index); for (size_t i = 0; i < found_indices.size(); i++) found_indices[i] = map(found_indices[i]); return found_indices; diff --git a/Userland/Libraries/LibGUI/FilteringProxyModel.h b/Userland/Libraries/LibGUI/FilteringProxyModel.h index 45801550d8..8f34475834 100644 --- a/Userland/Libraries/LibGUI/FilteringProxyModel.h +++ b/Userland/Libraries/LibGUI/FilteringProxyModel.h @@ -17,14 +17,14 @@ namespace GUI { class FilteringProxyModel final : public Model , public ModelClient { public: - static ErrorOr> create(Model& model) + static ErrorOr> create(NonnullRefPtr model) { - return adopt_nonnull_ref_or_enomem(new (nothrow) FilteringProxyModel(model)); + return adopt_nonnull_ref_or_enomem(new (nothrow) FilteringProxyModel(move(model))); } virtual ~FilteringProxyModel() override { - m_model.unregister_client(*this); + m_model->unregister_client(*this); }; virtual int row_count(ModelIndex const& = ModelIndex()) const override; @@ -44,13 +44,13 @@ protected: private: void filter(); - explicit FilteringProxyModel(Model& model) - : m_model(model) + explicit FilteringProxyModel(NonnullRefPtr model) + : m_model(move(model)) { - m_model.register_client(*this); + m_model->register_client(*this); } - Model& m_model; + NonnullRefPtr m_model; // Maps row to actual model index. Vector m_matching_indices;