浏览代码

LibGUI: Reverse FilteringProxyModel update propagation flow

FilteringProxyModel is a narrowing projection of its parent model with
a filter applied. That means that updates of FilteringProxyModel should
not propagate to its parent model, but the opposite - updates happening
in the parent model should "trickle down" and trigger an update of the
filtering model.
Vyacheslav Pukhanov 3 年之前
父节点
当前提交
2189cc6bf1
共有 2 个文件被更改,包括 10 次插入3 次删除
  1. 0 1
      Userland/Libraries/LibGUI/FilteringProxyModel.cpp
  2. 10 2
      Userland/Libraries/LibGUI/FilteringProxyModel.h

+ 0 - 1
Userland/Libraries/LibGUI/FilteringProxyModel.cpp

@@ -46,7 +46,6 @@ Variant FilteringProxyModel::data(ModelIndex const& index, ModelRole role) const
 
 
 void FilteringProxyModel::invalidate()
 void FilteringProxyModel::invalidate()
 {
 {
-    m_model.invalidate();
     filter();
     filter();
     did_update();
     did_update();
 }
 }

+ 10 - 2
Userland/Libraries/LibGUI/FilteringProxyModel.h

@@ -14,14 +14,18 @@
 
 
 namespace GUI {
 namespace GUI {
 
 
-class FilteringProxyModel final : public Model {
+class FilteringProxyModel final : public Model
+    , public ModelClient {
 public:
 public:
     static NonnullRefPtr<FilteringProxyModel> construct(Model& model)
     static NonnullRefPtr<FilteringProxyModel> construct(Model& model)
     {
     {
         return adopt_ref(*new FilteringProxyModel(model));
         return adopt_ref(*new FilteringProxyModel(model));
     }
     }
 
 
-    virtual ~FilteringProxyModel() override {};
+    virtual ~FilteringProxyModel() override
+    {
+        m_model.unregister_client(*this);
+    };
 
 
     virtual int row_count(ModelIndex const& = ModelIndex()) const override;
     virtual int row_count(ModelIndex const& = ModelIndex()) const override;
     virtual int column_count(ModelIndex const& = ModelIndex()) const override;
     virtual int column_count(ModelIndex const& = ModelIndex()) const override;
@@ -35,11 +39,15 @@ public:
 
 
     ModelIndex map(ModelIndex const&) const;
     ModelIndex map(ModelIndex const&) const;
 
 
+protected:
+    virtual void model_did_update([[maybe_unused]] unsigned flags) override { invalidate(); }
+
 private:
 private:
     void filter();
     void filter();
     explicit FilteringProxyModel(Model& model)
     explicit FilteringProxyModel(Model& model)
         : m_model(model)
         : m_model(model)
     {
     {
+        m_model.register_client(*this);
     }
     }
 
 
     Model& m_model;
     Model& m_model;