Browse Source

LibGUI: Add a GModelNotification class that views will receive.

I don't want to use GEvent here since these need to be synchronous
and mixing sync and async GEvents would be stupid.
Andreas Kling 6 years ago
parent
commit
bff5b71467

+ 9 - 0
Applications/ProcessManager/ProcessTableView.cpp

@@ -19,6 +19,15 @@ void ProcessTableView::timer_event(GTimerEvent&)
     model().update();
 }
 
+void ProcessTableView::model_notification(const GModelNotification& notification)
+{
+    if (notification.type() == GModelNotification::ModelUpdated) {
+        if (on_status_message)
+            on_status_message(String::format("%d processes", model().row_count()));
+        return;
+    }
+}
+
 pid_t ProcessTableView::selected_pid() const
 {
     return model().selected_pid();

+ 3 - 0
Applications/ProcessManager/ProcessTableView.h

@@ -15,6 +15,9 @@ public:
 
     Function<void(String)> on_status_message;
 
+protected:
+    virtual void model_notification(const GModelNotification&) override;
+
 private:
     virtual void timer_event(GTimerEvent&) override;
 

+ 0 - 1
LibGUI/GEvent.h

@@ -165,4 +165,3 @@ public:
 private:
     int m_timer_id;
 };
-

+ 21 - 0
LibGUI/GTableModel.h

@@ -10,6 +10,27 @@
 
 class GTableView;
 
+class GModelNotification {
+public:
+    enum Type {
+        Invalid = 0,
+        ModelUpdated,
+    };
+
+    explicit GModelNotification(Type type, const GModelIndex& index = GModelIndex())
+        : m_type(type)
+        , m_index(index)
+    {
+    }
+
+    Type type() const { return m_type; }
+    GModelIndex index() const { return m_index; }
+
+private:
+    Type m_type { Invalid };
+    GModelIndex m_index;
+};
+
 class GTableModel {
 public:
     struct ColumnMetadata {

+ 5 - 0
LibGUI/GTableView.cpp

@@ -65,10 +65,15 @@ int GTableView::content_width() const
     return width;
 }
 
+void GTableView::model_notification(const GModelNotification&)
+{
+}
+
 void GTableView::did_update_model()
 {
     update_scrollbar_ranges();
     update();
+    model_notification(GModelNotification(GModelNotification::ModelUpdated));
 }
 
 Rect GTableView::row_rect(int item_index) const

+ 3 - 1
LibGUI/GTableView.h

@@ -1,11 +1,11 @@
 #pragma once
 
+#include <LibGUI/GTableModel.h>
 #include <LibGUI/GWidget.h>
 #include <AK/Function.h>
 #include <AK/HashMap.h>
 
 class GScrollBar;
-class GTableModel;
 
 class GTableView : public GWidget {
 public:
@@ -25,6 +25,8 @@ public:
     int horizontal_padding() const { return m_horizontal_padding; }
 
 private:
+    virtual void model_notification(const GModelNotification&);
+
     virtual void paint_event(GPaintEvent&) override;
     virtual void resize_event(GResizeEvent&) override;
     virtual void mousedown_event(GMouseEvent&) override;