osiire’s blog

ふしぎなそふとやさん

ドラッグイベントを作る例

例によってドラッグイベントを作る例。

module E = Pec
open Pec.OP

let (!%) = Printf.sprintf
let (+>) f g = g f

let mouse_down, send_down = E.make ()
let mouse_up, send_up = E.make ()
let mouse_move, send_move = E.make ()

let dragging md mu mm =
  md >>= (fun dloc -> E.choose [
    E.map (fun uloc -> `Drop (dloc, uloc)) mu; 
    E.map (fun mloc -> `Drag (dloc, mloc)) mm;
  ]
  +> E.take_while_in (function `Drop _ -> false | _ -> true))

let run_all () =
  while E.run () > 0 do () done

let _ =
  dragging mouse_down mouse_up mouse_move
  +> E.subscribe (function 
    | `Drag (sloc, eloc) -> print_string (!%"Drag %d,%d\n" sloc eloc)
    | `Drop (sloc, eloc) -> print_string (!%"Drop %d,%d\n" sloc eloc));
  send_down 10; (* ドラッグ開始 *)
  send_move 11; (* 移動 *)
  send_move 12; (* 移動 *)
  send_up 13;   (* ドロップ *)
  send_move 14; (* 無視される *)
  send_move 15;  (* 無視される *)
  send_down 16;  (* ドラッグ開始 *)
  send_move 17;  (* 移動 *)
  send_move 18;  (* 移動 *)
  send_up 19;    (* ドロップ *)
  run_all ()