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.
This commit is contained in:
parent
6b32b775bf
commit
8fb52c6962
Notes:
sideshowbarker
2024-07-19 17:12:02 +09:00
Author: https://github.com/blishko Commit: https://github.com/SerenityOS/serenity/commit/8fb52c69620 Pull-request: https://github.com/SerenityOS/serenity/pull/11156
2 changed files with 13 additions and 13 deletions
|
@ -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<void(ModelIndex&)> 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<ModelIndex> 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;
|
||||
|
|
|
@ -17,14 +17,14 @@ namespace GUI {
|
|||
class FilteringProxyModel final : public Model
|
||||
, public ModelClient {
|
||||
public:
|
||||
static ErrorOr<NonnullRefPtr<FilteringProxyModel>> create(Model& model)
|
||||
static ErrorOr<NonnullRefPtr<FilteringProxyModel>> create(NonnullRefPtr<Model> 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> model)
|
||||
: m_model(move(model))
|
||||
{
|
||||
m_model.register_client(*this);
|
||||
m_model->register_client(*this);
|
||||
}
|
||||
|
||||
Model& m_model;
|
||||
NonnullRefPtr<Model> m_model;
|
||||
|
||||
// Maps row to actual model index.
|
||||
Vector<ModelIndex> m_matching_indices;
|
||||
|
|
Loading…
Add table
Reference in a new issue