diff options
author | Stefano Facchini <stefano.facchini@gmail.com> | 2020-06-21 18:47:39 +0200 |
---|---|---|
committer | Stefano Facchini <stefano.facchini@gmail.com> | 2020-06-30 16:01:23 +0200 |
commit | 40955fdce3e44b3604f2b819290e54c8bb0f8849 (patch) | |
tree | c9f044b6e50277911b60c7d74c972996f4e9a0b0 /src | |
parent | 40c5d953a7fc8af4f21a5cf74f119e2b183d1339 (diff) | |
download | baobab-40955fdce3e44b3604f2b819290e54c8bb0f8849.tar.gz |
Use a GtkTreeView as FolderDisplay and wire up sorting
Diffstat (limited to 'src')
-rw-r--r-- | src/baobab-folder-display.vala | 65 | ||||
-rw-r--r-- | src/baobab-window.vala | 33 |
2 files changed, 71 insertions, 27 deletions
diff --git a/src/baobab-folder-display.vala b/src/baobab-folder-display.vala index bfa7c89..b8e5b55 100644 --- a/src/baobab-folder-display.vala +++ b/src/baobab-folder-display.vala @@ -20,24 +20,19 @@ namespace Baobab { [GtkTemplate (ui = "/org/gnome/baobab/ui/baobab-folder-display.ui")] - public class FolderDisplay : Gtk.Button { - static construct { - set_css_name ("folder-display"); - } - - [GtkChild] - private Gtk.Label folder_name_primary; + public class FolderDisplay : Gtk.TreeView { [GtkChild] - private Gtk.Label folder_name_secondary; + public Gtk.TreeViewColumn folder_column; [GtkChild] - private Gtk.Label folder_size; + public Gtk.TreeViewColumn size_column; [GtkChild] - private Gtk.Label folder_elements; + public Gtk.TreeViewColumn contents_column; [GtkChild] - private Gtk.Label folder_time; + public Gtk.TreeViewColumn time_modified_column; construct { - clicked.connect (() => { activated ();}); + row_activated.connect (() => { activated (); }); + model = create_model (); } public signal void activated (); @@ -47,10 +42,10 @@ namespace Baobab { set { location_ = value; - set_name_from_location (); - folder_size.label = ""; - folder_elements.label = ""; - folder_time.label = ""; + var list_store = (Gtk.ListStore) model; + list_store.clear (); + list_store.insert_with_values (null, -1, + Scanner.Columns.NAME, location.name); } get { @@ -71,32 +66,48 @@ namespace Baobab { uint64 size; int elements; uint64 time; + Scanner.State state; location.scanner.get (iter, Scanner.Columns.NAME, out name, Scanner.Columns.DISPLAY_NAME, out display_name, Scanner.Columns.SIZE, out size, Scanner.Columns.ELEMENTS, out elements, - Scanner.Columns.TIME_MODIFIED, out time); + Scanner.Columns.TIME_MODIFIED, out time, + Scanner.Columns.STATE, out state); if (value.get_depth () == 1) { - set_name_from_location (); - } else { - folder_name_primary.label = format_name (display_name, name); - folder_name_secondary.label = ""; + name = location.name; } - folder_size.label = format_size (size); - folder_elements.label = format_items (elements); - folder_time.label = format_time_approximate (time); + + var list_store = (Gtk.ListStore) model; + list_store.clear (); + list_store.insert_with_values (null, -1, + Scanner.Columns.NAME, name, + Scanner.Columns.DISPLAY_NAME, display_name, + Scanner.Columns.SIZE, size, + Scanner.Columns.ELEMENTS, elements, + Scanner.Columns.TIME_MODIFIED, time, + Scanner.Columns.STATE, state); } get { return path_; } } - void set_name_from_location () { - folder_name_primary.label = location.name; - folder_name_secondary.label = location.file.get_parse_name (); + Gtk.ListStore create_model () { + var list_store = new Gtk.ListStore.newv (new Type[] { + typeof (string), // NAME + typeof (double), // PERCENT + typeof (uint64), // SIZE + typeof (uint64), // TIME_MODIFIED + typeof (string), // DISPLAY_NAME + typeof (int), // ELEMENTS + typeof (Scanner.State) // STATE + }); + list_store.set_sort_column_id (Scanner.Columns.SIZE, Gtk.SortType.DESCENDING); + + return list_store; } } } diff --git a/src/baobab-window.vala b/src/baobab-window.vala index d46e8fe..c855ddf 100644 --- a/src/baobab-window.vala +++ b/src/baobab-window.vala @@ -69,6 +69,12 @@ namespace Baobab { [GtkChild] private Gtk.MenuItem treeview_popup_trash; [GtkChild] + private Gtk.TreeViewColumn size_column; + [GtkChild] + private Gtk.TreeViewColumn contents_column; + [GtkChild] + private Gtk.TreeViewColumn time_modified_column; + [GtkChild] private Gtk.Stack chart_stack; [GtkChild] private Gtk.Stack spinner_stack; @@ -461,8 +467,33 @@ namespace Baobab { var path = convert_path_to_child_path (wrapper_path); reroot_treeview (path, true); }); + + var folder_display_model = (Gtk.TreeSortable) folder_display.model; + folder_display_model.sort_column_changed.connect (reset_treeview_sorting); + + folder_display.size_column.notify["width"].connect (copy_treeview_column_sizes); + folder_display.contents_column.notify["width"].connect (copy_treeview_column_sizes); + folder_display.time_modified_column.notify["width"].connect (copy_treeview_column_sizes); + } + + void copy_treeview_column_sizes () { + size_column.min_width = folder_display.size_column.width; + contents_column.min_width = folder_display.contents_column.width; + time_modified_column.min_width = folder_display.time_modified_column.width; + } + + void reset_treeview_sorting () { + int id; + Gtk.SortType sort_type; + + var folder_display_model = (Gtk.TreeSortable) folder_display.model; + var treeview_model = (Gtk.TreeSortable) treeview.model; + + folder_display_model.get_sort_column_id (out id, out sort_type); + treeview_model.set_sort_column_id (id, sort_type); } + void reroot_treeview (Gtk.TreePath path, bool select_first = false) { Gtk.TreeIter iter; active_location.scanner.get_iter (out iter, path); @@ -477,6 +508,7 @@ namespace Baobab { var filter = new Gtk.TreeModelFilter (active_location.scanner, path); treeview.model = new Gtk.TreeModelSort.with_model (filter); + reset_treeview_sorting (); if (select_first) { treeview.set_cursor (new Gtk.TreePath.first (), null, false); @@ -605,6 +637,7 @@ namespace Baobab { // Make sure to update the folder display after the scan folder_display.path = new Gtk.TreePath.first (); + copy_treeview_column_sizes (); if (!scanner.show_allocated_size) { message (_("Could not always detect occupied disk sizes."), _("Apparent sizes may be shown instead."), Gtk.MessageType.INFO); |