Browse Source

SystemMonitor: Make the process list searchable

Dawid Wolosowicz 3 years ago
parent
commit
000c74e6a8

+ 18 - 0
Userland/Applications/SystemMonitor/ProcessModel.cpp

@@ -313,6 +313,24 @@ GUI::Variant ProcessModel::data(const GUI::ModelIndex& index, GUI::ModelRole rol
     return {};
     return {};
 }
 }
 
 
+Vector<GUI::ModelIndex, 1> ProcessModel::matches(const StringView& searching, unsigned flags, const GUI::ModelIndex&)
+{
+    Vector<GUI::ModelIndex, 1> found_indices;
+
+    for (auto& thread : m_threads) {
+        if (string_matches(thread.value->current_state.name, searching, flags)) {
+            auto maybe_tid_index = m_tids.find_first_index(thread.key);
+            if (!maybe_tid_index.has_value())
+                continue;
+            found_indices.append(create_index(maybe_tid_index.value(), Column::Name));
+            if (flags & FirstMatchOnly)
+                break;
+        }
+    }
+
+    return found_indices;
+}
+
 void ProcessModel::update()
 void ProcessModel::update()
 {
 {
     auto previous_tid_count = m_tids.size();
     auto previous_tid_count = m_tids.size();

+ 2 - 0
Userland/Applications/SystemMonitor/ProcessModel.h

@@ -60,6 +60,8 @@ public:
     virtual int column_count(const GUI::ModelIndex&) const override;
     virtual int column_count(const GUI::ModelIndex&) const override;
     virtual String column_name(int column) const override;
     virtual String column_name(int column) const override;
     virtual GUI::Variant data(const GUI::ModelIndex&, GUI::ModelRole) const override;
     virtual GUI::Variant data(const GUI::ModelIndex&, GUI::ModelRole) const override;
+    virtual bool is_searchable() const override { return true; }
+    virtual Vector<GUI::ModelIndex, 1> matches(const StringView&, unsigned = MatchesFlag::AllMatching, const GUI::ModelIndex& = GUI::ModelIndex()) override;
     virtual bool is_column_sortable(int column_index) const override { return column_index != Column::Icon; }
     virtual bool is_column_sortable(int column_index) const override { return column_index != Column::Icon; }
     void update();
     void update();