Blame examples_labltk/eyes.ml

Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*                 MLTk, Tcl/Tk interface of OCaml                     *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*    Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis    *)
Packit bd2e5d
(*               projet Cristal, INRIA Rocquencourt                    *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                  *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*  Copyright 2002 Institut National de Recherche en Informatique et   *)
Packit bd2e5d
(*  en Automatique and Kyoto University.  All rights reserved.         *)
Packit bd2e5d
(*  This file is distributed under the terms of the GNU Library        *)
Packit bd2e5d
(*  General Public License, with the special exception on linking      *)
Packit bd2e5d
(*  described in file LICENSE found in the OCaml source tree.          *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
Packit bd2e5d
(* $Id$ *)
Packit bd2e5d
Packit bd2e5d
open Tk
Packit bd2e5d
Packit bd2e5d
let _ =
Packit bd2e5d
  let top = openTk () in
Packit bd2e5d
  let fw = Frame.create top in
Packit bd2e5d
  pack [fw];
Packit bd2e5d
  let c = Canvas.create ~width: 200 ~height: 200 fw in
Packit bd2e5d
  let create_eye cx cy wx wy ewx ewy bnd =
Packit bd2e5d
    let _o2 = Canvas.create_oval
Packit bd2e5d
        ~x1:(cx - wx) ~y1:(cy - wy)
Packit bd2e5d
        ~x2:(cx + wx) ~y2:(cy + wy)
Packit bd2e5d
        ~outline: `Black ~width: 7
Packit bd2e5d
        ~fill: `White
Packit bd2e5d
        c
Packit bd2e5d
    and o = Canvas.create_oval
Packit bd2e5d
        ~x1:(cx - ewx) ~y1:(cy - ewy)
Packit bd2e5d
        ~x2:(cx + ewx) ~y2:(cy + ewy)
Packit bd2e5d
        ~fill:`Black
Packit bd2e5d
        c in
Packit bd2e5d
    let curx = ref cx
Packit bd2e5d
    and cury = ref cy in
Packit bd2e5d
    bind ~events:[`Motion] ~extend:true ~fields:[`MouseX; `MouseY]
Packit bd2e5d
      ~action:(fun e ->
Packit bd2e5d
        let nx, ny =
Packit bd2e5d
          let xdiff = e.ev_MouseX - cx
Packit bd2e5d
          and ydiff = e.ev_MouseY - cy in
Packit bd2e5d
          let diff = sqrt ((float xdiff /. (float wx *. bnd)) ** 2.0 +.
Packit bd2e5d
                             (float ydiff /. (float wy *. bnd)) ** 2.0) in
Packit bd2e5d
          if diff > 1.0 then
Packit bd2e5d
            truncate ((float xdiff) *. (1.0 /. diff)) + cx,
Packit bd2e5d
            truncate ((float ydiff) *. (1.0 /. diff)) + cy
Packit bd2e5d
          else
Packit bd2e5d
            e.ev_MouseX, e.ev_MouseY
Packit bd2e5d
        in
Packit bd2e5d
        Canvas.move c o ~x: (nx - !curx) ~y: (ny - !cury);
Packit bd2e5d
        curx := nx;
Packit bd2e5d
        cury := ny)
Packit bd2e5d
      c
Packit bd2e5d
  in
Packit bd2e5d
  create_eye 60 100 30 40 5 6 0.6;
Packit bd2e5d
  create_eye 140 100 30 40 5 6 0.6;
Packit bd2e5d
  pack [c]
Packit bd2e5d
Packit bd2e5d
let _ = Printexc.print mainLoop ()