[baobab/wip/daisydiskish] Rework treeview behavior



commit 8bee1ab2b6ae7a944d38c2633aaec241f4c19a2e
Author: Stefano Facchini <stefano facchini gmail com>
Date:   Sun Jul 21 19:04:24 2013 +0200

    Rework treeview behavior

 src/baobab-chart.vala     |    9 ++++++
 src/baobab-main-window.ui |    3 ++
 src/baobab-window.vala    |   66 ++++++++++++++++++++++++++++-----------------
 3 files changed, 53 insertions(+), 25 deletions(-)
---
diff --git a/src/baobab-chart.vala b/src/baobab-chart.vala
index ec26102..2348c42 100644
--- a/src/baobab-chart.vala
+++ b/src/baobab-chart.vala
@@ -260,6 +260,15 @@ namespace Baobab {
             }
         }
 
+        public void set_highlighted (Gtk.TreeIter iter) {
+            foreach (var item in items) {
+                if (item.iter == iter) {
+                    highlighted_item = item;
+                    break;
+                }
+            }
+        }
+
         public override bool motion_notify_event (Gdk.EventMotion event) {
             bool found = false;
 
diff --git a/src/baobab-main-window.ui b/src/baobab-main-window.ui
index 804c8a4..0f3ec39 100644
--- a/src/baobab-main-window.ui
+++ b/src/baobab-main-window.ui
@@ -248,6 +248,9 @@
                       <object class="GtkTreeView" id="treeview">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
+                        <property name="hover-selection">True</property>
+                        <property name="activate-on-single-click">True</property>
+                        <property name="show-expanders">False</property>
                         <child internal-child="selection">
                           <object class="GtkTreeSelection" id="treeview_selection1"/>
                         </child>
diff --git a/src/baobab-window.vala b/src/baobab-window.vala
index 82fe105..7e5c667 100644
--- a/src/baobab-window.vala
+++ b/src/baobab-window.vala
@@ -339,14 +339,24 @@ namespace Baobab {
                                    null);
         }
 
-        void on_chart_item_activated (Chart chart, Gtk.TreeIter iter) {
-            var path = active_location.scanner.get_path (iter);
+        void set_root (Gtk.TreePath path) {
+            var filter = new Gtk.TreeModelFilter (active_location.scanner, path);
+            treeview.model = filter;
 
-            if (!treeview.is_row_expanded (path)) {
-                treeview.expand_to_path (path);
-            }
+            Gtk.TreeIter iter;
+            active_location.scanner.get_iter (out iter, path);
+            string title = "";
+            do {
+                string name;
+                active_location.scanner.get (iter, Scanner.Columns.DISPLAY_NAME, out name);
+                title = name + (title == "" ? null : "   >   ") + title;
+            } while (active_location.scanner.iter_parent (out iter, iter));
+            header_bar.title = title;
+        }
 
-            treeview.set_cursor (path, null, false);
+        void on_chart_item_activated (Chart chart, Gtk.TreeIter iter) {
+            var path = active_location.scanner.get_path (iter);
+            set_root (path);
         }
 
         void on_drag_data_received (Gtk.Widget widget, Gdk.DragContext context, int x, int y,
@@ -443,24 +453,30 @@ namespace Baobab {
 
             treeview_popup_open.activate.connect (() => {
                 var selection = treeview.get_selection ();
-                Gtk.TreeIter iter;
+                Gtk.TreeIter iter, real_iter;
                 if (selection.get_selected (null, out iter)) {
+                    var filter = treeview.model as Gtk.TreeModelFilter;
+                    filter.convert_iter_to_child_iter (out real_iter, iter);
                     open_item (iter);
                 }
             });
 
             treeview_popup_copy.activate.connect (() => {
                 var selection = treeview.get_selection ();
-                Gtk.TreeIter iter;
+                Gtk.TreeIter iter, real_iter;
                 if (selection.get_selected (null, out iter)) {
+                    var filter = treeview.model as Gtk.TreeModelFilter;
+                    filter.convert_iter_to_child_iter (out real_iter, iter);
                     copy_path (iter);
                 }
             });
 
             treeview_popup_trash.activate.connect (() => {
                 var selection = treeview.get_selection ();
-                Gtk.TreeIter iter;
+                Gtk.TreeIter iter, real_iter;
                 if (selection.get_selected (null, out iter)) {
+                    var filter = treeview.model as Gtk.TreeModelFilter;
+                    filter.convert_iter_to_child_iter (out real_iter, iter);
                     trash_file (iter);
                 }
             });
@@ -469,11 +485,21 @@ namespace Baobab {
             selection.changed.connect (() => {
                 Gtk.TreeIter iter;
                 if (selection.get_selected (null, out iter)) {
-                    var path = active_location.scanner.get_path (iter);
-                    rings_chart.root = path;
-                    treemap_chart.root = path;
+                    Gtk.TreeIter real_iter;
+                    var filter = treeview.model as Gtk.TreeModelFilter;
+                    filter.convert_iter_to_child_iter (out real_iter, iter);
+                    rings_chart.set_highlighted (real_iter);
+                    treemap_chart.set_highlighted (real_iter);
                 }
             });
+
+            treeview.row_activated.connect ((path, column) => {
+                    var filter = treeview.model as Gtk.TreeModelFilter;
+                    var real_path = filter.convert_path_to_child_path (path);
+                    set_root (real_path);
+                    rings_chart.root = real_path;
+                    treemap_chart.root = real_path;
+                });
         }
 
         void message (string primary_msg, string secondary_msg, Gtk.MessageType type) {
@@ -539,16 +565,6 @@ namespace Baobab {
             treeview.expand_row (path, false);
         }
 
-        void expand_first_row () {
-            Gtk.TreeIter first;
-
-            if (treeview.model.get_iter_first (out first) && treeview.model.iter_has_child (first)) {
-                treeview.expand_row (treeview.model.get_path (first), false);
-            } else {
-                treeview.model.row_has_child_toggled.connect (first_row_has_child);
-            }
-        }
-
         void set_chart_model (Gtk.TreeModel model, bool show_allocated_size) {
             model.bind_property ("max-depth", rings_chart, "max-depth", BindingFlags.SYNC_CREATE);
             model.bind_property ("max-depth", treemap_chart, "max-depth", BindingFlags.SYNC_CREATE);
@@ -593,6 +609,9 @@ namespace Baobab {
                 bool show_allocated_size = alloc_size > 0;
                 size_column_size_renderer.show_allocated_size = show_allocated_size;
                 size_column.sort_column_id = show_allocated_size ? Scanner.Columns.ALLOC_SIZE : 
Scanner.Columns.SIZE;
+
+                treeview.model = new Gtk.TreeModelFilter (scanner, new Gtk.TreePath.first ());
+
                 set_chart_model (active_location.scanner, show_allocated_size);
 
                 set_ui_state (result_page, false);
@@ -602,9 +621,6 @@ namespace Baobab {
             set_ui_state (result_page, true);
 
             scanner.scan (force);
-
-            treeview.model = scanner;
-            expand_first_row ();
         }
 
         public void scan_directory (File directory) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]