diff options
author | Olivier Andrieu <oandrieu@gmail.com> | 2003-12-03 22:17:52 +0000 |
---|---|---|
committer | Olivier Andrieu <oandrieu@gmail.com> | 2003-12-03 22:17:52 +0000 |
commit | ebdc8d9d06f2271f8fa96b655c15a28080a443a1 (patch) | |
tree | fde269c4645cb9e63645b446c1c062abf6e21cd3 | |
parent | bd880a0c73e0b4a9a5f0b9191449659d0eec956c (diff) |
support redraw signal of GtkCairo
-rw-r--r-- | .cvsignore | 6 | ||||
-rw-r--r-- | src/ocairo_gtkcairo.ml | 19 | ||||
-rw-r--r-- | src/ocairo_gtkcairo.mli | 11 | ||||
-rw-r--r-- | test/cube.ml | 61 |
4 files changed, 60 insertions, 37 deletions
diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..58b6f75 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,6 @@ +aclocal.m4 +autom4te.cache +config.log +config.make +config.status +configure diff --git a/src/ocairo_gtkcairo.ml b/src/ocairo_gtkcairo.ml index 77e290f..f7f8732 100644 --- a/src/ocairo_gtkcairo.ml +++ b/src/ocairo_gtkcairo.ml @@ -6,10 +6,27 @@ let init = gtkcairo_init () external get_cairo : [>`gtkcairo] Gtk.obj -> Cairo.t = "ml_cairo_gtkcairo_get_cairo" +let redraw_sig = { + GtkSignal.name = "redraw" ; + GtkSignal.classe = `gtkcairo ; + GtkSignal.marshaller = + let m = GtkSignal.marshal1 Gobject.Data.pointer "GtkCairo::redraw" in + fun cb -> + m (function + | None -> raise Gpointer.Null + | Some cairo -> cb (Obj.magic cairo : Cairo.t)) } + +class cairo_signals obj = + object (self) + inherit GObj.widget_signals_impl obj + method redraw = self#connect redraw_sig + end + class cairo obj = object - inherit GObj.widget_full (obj : [> gtkcairo] Gtk.obj) + inherit GObj.widget (obj : [> gtkcairo] Gtk.obj) + method connect = new cairo_signals obj method event = new GObj.event_ops obj method cairo = new Ocairo.cairo (get_cairo obj) method queue_draw = diff --git a/src/ocairo_gtkcairo.mli b/src/ocairo_gtkcairo.mli index e329dac..239f84b 100644 --- a/src/ocairo_gtkcairo.mli +++ b/src/ocairo_gtkcairo.mli @@ -1,14 +1,21 @@ type gtkcairo = [Gtk.widget | `gtkcairo] -val init : unit external get_cairo : [> `gtkcairo ] Gtk.obj -> Cairo.t = "ml_cairo_gtkcairo_get_cairo" +class cairo_signals : + [> gtkcairo ] Gtk.obj -> + object + inherit GObj.widget_signals + method redraw : callback:(Cairo.t -> unit) -> GtkSignal.id + end + class cairo : ([> gtkcairo ] as 'a) Gtk.obj -> object - inherit GObj.widget_full + inherit GObj.widget val obj : 'a Gtk.obj + method connect : cairo_signals method event : GObj.event_ops method cairo : Ocairo.cairo method queue_draw : unit diff --git a/test/cube.ml b/test/cube.ml index c8b7f2c..8584dd6 100644 --- a/test/cube.ml +++ b/test/cube.ml @@ -1,33 +1,23 @@ let animate_rotate_step = 0.05 let animate_frame_delay = 40 let rotate_max = 8. *. atan 1. -let box_size = 100 -let margin = 20 +let initial_size = 200 -let setup_transform cr = +let redraw w range c = + let { Gtk.width = width ; Gtk.height = height } = + w#misc#allocation in + let cr = new Ocairo.cairo c in + let box_size = float (width + height) /. 6. in cr#default_matrix ; - let off = float (box_size + margin) in - cr#translate off off - -let expose_cb c _ = - let cr = c#cairo in - cr#rectangle 0. 0. (float box_size) (float box_size) ; + let off = float width /. 2. in + cr#translate off off ; + cr#rotate range#adjustment#value ; + cr#rectangle (~-. box_size) (~-. box_size) box_size box_size ; cr#set_rgb_color 1. 1. 1. ; - cr#fill ; - false + cr#fill -let setup packing = - let size = 2 * box_size + margin in - let c = Ocairo_gtkcairo.cairo ~width:size ~height:size ~packing () in - setup_transform c#cairo ; - c#event#connect#after#expose (expose_cb c) ; - c - -let slider_changed range c () = - let cr = c#cairo in - setup_transform cr ; - cr#rotate range#adjustment#value ; - c#queue_draw +let slider_changed cr () = + cr#queue_draw let animate_step range () = let nv = range#adjustment#value +. animate_rotate_step in @@ -39,12 +29,12 @@ let animate_toggled button range = fun () -> match !timeout with | None when button#active -> - let id = - Glib.Timeout.add animate_frame_delay - (animate_step range) in - timeout := Some id + timeout := Some ( + Glib.Timeout.add animate_frame_delay + (animate_step range)) | Some id when not button#active -> - Glib.Timeout.remove id + Glib.Timeout.remove id ; + timeout := None | _ -> () @@ -56,20 +46,23 @@ let main = let b = GPack.vbox ~spacing:6 ~border_width:12 ~packing:w#add () in - let f = GBin.frame ~shadow_type:`IN ~packing:b#pack () in - - let cairo = setup f#add in + let f = GBin.frame ~shadow_type:`IN + ~packing:(b#pack ~expand:true ~fill:true) () in + let cairo = Ocairo_gtkcairo.cairo + ~width:initial_size ~height:initial_size + ~packing:f#add () in let slider = GRange.scale `HORIZONTAL ~draw_value:false ~packing:b#pack () in slider#adjustment#set_bounds ~lower:0. ~upper:rotate_max ~step_incr:animate_rotate_step () ; - slider#connect#value_changed - (slider_changed slider cairo) ; - let button = GButton.check_button ~label:"Animate" ~packing:b#pack () in + + cairo#connect#redraw (redraw cairo slider) ; + slider#connect#value_changed + (slider_changed cairo) ; button#connect#toggled (animate_toggled button slider) ; w#show () ; |