[gitg] Add expanders to ref list



commit 55be1f32febb0daf2268a66f66c96b2f5db8f607
Author: Jesse van den Kieboom <jessevdk gnome org>
Date:   Sat Aug 8 19:34:42 2015 +0200

    Add expanders to ref list
    
    https://bugzilla.gnome.org/show_bug.cgi?id=702600

 gitg/history/gitg-history-refs-list.vala     |  106 ++++++++++++++++++++++++-
 gitg/resources/ui/gitg-history-ref-header.ui |   18 +++--
 2 files changed, 113 insertions(+), 11 deletions(-)
---
diff --git a/gitg/history/gitg-history-refs-list.vala b/gitg/history/gitg-history-refs-list.vala
index 3a8d1f0..b0b8053 100644
--- a/gitg/history/gitg-history-refs-list.vala
+++ b/gitg/history/gitg-history-refs-list.vala
@@ -347,15 +347,20 @@ private class RefHeader : RefTyped, Gtk.ListBoxRow
 
        private Gitg.Remote? d_remote;
 
-       [GtkChild]
+       [GtkChild( name = "progress_bin" )]
        private Gitg.ProgressBin d_progress_bin;
 
-       [GtkChild]
+       [GtkChild( name = "expander" )]
+       private Gtk.Expander d_expander;
+
+       [GtkChild( name = "label" )]
        private Gtk.Label d_label;
 
-       [GtkChild]
+       [GtkChild( name = "icon" )]
        private Gtk.Image d_icon;
 
+       public bool expanded { get; set; default = true; }
+
        public Gitg.RefType ref_type
        {
                get { return d_rtype; }
@@ -369,20 +374,29 @@ private class RefHeader : RefTyped, Gtk.ListBoxRow
        public RefHeader(Gitg.RefType rtype, string name)
        {
                var escaped = Markup.escape_text(name);
-
                d_label.set_markup(@"<b>$escaped</b>");
 
+               bind_property("expanded", d_expander, "expanded", BindingFlags.BIDIRECTIONAL | 
BindingFlags.SYNC_CREATE);
+
+               d_expander.button_press_event.connect(on_expander_pressed);
+
                d_name = name;
                d_rtype = rtype;
        }
 
+       private bool on_expander_pressed(Gdk.EventButton event)
+       {
+               d_expander.expanded = !d_expander.expanded;
+               return true;
+       }
+
        public RefHeader.remote(string name, Gitg.Remote? remote)
        {
                this(Gitg.RefType.REMOTE, name);
 
                d_remote = remote;
                d_is_sub_header_remote = true;
-               d_label.margin_start += 12;
+               d_expander.margin_start += 12;
 
                if (d_remote != null)
                {
@@ -480,6 +494,79 @@ public class RefsList : Gtk.ListBox
                d_remotes = new Gitg.Remote[0];
 
                set_sort_func(sort_rows);
+               set_filter_func(filter_func);
+       }
+
+       private RefHeader? find_header(Gtk.ListBoxRow row)
+       {
+               var children = get_children();
+               unowned List<weak Gtk.Widget> found = children.find(row);
+
+               if (found == null)
+               {
+                       return null;
+               }
+
+               while (found.prev != null)
+               {
+                       found = found.prev;
+
+                       var header = found.data as RefHeader;
+
+                       if (header != null)
+                       {
+                               return header;
+                       }
+               }
+
+               return null;
+       }
+
+       private bool filter_func(Gtk.ListBoxRow row)
+       {
+               var header = row as RefHeader;
+
+               if (header != null)
+               {
+                       if (!header.is_sub_header_remote)
+                       {
+                               return true;
+                       }
+                       else
+                       {
+                               while (header != null && header.is_sub_header_remote)
+                               {
+                                       header = find_header(header);
+                               }
+
+                               if (header == null)
+                               {
+                                       return true;
+                               }
+                       }
+               }
+               else
+               {
+                       header = find_header(row);
+               }
+
+               if (header == null)
+               {
+                       return true;
+               }
+               else if (!header.is_sub_header_remote || !header.expanded)
+               {
+                       return header.expanded;
+               }
+               else
+               {
+                       while (header != null && header.is_sub_header_remote)
+                       {
+                               header = find_header(header);
+                       }
+
+                       return header == null || header.expanded;
+               }
        }
 
        private int sort_rows(Gtk.ListBoxRow row1, Gtk.ListBoxRow row2)
@@ -607,11 +694,18 @@ public class RefsList : Gtk.ListBox
                reselect_row(row);
        }
 
+       private void expanded_changed()
+       {
+               invalidate_filter();
+       }
+
        private RefHeader add_header(Gitg.RefType ref_type, string name)
        {
                var header = new RefHeader(ref_type, name);
                header.show();
 
+               header.notify["expanded"].connect(expanded_changed);
+
                add(header);
                return header;
        }
@@ -678,6 +772,8 @@ public class RefsList : Gtk.ListBox
                var header = new RefHeader.remote(name, remote);
                header.show();
 
+               header.notify["expanded"].connect(expanded_changed);
+
                d_header_map[name] = new RemoteHeader(header);
                add(header);
 
diff --git a/gitg/resources/ui/gitg-history-ref-header.ui b/gitg/resources/ui/gitg-history-ref-header.ui
index 6915dbe..ac04ed8 100644
--- a/gitg/resources/ui/gitg-history-ref-header.ui
+++ b/gitg/resources/ui/gitg-history-ref-header.ui
@@ -9,25 +9,31 @@
       <class name="sidebar"/>
     </style>
     <child>
-      <object class="GitgProgressBin" id="d_progress_bin">
+      <object class="GitgProgressBin" id="progress_bin">
         <property name="visible">True</property>
         <child>
-          <object class="GtkBox" id="d_box">
+          <object class="GtkBox" id="box">
             <property name="visible">True</property>
             <property name="orientation">horizontal</property>
             <property name="spacing">6</property>
             <child>
-              <object class="GtkLabel" id="d_label">
+              <object class="GtkExpander" id="expander">
                 <property name="visible">True</property>
                 <property name="margin_top">3</property>
                 <property name="margin_bottom">3</property>
-                <property name="margin_start">16</property>
+                <property name="margin_start">6</property>
+                <property name="expanded">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label">
+                <property name="visible">True</property>
                 <property name="halign">start</property>
-                <property name="hexpand">true</property>
+                <property name="hexpand">True</property>
               </object>
             </child>
             <child>
-              <object class="GtkImage" id="d_icon">
+              <object class="GtkImage" id="icon">
                 <property name="visible">False</property>
                 <property name="halign">end</property>
               </object>


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