The unified diff between revisions [9af6e795..] and [594720f0..] is displayed below. It can also be downloaded as a raw diff.

This diff has been restricted to the following files: 'view.ml'

#
#
# patch "view.ml"
#  from [1fd9c1202a2ea9a2dbbf928a1f1e29d3e061aa74]
#    to [480559485398180fae369859edfe5b13aacb12e1]
#
============================================================
--- view.ml	1fd9c1202a2ea9a2dbbf928a1f1e29d3e061aa74
+++ view.ml	480559485398180fae369859edfe5b13aacb12e1
@@ -390,6 +390,7 @@ module Branch_selector = struct
   type t = {
       store           : GTree.tree_store ;
       branch_column   : string GTree.column ;
+      count_column    :    int GTree.column ;
       in_view_column  :   bool GTree.column ;
       vis_column      :   bool GTree.column ;
       w               : [`CANCEL|`DELETE_EVENT|`VIEW] GWindow.dialog ;
@@ -398,6 +399,7 @@ module Branch_selector = struct
       toggle_renderer : GTree.cell_renderer_toggle ;
       radio_buttons   : GButton.radio_button array ;
       entries         : GEdit.entry array ;
+      propagate_checkb : GButton.toggle_button ;
       mutable selected_b    : int ;
       mutable limit_kind    : int ;
     }
@@ -406,6 +408,7 @@ module Branch_selector = struct
     (* The model containing branch names *)
     let cl = new GTree.column_list in
     let branch_column  = cl#add Gobject.Data.string in
+    let count_column   = cl#add Gobject.Data.int in
     let in_view_column = cl#add Gobject.Data.boolean in
     let vis_column     = cl#add Gobject.Data.boolean in
     let model = GTree.tree_store cl in
@@ -458,22 +461,30 @@ module Branch_selector = struct
       ignore (view#append_column vc) ;
       view#set_expander_column (Some vc)
     end ;
+    begin
+      let vc = GTree.view_column ~title:"Count" () in
+      let r = GTree.cell_renderer_text [`XALIGN 1.] in
+      vc#pack r ;
+      vc#add_attribute r "text" count_column ;
+      vc#add_attribute r "visible" vis_column ;
+      ignore (view#append_column vc)
+    end ;

     (* The radio buttons for the date limit *)
-    let packing = Ui.category "Date limit" packing in
-    let tooltips = GData.tooltips () in
-    let date_entry_tooltip_text =
-      "Specify a date (YYYY-MM-DD), a tag or a revision id" in
-    let tbl =
-      GPack.table
-	~columns:2 ~rows:3
-	~row_spacings:2 ~col_spacings:4 ~packing () in
-    let b1 =
-      let packing = tbl#attach ~left:0 ~top:0 in
-      GButton.radio_button
-	~label:"_No limit" ~use_mnemonic:true ~active:true ~packing () in
-    let group = b1#group in
-    let b2, entry_from, entry_to =
+    let b1, b2, entry_from, entry_to =
+      let packing = Ui.category "Date limit" packing in
+      let tooltips = GData.tooltips () in
+      let date_entry_tooltip_text =
+	"Specify a date (YYYY-MM-DD), a tag or a revision id" in
+      let tbl =
+	GPack.table
+	  ~columns:2 ~rows:3
+	  ~row_spacings:2 ~col_spacings:4 ~packing () in
+      let b1 =
+	let packing = tbl#attach ~left:0 ~top:0 in
+	GButton.radio_button
+	  ~label:"_No limit" ~use_mnemonic:true ~active:true ~packing () in
+      let group = b1#group in
       let button =
 	GButton.radio_button ~group
 	  ~label:"_Interval limit" ~use_mnemonic:true
@@ -490,10 +501,19 @@ module Branch_selector = struct
       let e2 = GEdit.entry ~packing ~activates_default:true () in
       tooltips#set_tip ~text:date_entry_tooltip_text e2#coerce ;
       ignore (e1#connect#activate (fun () -> e2#misc#grab_focus ())) ;
-      (button, e1, e2) in
+      (b1, button, e1, e2) in

+    (* The check button to select all propagate nodes or not *)
+    let checkb =
+      let packing = Ui.category "Options" packing in
+      GButton.check_button
+	~label:"Display all propagate nodes"
+	~active:false
+	~packing () in
+
     { store = model ;
       branch_column = branch_column ;
+      count_column = count_column ;
       in_view_column = in_view_column ;
       vis_column = vis_column ;
       view = view ;
@@ -502,6 +522,7 @@ module Branch_selector = struct
       w = w ;
       radio_buttons = [| b1 ; b2 |] ;
       entries = [| entry_from ; entry_to |] ;
+      propagate_checkb = checkb ;
       selected_b = 0 ;
       limit_kind = 0 }

@@ -583,7 +604,11 @@ module Branch_selector = struct
 	| _ ->
 	    make_query_limit_interval ctrl query_domain
 	      s.entries.(0)#text s.entries.(1)#text in
-      Some { query = (query_domain, query_limit) ;
+      let query_propagate =
+	s.propagate_checkb#active in
+      Some { query = { dom = query_domain ;
+		       lim = query_limit ;
+		       all_propagates = query_propagate };
 	     preselect = id }
     with
     | Complete.None -> None
@@ -674,9 +699,10 @@ module Branch_selector = struct
     let rec loop kl parent t =
       let m, parent =
 	match t with
-	| Trie.N (v, m) ->
+	| Trie.N ((v, n), m) ->
 	    let row = s.store#append ?parent () in
 	    s.store#set ~row ~column:s.branch_column v ;
+	    s.store#set ~row ~column:s.count_column n ;
 	    s.store#set ~row ~column:s.vis_column true ;
 	    m, Some row
 	| Trie.B m when kl <> [] && at_least_two m ->
@@ -695,10 +721,10 @@ module Branch_selector = struct
     assert (s.store#get_iter_first = None) ;
     (* branch names are theoretically unstructured but
        in practice . is used as delimiter. (NDQF) *)
-    List.map (fun b -> string_split '.' b, b) br
+    List.map (fun ((b, _) as v) -> string_split '.' b, v) br
       ++
       List.fold_left
-        (fun acc (bl, b) -> Trie.insert acc bl b)
+        (fun acc (bl, v) -> Trie.insert acc bl v)
         Trie.empty
       ++
       fill_store_from_trie s
@@ -848,7 +874,15 @@ module KeyNav = struct
   let navigate_is_sibling k id =
     List.exists (fun (i, _) -> i = id) k.keyboard_nav_siblings

-  let navigate_choose k current_id direction =
+  let on_same_branch db id =
+    let b_target = Database.fetch_cert_value db id "branch" in
+    fun (id, _) ->
+      let b_node = Database.fetch_cert_value db id "branch" in
+      List.exists
+	(fun b -> List.mem b b_target)
+	b_node
+
+  let navigate_choose k ctrl current_id direction =
     match k.keyboard_nav_siblings with
     | [] -> None
     | [ n ] -> Some n
@@ -861,11 +895,9 @@ module KeyNav = struct
 	| `NEXT -> locate sx
 	| `PREV -> locate (List.rev sx)
 	| `PARENT | `CHILD ->
-	    match k.previous_selected_node with
-	    | None -> Some (List.hd sx)
-	    | Some (p_id, _) ->
-		try Some (List.find (fun (id, _) -> id = p_id) sx)
-		with Not_found -> Some (List.hd sx)
+	    match List.filter (on_same_branch (some ctrl#get_db) current_id) sx with
+	    | [] -> Some (List.hd sx)
+	    | h :: _ -> Some h

   let navigate k ctrl key =
     match ctrl#get_selected_node with
@@ -881,7 +913,7 @@ module KeyNav = struct
 	      k.previous_selected_node ;
 	    k.previous_selected_node
 	| (`NEXT | `PREV) as d when k.keyboard_nav_siblings <> [] ->
-	    navigate_choose k id d
+	    navigate_choose k ctrl id d
 	| #Viz_types.direction as d ->
 	    match ctrl#get_agraph with
 	    | None -> None
@@ -895,7 +927,7 @@ module KeyNav = struct
 		  | `NEXT | `PREV ->
 		      Agraph.get_siblings graph id in
 		k.keyboard_nav_siblings <- cnodes ;
-		navigate_choose k id d
+		navigate_choose k ctrl id d

   let select k id previous_id =
     k.previous_selected_node <- previous_id ;
@@ -1252,7 +1284,8 @@ module Canvas = struct
       let color =
 	match s.edge_kind with
 	  SAME_BRANCH -> "black"
-	| BRANCHING -> "orange"
+	| BRANCHING
+	| BRANCHING_NEIGH -> "orange"
 	| DISAPPROVED -> "red"
 	| SPANNING -> "darkgrey" in
       let bpath = GnomeCanvas.PathDef.new_path () in