# # patch "view.ml" # from [5ad3c39976fba9ebc5bbd2dc5c1199928bd4c82c] # to [e1aa0f35c08c8299262d4a5878f28b6f472796cf] # ======================================================================== --- view.ml 5ad3c39976fba9ebc5bbd2dc5c1199928bd4c82c +++ view.ml e1aa0f35c08c8299262d4a5878f28b6f472796cf @@ -293,14 +293,6 @@ -let with_blocked_signal o id f = - match id with - | None -> f () - | Some id -> - o#misc#handler_block id ; - try let r = f () in o#misc#handler_unblock id ; r - with exn -> o#misc#handler_unblock id ; raise exn - module Branch_selector = struct type t = { button : GButton.button ; @@ -310,11 +302,12 @@ vis_column : bool GTree.column ; w : [`CANCEL|`DELETE_EVENT|`VIEW] GWindow.dialog ; view : GTree.view ; + select_buttons : GButton.button * GButton.button ; + toggle_renderer : GTree.cell_renderer_toggle ; radio_buttons : GButton.radio_button array ; entries : GEdit.entry array ; span_kind : GEdit.combo_box GEdit.text_combo ; mutable selected_b : int ; - mutable toggle_signal : GtkSignal.id option ; mutable limit_kind : int ; } @@ -344,38 +337,30 @@ let packing = w#vbox#pack in (* The treeview of branches *) - let view = + let view, select_buttons = let packing = Ui.category "Branches" (packing ~expand:true) in - begin + let select_buttons = let al = GBin.alignment ~xalign:1. ~xscale:0.333 ~packing () in let hb = GPack.hbox ~homogeneous:true ~packing:al#add () in - let add_button label v = - let b = - GButton.button ~packing:(hb#pack ~from:`END) ~label () in - ignore (b#connect#clicked (fun () -> - model#foreach (fun path row -> - model#set ~row ~column:in_view_column v ; - false))) in - add_button "select none" false ; - add_button "select all" true - end ; - GTree.view - ~model ~height:200 - ~packing:(Ui.wrap_in_scroll_window (packing ~expand:true)) () in + let add_button label = + GButton.button ~packing:(hb#pack ~from:`END) ~label () in + let b1 = add_button "select none" in + let b2 = add_button "select all" in + (b1, b2) in + let view = + GTree.view + ~model ~height:200 + ~packing:(Ui.wrap_in_scroll_window (packing ~expand:true)) () in + view, select_buttons in view#selection#set_mode `NONE ; - begin + let toggle_renderer = let vc = GTree.view_column ~title:"view" () in let r = GTree.cell_renderer_toggle [] in - ignore (r#connect#toggled (fun path -> - let column = in_view_column in - let row = model#get_iter path in - let v = model#get ~row ~column in - model#set ~row ~column (not v))) ; vc#pack r ; vc#add_attribute r "active" in_view_column ; vc#add_attribute r "visible" vis_column ; - ignore (view#append_column vc) - end ; + ignore (view#append_column vc) ; + r in begin let vc = GTree.view_column ~title:"Branch" () in let r = GTree.cell_renderer_text [] in @@ -438,12 +423,13 @@ in_view_column = in_view_column ; vis_column = vis_column ; view = view ; + select_buttons = select_buttons ; + toggle_renderer = toggle_renderer ; w = w ; radio_buttons = [| b1 ; b2 ; b3 |] ; entries = [| entry_from ; entry_to ; entry_dur ; entry_id |] ; span_kind = kind ; selected_b = 0 ; - toggle_signal = None ; limit_kind = 0 } @@ -531,6 +517,8 @@ with exn -> None + let adjust_view_button_sensitivity s = + s.w#set_response_sensitive `VIEW (s.selected_b > 0) let setup s ctrl = Array.iteri @@ -539,19 +527,33 @@ if b#active then s.limit_kind <- i))) s.radio_buttons ; - let id = s.store#connect#row_changed (fun path row -> - let v = s.store#get ~row ~column:s.in_view_column in - Viz_misc.log "view" - "row_changed: %s (%s) %b" - (GTree.Path.to_string path) - (s.store#get ~row ~column:s.branch_column) - v ; - if v - then s.selected_b <- s.selected_b + 1 - else s.selected_b <- s.selected_b - 1 ; + begin + let sel_none_b, sel_all_b = s.select_buttons in + ignore (sel_none_b#connect#clicked (fun () -> + s.selected_b <- 0 ; + s.store#foreach (fun path row -> + s.store#set ~row ~column:s.in_view_column false ; + false) ; + adjust_view_button_sensitivity s)) ; + ignore (sel_all_b#connect#clicked (fun () -> + let nb_b = ref 0 in + s.store#foreach (fun path row -> + s.store#set ~row ~column:s.in_view_column true ; + incr nb_b ; + false) ; + s.selected_b <- !nb_b ; + adjust_view_button_sensitivity s)) ; + end ; + ignore (s.toggle_renderer#connect#toggled (fun path -> + let column = s.in_view_column in + let row = s.store#get_iter path in + let v = s.store#get ~row ~column in + if v + then s.selected_b <- s.selected_b - 1 + else s.selected_b <- s.selected_b + 1 ; + s.store#set ~row ~column (not v) ; if s.selected_b <= 1 - then s.w#set_response_sensitive `VIEW (s.selected_b > 0)) in - s.toggle_signal <- Some id ; + then adjust_view_button_sensitivity s)) ; ignore (s.button#connect#clicked (fun () -> expand_rows s ; scroll s ; @@ -633,16 +635,13 @@ ++ fill_store_from_trie s - let populate s br = - with_blocked_signal - s.store - s.toggle_signal - (fun () -> tree_of_branches s br) + let populate = tree_of_branches let clear s = s.w#misc#hide () ; s.store#clear () ; s.selected_b <- 0 ; + adjust_view_button_sensitivity s ; s.radio_buttons.(0)#set_active true ; (* should update s.limit_kind *) Array.iter (fun e -> e#set_text "") s.entries ; (fst s.span_kind)#set_active 1 @@ -663,6 +662,7 @@ match domain with | QUERY_ALL -> true | QUERY_BRANCHES b -> List.mem v b in + s.selected_b <- 0 ; s.store#foreach (fun path row -> let b = s.store#get ~row ~column:s.branch_column in @@ -670,7 +670,9 @@ let n = in_domain b in if n <> v then s.store#set ~row ~column:s.in_view_column n ; + if n then s.selected_b <- s.selected_b + 1 ; false) ; + adjust_view_button_sensitivity s ; s.radio_buttons.(limit_kind)#set_active true ; Array.iteri (fun i e -> e#set_text entries_text.(i)) @@ -682,13 +684,17 @@ let set_branch s ctrl ?id br = + s.selected_b <- 0 ; s.store#foreach (fun path row -> let b = s.store#get ~row ~column:s.branch_column in let v = s.store#get ~row ~column:s.in_view_column in - if v <> (b = br) - then s.store#set ~row ~column:s.in_view_column (b = br) ; + let sel = b = br in + if v <> sel + then s.store#set ~row ~column:s.in_view_column sel ; + if sel then s.selected_b <- 1 ; false) ; + adjust_view_button_sensitivity s ; may ctrl#query (make_query ?id s)