summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefano Facchini <stefano.facchini@gmail.com>2020-06-21 18:47:39 +0200
committerStefano Facchini <stefano.facchini@gmail.com>2020-06-30 16:01:23 +0200
commit40955fdce3e44b3604f2b819290e54c8bb0f8849 (patch)
treec9f044b6e50277911b60c7d74c972996f4e9a0b0 /src
parent40c5d953a7fc8af4f21a5cf74f119e2b183d1339 (diff)
downloadbaobab-40955fdce3e44b3604f2b819290e54c8bb0f8849.tar.gz
Use a GtkTreeView as FolderDisplay and wire up sorting
Diffstat (limited to 'src')
-rw-r--r--src/baobab-folder-display.vala65
-rw-r--r--src/baobab-window.vala33
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);