[gitg] Preserve expanded state when reloading diff



commit b5efd190704b38e7485998aa5bc5a896e18f5ebd
Author: Jesse van den Kieboom <jessevdk gnome org>
Date:   Thu Dec 31 12:32:42 2015 +0100

    Preserve expanded state when reloading diff

 libgitg/gitg-diff-view.vala |   55 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 41 insertions(+), 14 deletions(-)
---
diff --git a/libgitg/gitg-diff-view.vala b/libgitg/gitg-diff-view.vala
index c30c036..ba76607 100644
--- a/libgitg/gitg-diff-view.vala
+++ b/libgitg/gitg-diff-view.vala
@@ -78,7 +78,7 @@ public class Gitg.DiffView : Gtk.Grid
                                d_commit = null;
                        }
 
-                       update();
+                       update(false);
                }
        }
 
@@ -93,7 +93,7 @@ public class Gitg.DiffView : Gtk.Grid
                                d_diff = null;
                        }
 
-                       update();
+                       update(false);
                }
        }
 
@@ -101,7 +101,7 @@ public class Gitg.DiffView : Gtk.Grid
        {
                if (d_commit != null)
                {
-                       update();
+                       update(true);
                }
        }
 
@@ -191,7 +191,7 @@ public class Gitg.DiffView : Gtk.Grid
 
        private void parent_commit_changed()
        {
-               update();
+               update(false);
        }
 
        private void update_expanded_files()
@@ -204,7 +204,7 @@ public class Gitg.DiffView : Gtk.Grid
                }
        }
 
-       private void update()
+       private void update(bool preserve_expanded)
        {
                // If both `d_diff` and `d_commit` are null, clear
                // the diff content
@@ -258,7 +258,7 @@ public class Gitg.DiffView : Gtk.Grid
 
                if (d_diff != null)
                {
-                       update_diff(d_diff, d_cancellable);
+                       update_diff(d_diff, preserve_expanded, d_cancellable);
                }
        }
 
@@ -290,7 +290,19 @@ public class Gitg.DiffView : Gtk.Grid
                }
        }
 
-       private void update_diff(Ggit.Diff diff, Cancellable? cancellable)
+       private string? primary_path(Gitg.DiffViewFile f)
+       {
+               var path = f.delta.get_old_file().get_path();
+
+               if (path == null)
+               {
+                       path = f.delta.get_new_file().get_path();
+               }
+
+               return path;
+       }
+
+       private void update_diff(Ggit.Diff diff, bool preserve_expanded, Cancellable? cancellable)
        {
                var files = new Gee.ArrayList<Gitg.DiffViewFile>();
                Gitg.DiffViewFile? current_file = null;
@@ -298,12 +310,6 @@ public class Gitg.DiffView : Gtk.Grid
                Gee.ArrayList<Ggit.DiffLine>? current_lines = null;
 
                var maxlines = 0;
-               var file_widgets = d_grid_files.get_children();
-
-               foreach (var file in file_widgets)
-               {
-                       file.destroy();
-               }
 
                Anon add_hunk = () => {
                        if (current_hunk != null)
@@ -390,14 +396,35 @@ public class Gitg.DiffView : Gtk.Grid
                add_hunk();
                add_file();
 
+               var file_widgets = d_grid_files.get_children();
+               var was_expanded = new Gee.HashSet<string>();
+
+               foreach (var file in file_widgets)
+               {
+                       var f = file as Gitg.DiffViewFile;
+
+                       if (preserve_expanded && f.expanded)
+                       {
+                               var path = primary_path(f);
+
+                               if (path != null)
+                               {
+                                       was_expanded.add(path);
+                               }
+                       }
+
+                       f.destroy();
+               }
+
                d_commit_details.expanded = (files.size <= 1 || !default_collapse_all);
                d_commit_details.expander_visible = (files.size > 1);
 
                for (var i = 0; i < files.size; i++)
                {
                        var file = files[i];
+                       var path = primary_path(file);
 
-                       file.expanded = d_commit_details.expanded;
+                       file.expanded = d_commit_details.expanded || (path != null && 
was_expanded.contains(path));
                        file.maxlines = maxlines;
 
                        d_grid_files.add(file);


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