diff --git a/src/MainWindow.vala b/src/MainWindow.vala index e7697736..fd1c4297 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -6,8 +6,6 @@ public class Monitor.MainWindow : Hdy.ApplicationWindow { public ProcessView process_view { get; private set; } - private Gtk.SearchEntry search_entry; - public MainWindow (MonitorApp app) { Object (application: app); } @@ -46,7 +44,7 @@ public class Monitor.MainWindow : Hdy.ApplicationWindow { tooltip_text = (_("Settings")) }; - search_entry = new Gtk.SearchEntry () { + var search_entry = new Gtk.SearchEntry () { placeholder_text = _("Search process name or PID"), valign = CENTER }; @@ -132,20 +130,13 @@ public class Monitor.MainWindow : Hdy.ApplicationWindow { dbusserver.indicator_state (MonitorApp.settings.get_boolean ("indicator-state")); stack.visible_child_name = MonitorApp.settings.get_string ("opened-view"); - var filter_model = new Gtk.TreeModelFilter (process_view.treeview_model, null); - filter_model.set_visible_func (filter_func); - - var sort_model = new Gtk.TreeModelSort.with_model (filter_model); - - process_view.process_tree_view.set_model (sort_model); - search_entry.search_changed.connect (() => { // collapse tree only when search is focused and changed if (search_entry.is_focus) { process_view.process_tree_view.collapse_all (); } - filter_model.refilter (); + process_view.needle = search_entry.text; // focus on child row to avoid the app crashes by clicking "Kill/End Process" buttons in headerbar process_view.process_tree_view.focus_on_child_row (); @@ -178,47 +169,4 @@ public class Monitor.MainWindow : Hdy.ApplicationWindow { this.maximize (); } } - - private bool filter_func (Gtk.TreeModel model, Gtk.TreeIter iter) { - string name_haystack; - int pid_haystack; - string cmd_haystack; - bool found = false; - var needle = search_entry.text; - - // should help with assertion errors, donno - // if (needle == null) return true; - - if (needle.length == 0) { - return true; - } - - model.get (iter, Column.NAME, out name_haystack, -1); - model.get (iter, Column.PID, out pid_haystack, -1); - model.get (iter, Column.CMD, out cmd_haystack, -1); - - // sometimes name_haystack is null - if (name_haystack != null) { - bool name_found = name_haystack.casefold ().contains (needle.casefold ()) || false; - bool pid_found = pid_haystack.to_string ().casefold ().contains (needle.casefold ()) || false; - bool cmd_found = cmd_haystack.casefold ().contains (needle.casefold ()) || false; - found = name_found || pid_found || cmd_found; - } - - - Gtk.TreeIter child_iter; - bool child_found = false; - - if (model.iter_children (out child_iter, iter)) { - do { - child_found = filter_func (model, child_iter); - } while (model.iter_next (ref child_iter) && !child_found); - } - - if (child_found && needle.length > 0) { - process_view.process_tree_view.expand_all (); - } - - return found || child_found; - } } diff --git a/src/Views/ProcessView/ProcessView.vala b/src/Views/ProcessView/ProcessView.vala index e93fa1bd..5ddf4ad9 100644 --- a/src/Views/ProcessView/ProcessView.vala +++ b/src/Views/ProcessView/ProcessView.vala @@ -4,16 +4,24 @@ */ public class Monitor.ProcessView : Gtk.Box { - public TreeViewModel treeview_model { get; private set; } + public string needle = ""; + public CPUProcessTreeView process_tree_view { get; private set; } private ProcessInfoView process_info_view; + private TreeViewModel treeview_model; construct { treeview_model = new TreeViewModel (); + var filter_model = new Gtk.TreeModelFilter (treeview_model, null); + filter_model.set_visible_func (filter_func); + + var sort_model = new Gtk.TreeModelSort.with_model (filter_model); + process_tree_view = new CPUProcessTreeView (treeview_model); process_tree_view.process_selected.connect ((process) => on_process_selected (process)); + process_tree_view.set_model (sort_model); var process_tree_view_scrolled = new Gtk.ScrolledWindow (null, null) { child = process_tree_view @@ -32,6 +40,8 @@ public class Monitor.ProcessView : Gtk.Box { paned.pack2 (process_info_view, false, false); add (paned); + + notify["needle"].connect (filter_model.refilter); } public void on_process_selected (Process process) { @@ -51,4 +61,42 @@ public class Monitor.ProcessView : Gtk.Box { }); } + + private bool filter_func (Gtk.TreeModel model, Gtk.TreeIter iter) { + string name_haystack; + int pid_haystack; + string cmd_haystack; + bool found = false; + + if (needle.length == 0) { + return true; + } + + model.get (iter, Column.NAME, out name_haystack, -1); + model.get (iter, Column.PID, out pid_haystack, -1); + model.get (iter, Column.CMD, out cmd_haystack, -1); + + // sometimes name_haystack is null + if (name_haystack != null) { + bool name_found = name_haystack.casefold ().contains (needle.casefold ()) || false; + bool pid_found = pid_haystack.to_string ().casefold ().contains (needle.casefold ()) || false; + bool cmd_found = cmd_haystack.casefold ().contains (needle.casefold ()) || false; + found = name_found || pid_found || cmd_found; + } + + Gtk.TreeIter child_iter; + bool child_found = false; + + if (model.iter_children (out child_iter, iter)) { + do { + child_found = filter_func (model, child_iter); + } while (model.iter_next (ref child_iter) && !child_found); + } + + if (child_found && needle.length > 0) { + process_tree_view.expand_all (); + } + + return found || child_found; + } }