# # # patch "agraph.ml" # from [a1fbfdb58c3ff99dfde25b729f89c7503c4d5e9b] # to [8c993476234f16a35bc35ba58fd86388868351aa] # # patch "view.ml" # from [50051d16bb931f1cc3012ad29e3256b5875e3898] # to [e996eff1992c98cfc0f787d2fa6e804662890253] # ============================================================ --- agraph.ml a1fbfdb58c3ff99dfde25b729f89c7503c4d5e9b +++ agraph.ml 8c993476234f16a35bc35ba58fd86388868351aa @@ -338,10 +338,11 @@ let get_related g rel id = | `CHILD -> get_related_ids g CHILD id | `SIBLINGS -> - List.concat - (List.map - (get_related_ids g CHILD) - (get_related_ids g PARENT id)) + list_uniq + (List.concat + (List.map + (get_related_ids g CHILD) + (get_related_ids g PARENT id))) end let get_node g id = ============================================================ --- view.ml 50051d16bb931f1cc3012ad29e3256b5875e3898 +++ view.ml e996eff1992c98cfc0f787d2fa6e804662890253 @@ -860,7 +860,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 @@ -873,11 +881,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 @@ -893,7 +899,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 @@ -907,7 +913,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 ;