<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE message PUBLIC
  "-//MLarc//DTD MLarc output files//EN"
  "../../mlarc.dtd"[
  <!ATTLIST message
    listname CDATA #REQUIRED
    title CDATA #REQUIRED
  >
]>

  <?xml-stylesheet href="../../mlarc.xsl" type="text/xsl"?>


<message 
  url="2003/01/148644b11cb880a744ab0d853a427c98"
  from="Michaël_Grünewald &lt;michael-grunewald@w...&gt;"
  author="Michaël_Grünewald"
  date="2003-01-09T06:43:58"
  subject="[Caml-list] Re: probleme de liaison avec un canvas"
  prev="2003/01/ce7780f4e0c6590184c7fd1d4991712f"
  next="2003/01/4c25a38b0b4a29a0e077f61edf9843aa"
  prev-in-thread="2003/01/31835993ecc251120654a9c4bc10a0f6"
  prev-thread="2003/01/13f7a2d121988f53dd4fbe7a9590e5e6"
  next-thread="2003/01/0e33f04291c4ee802ea2a08485d2b730"
  root="../../"
  period="month"
  listname="caml-list"
  title="Archives of the Caml mailing list">

<thread subject="[Caml-list] probleme de liaison avec un canvas">
<msg 
  url="2003/01/31835993ecc251120654a9c4bc10a0f6"
  from="Sebastien Gandia - maitrise &lt;gandias@i...&gt;"
  author="Sebastien Gandia - maitrise"
  date="2003-01-08T16:40:06"
  subject="[Caml-list] probleme de liaison avec un canvas">
<msg 
  url="2003/01/148644b11cb880a744ab0d853a427c98"
  from="Michaël_Grünewald &lt;michael-grunewald@w...&gt;"
  author="Michaël_Grünewald"
  date="2003-01-09T06:43:58"
  subject="[Caml-list] Re: probleme de liaison avec un canvas">
</msg>
</msg>
</thread>

<contents>
Sebastien Gandia - maitrise &lt;gandias@ifsic.univ-rennes1.fr&gt; writes:

&gt; Bonjour, je travaille avec la librairie LablTK, et je desire associer a
&gt; un canvas un evenement.
&gt; Cet evenement est par exemple :
&gt; 
&gt; -quand on clique dans le canvas , on recupere les coordonnées de la zone
&gt; cliquée
&gt; 
&gt; ça peut-etre aussi une action associée.
&gt; 
&gt; J'ai essayé avec canvas.bind mais ça n'a aucun effet.
&gt; Ainsi pourriez vous me donner un exemple de code utilisant canvas.bind
&gt; pour que je puisse comparer son implementation avec la mienne, car je
&gt; pense que la solution est là.

Avec plaisir, dans la distribution de Tk il y a une floppée d'exemples, pour
faire connaissance avec ocamltk, je me suis entraîné à les
traduire. Exercice recommandé, il me semble.

Je me suis arrêté à un, le voici :

(* simple_graph *)

open Tk;;

let font_label = "arial";;
let font_plot = "Helvetica 18";;

let toplevel = opentk ();;

let w_msg = Label.create 
        ~font:font_label 
        ~justify:`Left 
        ~takefocus:false 
	~text:("This windows displays a canvas widget containing"
                ^" a simple two dimensional plot." toplevel)
;;
pack [w_msg];;

(* frame and buttons *)
let w_frame = Frame.create toplevel;;
let b_dismiss = Button.create ~text:"Dismiss" w_frame;;
let b_seecode = Button.create ~text:"See Code" w_frame;;

pack ~side:`Bottom ~fill:`X [w_frame];;
pack ~side:`Left ~fill:`X [b_seecode; b_dismiss];;

(* canvas *)
let canvas = Canvas.create ~relief:`Raised  ~width:450 ~height:450 toplevel;;

pack ~side:`Top [canvas];;

(* oh le joli dessin *)
(* les axes *)

Canvas.create_line ~width:2 ~xys:[100,250; 400,250] canvas;;
Canvas.create_line ~width:2 ~xys:[100,250; 100,50]  canvas;;

for k = 0 to 10 do 
	ignore(Canvas.create_line ~width:2 
				  ~xys:[100+k*30,250;100+k*30,245] canvas)
	done;;

for k = 0 to 5 do 
	ignore(Canvas.create_line ~width:2 
				  ~xys:[100,250-k*40;105,250-k*40] canvas)
	done;;

let point_list = [12,56;20,94;33,98;32,120;61,180;75,160;98,223];;
let place_point (x,y) =
	let true_x = 100 + 3 * x in
	let true_y = 250 - (4*y)/5 in
	let r = 6 in
	let item = Canvas.create_oval 
		~x1:(true_x - r) 
		~x2:(true_x + r)
		~y1:(true_y - r)
		~y2:(true_y + r)
		~width:1
		~fill:(`Color "Orange")
		~outline:(`Color "Black")
		canvas
		in
	Canvas.addtag canvas ~tag:"point" ~specs:[`Withtag item]
	in

List.iter place_point point_list;;

(* Note: le tag "current" est géré par Tk, c'est l'objet en cours, par
   exemple, celui sous le pointeur. *)     
let change_color color = 
    Canvas.configure_oval ~fill:(`Color color) canvas (`Tag "current")
  ;;


type plot_t = {mutable lastX:int;
	       mutable lastY:int;
	       }
  ;;

let plot = {lastX = 0; lastY = 0; }
  ;;

let plot_down x y = 
    begin
      Canvas.dtag canvas (`Tag "selected" ) "selected"; 
      Canvas.addtag canvas ~tag:"selected" ~specs:[`Withtag (`Tag "current")];
      Canvas.raise canvas (`Tag "current");
      plot.lastX &lt;- x;
      plot.lastY &lt;- y;
   end
	;;

let plot_move x y =
    begin
      Canvas.move canvas (`Tag "selected") (x - plot.lastX)
			  (y - plot.lastY);
      plot.lastX &lt;- x;
      plot.lastY &lt;- y;

   
   end
  ;;

Canvas.bind ~events:[`Enter] 
		     ~fields:[]
		     ~action:(function x -&gt;  change_color "Red"; () )
		     canvas
		     (`Tag "point");;

Canvas.bind ~events:[`Leave] 
		     ~fields:[]
		     ~action:(function x -&gt;  change_color "Orange"; () )
		     canvas
		     (`Tag "point");;

Canvas.bind ~events:[`ButtonPressDetail 1]
	~fields:[`MouseX;`MouseY]
	~action:(function x -&gt; plot_down x.ev_MouseX x.ev_MouseY)
	canvas 
	(`Tag "point")
  ;;

Canvas.bind ~events:[`ButtonReleaseDetail 1]
	~fields:[`MouseX;`MouseY]
	~action:(function x -&gt; Canvas.dtag canvas (`Tag "selected") "selected")
	canvas 
	(`Tag "point")
  ;;

Canvas.bind ~events:[`Motion]
	~fields:[`MouseX;`MouseY]
	~action:(function x -&gt; plot_move x.ev_MouseX x.ev_MouseY)
	canvas
	(`Tag "point")
;;

mainLoop();;
-- 
Michaël Grünewald &lt;michael-grunewald@wanadoo.fr&gt;  - RSA PGP Key ID: 0x20D90C12
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners

</contents>

</message>

