From eed5ae080f6c0d6f6bbf626e907963d3cf0f0857 Mon Sep 17 00:00:00 2001 From: stsdc <6031763+stsdc@users.noreply.github.com> Date: Sat, 21 Feb 2026 00:38:22 +0100 Subject: [PATCH 1/5] ProcesInfoView: Migrate opened files to ListStore --- src/Models/OpenFilesTreeViewModel.vala | 47 ++----------- .../ProcessInfoView/OpenFilesTreeView.vala | 66 +++++++++---------- .../ProcessInfoView/ProcessInfoIOStats.vala | 9 ++- .../ProcessInfoView/ProcessInfoView.vala | 9 +-- 4 files changed, 43 insertions(+), 88 deletions(-) diff --git a/src/Models/OpenFilesTreeViewModel.vala b/src/Models/OpenFilesTreeViewModel.vala index 48cdea28c..96e6a78b0 100644 --- a/src/Models/OpenFilesTreeViewModel.vala +++ b/src/Models/OpenFilesTreeViewModel.vala @@ -3,50 +3,11 @@ * SPDX-FileCopyrightText: 2025 elementary, Inc. (https://elementary.io) */ -public class Monitor.OpenFilesTreeViewModel : Gtk.TreeStore { - private Gee.Map open_files_paths = new Gee.HashMap (); +public class Monitor.OpenFile : GLib.Object { + public string path { get; set; } - private Process _process; - - public Process ? process { - get { - return _process; - } - set { - _process = value; - - // repopulating - open_files_paths.clear (); - clear (); - add_paths (); - } - } - - construct { - set_column_types (new Type[] { - typeof (string), - typeof (string), - }); - - } - - public void add_paths () { - foreach (var path in process.open_files_paths) { - add_path (path); - } - } - - private bool add_path (string path) { - if (path.substring (0, 1) == "/") { - Gtk.TreeIter iter; - append (out iter, null); - - set (iter, Column.NAME, path, -1); - - // open_files_paths.set (path, iter); - return true; - } - return false; + public OpenFile (string path) { + Object (path: path); } } diff --git a/src/Views/ProcessView/ProcessInfoView/OpenFilesTreeView.vala b/src/Views/ProcessView/ProcessInfoView/OpenFilesTreeView.vala index 70992c9e0..19be7b295 100644 --- a/src/Views/ProcessView/ProcessInfoView/OpenFilesTreeView.vala +++ b/src/Views/ProcessView/ProcessInfoView/OpenFilesTreeView.vala @@ -3,53 +3,51 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -public class Monitor.OpenFilesTreeView : Gtk.TreeView { - public new OpenFilesTreeViewModel model; - private Gtk.TreeViewColumn path_column; +public class Monitor.OpenFilesTreeView : Granite.Bin { + private GLib.ListStore model; public signal void process_selected (Process process); public OpenFilesTreeView () { - this.model = new OpenFilesTreeViewModel (); + model = new GLib.ListStore (typeof (Monitor.OpenFile)); + var selection_model = new Gtk.NoSelection (model); - show_expanders = false; + var path_column_factory = new Gtk.SignalListItemFactory (); + path_column_factory.setup.connect (on_path_column_setup); + path_column_factory.bind.connect (on_path_column_bind); - // setup name column - path_column = new Gtk.TreeViewColumn (); - path_column.title = _("Opened files"); - path_column.expand = true; - path_column.min_width = 250; - path_column.set_sort_column_id (Column.NAME); + var path_column = new Gtk.ColumnViewColumn (_("Opened files"), path_column_factory) { + expand = true, + }; - var icon_cell = new Gtk.CellRendererPixbuf (); - path_column.pack_start (icon_cell, false); - // path_column.add_attribute (icon_cell, "icon_name", Column.ICON); - path_column.set_cell_data_func (icon_cell, icon_cell_layout); + var column_view = new Gtk.ColumnView (selection_model); + column_view.append_column (path_column); - var name_cell = new Gtk.CellRendererText (); - name_cell.ellipsize = Pango.EllipsizeMode.END; - name_cell.set_fixed_height_from_font (1); - path_column.pack_start (name_cell, false); - path_column.add_attribute (name_cell, "text", Column.NAME); - insert_column (path_column, -1); - - // resize all of the columns - columns_autosize (); + vexpand = true; - set_model (model); + child = new Gtk.ScrolledWindow () { + child = column_view, + max_content_height = 250, + }; + } - hadjustment = null; - vadjustment = null; - vexpand = true; + private void on_path_column_setup (Gtk.SignalListItemFactory factory, GLib.Object list_item_obj) { + var label = new Gtk.Label (""); + label.halign = Gtk.Align.START; + ((Gtk.ListItem) list_item_obj).child = label; + } + private void on_path_column_bind (Gtk.SignalListItemFactory factory, GLib.Object list_item_obj) { + var list_item = (Gtk.ListItem) list_item_obj; + var item_data = (OpenFile) list_item.item; + var label = (Gtk.Label) list_item.child; + label.label = item_data.path; } - public void icon_cell_layout (Gtk.CellLayout cell_layout, Gtk.CellRenderer icon_cell, Gtk.TreeModel model, Gtk.TreeIter iter) { - try { - var icon = Icon.new_for_string ("emblem-documents-symbolic"); - ((Gtk.CellRendererPixbuf)icon_cell).icon_name = icon.to_string (); - } catch (Error e) { - warning (e.message); + public void update (Process process) { + model.remove_all (); + foreach (var path in process.open_files_paths) { + model.append (new OpenFile (path)); } } diff --git a/src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala b/src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala index ef592ba5f..3fb005414 100644 --- a/src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala +++ b/src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala @@ -22,10 +22,6 @@ public class Monitor.ProcessInfoIOStats : Gtk.Grid { open_files_tree_view = new OpenFilesTreeView (); - var open_files_tree_view_scrolled = new Gtk.ScrolledWindow () { - child = open_files_tree_view - }; - column_spacing = 6; row_spacing = 6; column_homogeneous = true; @@ -35,13 +31,16 @@ public class Monitor.ProcessInfoIOStats : Gtk.Grid { attach (create_label_with_icon (write_bytes_label, "go-down-symbolic"), 0, 3); attach (cancelled_write_label, 1, 1); attach (cancelled_write_bytes_label, 1, 2); - attach (open_files_tree_view_scrolled, 0, 4, 2); + attach (open_files_tree_view, 0, 4, 2); } public void update (Process process) { write_bytes_label.label = format_size ((uint64) process.io.write_bytes, IEC_UNITS); read_bytes_label.label = format_size ((uint64) process.io.read_bytes, IEC_UNITS); cancelled_write_bytes_label.label = format_size ((uint64) process.io.cancelled_write_bytes, IEC_UNITS); + + open_files_tree_view.update (process); + open_files_tree_view.visible = true; } private Gtk.Label create_label (string text) { diff --git a/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala b/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala index d32fcaa3a..bb42a31a5 100644 --- a/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala +++ b/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala @@ -5,7 +5,7 @@ public class Monitor.ProcessInfoView : Gtk.Box { private Process _process; - public Process? process { + public Process ? process { get { return _process; } @@ -37,7 +37,7 @@ public class Monitor.ProcessInfoView : Gtk.Box { permission_error_infobar.revealed = false; - process_info_io_stats.open_files_tree_view.model.process = _process; + process_info_io_stats.update (_process); process_info_io_stats.open_files_tree_view.visible = true; } } @@ -125,10 +125,7 @@ public class Monitor.ProcessInfoView : Gtk.Box { process_info_header.update (process); process_info_cpu_ram.update (process); process_info_io_stats.update (process); - - process_info_io_stats.open_files_tree_view.model.process = _process; - - process_info_io_stats.open_files_tree_view.visible = true; } } + } From 8044dedfe67e2d2046ecb614b87064cde3d9de89 Mon Sep 17 00:00:00 2001 From: stsdc <6031763+stsdc@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:25:17 +0100 Subject: [PATCH 2/5] ProcessInfoView: Prevent OPen Files list jump to top on update --- src/Models/OpenFilesTreeViewModel.vala | 2 +- .../ProcessView/ProcessInfoView/OpenFilesTreeView.vala | 3 ++- .../ProcessView/ProcessInfoView/ProcessInfoIOStats.vala | 3 --- src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala | 6 +++++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Models/OpenFilesTreeViewModel.vala b/src/Models/OpenFilesTreeViewModel.vala index 96e6a78b0..f84b48852 100644 --- a/src/Models/OpenFilesTreeViewModel.vala +++ b/src/Models/OpenFilesTreeViewModel.vala @@ -10,4 +10,4 @@ public class Monitor.OpenFile : GLib.Object { Object (path: path); } -} +} \ No newline at end of file diff --git a/src/Views/ProcessView/ProcessInfoView/OpenFilesTreeView.vala b/src/Views/ProcessView/ProcessInfoView/OpenFilesTreeView.vala index 19be7b295..821547aaa 100644 --- a/src/Views/ProcessView/ProcessInfoView/OpenFilesTreeView.vala +++ b/src/Views/ProcessView/ProcessInfoView/OpenFilesTreeView.vala @@ -27,7 +27,7 @@ public class Monitor.OpenFilesTreeView : Granite.Bin { child = new Gtk.ScrolledWindow () { child = column_view, - max_content_height = 250, + max_content_height = 250, }; } @@ -45,6 +45,7 @@ public class Monitor.OpenFilesTreeView : Granite.Bin { } public void update (Process process) { + visible = true; model.remove_all (); foreach (var path in process.open_files_paths) { model.append (new OpenFile (path)); diff --git a/src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala b/src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala index 3fb005414..e287c27ea 100644 --- a/src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala +++ b/src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala @@ -38,9 +38,6 @@ public class Monitor.ProcessInfoIOStats : Gtk.Grid { write_bytes_label.label = format_size ((uint64) process.io.write_bytes, IEC_UNITS); read_bytes_label.label = format_size ((uint64) process.io.read_bytes, IEC_UNITS); cancelled_write_bytes_label.label = format_size ((uint64) process.io.cancelled_write_bytes, IEC_UNITS); - - open_files_tree_view.update (process); - open_files_tree_view.visible = true; } private Gtk.Label create_label (string text) { diff --git a/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala b/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala index bb42a31a5..5f39d0c97 100644 --- a/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala +++ b/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala @@ -38,7 +38,11 @@ public class Monitor.ProcessInfoView : Gtk.Box { permission_error_infobar.revealed = false; process_info_io_stats.update (_process); - process_info_io_stats.open_files_tree_view.visible = true; + + // Updating open files list on process change (row select) only + // to prevent list jump to the top after a scroll + process_info_io_stats.open_files_tree_view.update (process); + } } } From bef84f237395e4ab70e924a8ceb19ed1a409aa9a Mon Sep 17 00:00:00 2001 From: stsdc <6031763+stsdc@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:26:41 +0100 Subject: [PATCH 3/5] Fix lint --- src/Models/OpenFilesTreeViewModel.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Models/OpenFilesTreeViewModel.vala b/src/Models/OpenFilesTreeViewModel.vala index f84b48852..96e6a78b0 100644 --- a/src/Models/OpenFilesTreeViewModel.vala +++ b/src/Models/OpenFilesTreeViewModel.vala @@ -10,4 +10,4 @@ public class Monitor.OpenFile : GLib.Object { Object (path: path); } -} \ No newline at end of file +} From a782c266604f24a00df600db83c66537633950c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <6031763+stsdc@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:24:14 +0100 Subject: [PATCH 4/5] Remove some whitespaces --- src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala b/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala index 5f39d0c97..d793e2666 100644 --- a/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala +++ b/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala @@ -5,7 +5,7 @@ public class Monitor.ProcessInfoView : Gtk.Box { private Process _process; - public Process ? process { + public Process? process { get { return _process; } @@ -131,5 +131,4 @@ public class Monitor.ProcessInfoView : Gtk.Box { process_info_io_stats.update (process); } } - } From 237d80f1436ab2c050f8b99f8086ef16e6ebe775 Mon Sep 17 00:00:00 2001 From: stsdc <6031763+stsdc@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:28:52 +0100 Subject: [PATCH 5/5] Rename OpenFilesTreeViewModel.vala to OpenFile.vala for clarity --- src/Models/{OpenFilesTreeViewModel.vala => OpenFile.vala} | 0 src/meson.build | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/Models/{OpenFilesTreeViewModel.vala => OpenFile.vala} (100%) diff --git a/src/Models/OpenFilesTreeViewModel.vala b/src/Models/OpenFile.vala similarity index 100% rename from src/Models/OpenFilesTreeViewModel.vala rename to src/Models/OpenFile.vala diff --git a/src/meson.build b/src/meson.build index b6464f8d7..ffd4d65ef 100644 --- a/src/meson.build +++ b/src/meson.build @@ -33,7 +33,7 @@ source_app_files = [ # Models 'Models/TreeViewModel.vala', - 'Models/OpenFilesTreeViewModel.vala', + 'Models/OpenFile.vala', # Other # 'Managers/AppManager.vala',