# # patch "view.ml" # from [03f0acbc46c59d2b6bd24c7c74d9df5a4c1c3561] # to [dbcb45ab8a8bb701ddbc8c31b443457eea731a8e] # ======================================================================== --- view.ml 03f0acbc46c59d2b6bd24c7c74d9df5a4c1c3561 +++ view.ml dbcb45ab8a8bb701ddbc8c31b443457eea731a8e @@ -1007,6 +1007,44 @@ v.db + + + +let close v = + Branch_selector.clear v ; + may Agraph.abort_layout v.agraph ; + Canvas.clear v ; + v.agraph <- None ; + may Database.close_db v.db ; + v.db <- None ; + Signal.emit v.event_signal `CLOSE_DB + + +let finalize v = + may Database.close_db v.db + + +let open_db v fname branch = + (* fname should be in filesystem encoding, + branch should be UTF-8 *) + close v ; + try + let db = Database.open_db fname in + v.db <- Some db ; + Branch_selector.populate v + (nice_fetch Database.fetch_branches db) ; + may (Branch_selector.set_branch v) branch ; + Signal.emit v.event_signal `OPEN_DB + with Viz_types.Error msg -> + error_notice ~parent:v.canvas.w msg + + + +let dnd_targets = [| + { Gtk.target = "text/uri-list" ; Gtk.flags = [] ; Gtk.info = 0 } ; + { Gtk.target = "text/plain" ; Gtk.flags = [] ; Gtk.info = 1 } ; +|] + let make ~aa ~prefs ~packing = let b = GPack.vbox ~packing () in @@ -1055,16 +1093,34 @@ begin let canvas = v.canvas.w in - let setup_drag v = + + canvas#drag#dest_set ~actions:[`COPY] [ dnd_targets.(0) ] ; + ignore (canvas#drag#connect#data_received + (fun ctx ~x ~y sel ~info ~time -> + if info = 0 + then begin (* a file dropped from a file manager *) + try + let f = + List.find + (fun f -> Viz_misc.string_is_prefix "file://" f) + (Str.split (Str.regexp "\r\n") sel#data) in + open_db v + (Viz_misc.string_slice ~s:7 f) + None + with Not_found -> () + end)) ; + + let setup_drag () = canvas#drag#source_set ~modi:[`BUTTON1] ~actions:[`COPY] - [ { Gtk.target = "text/plain" ; Gtk.flags = [] ; Gtk.info = 1 } ] in + [ dnd_targets.(1) ] in - setup_drag v ; + setup_drag () ; + (* OK, this is a bit complicated: GTK+ supports DnD at the widget level but here I want DnD for a GnomeCanvasItem (a node in the - ancestry graph. So the GnomeCanvas is set up as a + ancestry graph). So the GnomeCanvas is set up as a DragSource. In the button press event handler of the canvas item, the drag_active field is set to true. In a event handler of the canvas widget for button press (connected with after so @@ -1086,7 +1142,7 @@ then begin if v.drag_active then v.drag_active <- false - else setup_drag v + else setup_drag () end ; false)) ; @@ -1117,35 +1173,8 @@ v -let close v = - Branch_selector.clear v ; - may Agraph.abort_layout v.agraph ; - Canvas.clear v ; - v.agraph <- None ; - may Database.close_db v.db ; - v.db <- None ; - Signal.emit v.event_signal `CLOSE_DB -let finalize v = - may Database.close_db v.db - - -let open_db v fname branch = - (* fname should be in filesystem encoding, - branch should be UTF-8 *) - close v ; - try - let db = Database.open_db fname in - v.db <- Some db ; - Branch_selector.populate v - (nice_fetch Database.fetch_branches db) ; - may (Branch_selector.set_branch v) branch ; - Signal.emit v.event_signal `OPEN_DB - with Viz_types.Error msg -> - error_notice ~parent:v.canvas.w msg - - let reload v = may (fun db -> let branch = Branch_selector.get_branch v in