File: gtk_interface.ml

package info (click to toggle)
plplot 5.10.0%2Bdfsg2-0.4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 25,792 kB
  • ctags: 13,517
  • sloc: ansic: 83,001; xml: 27,081; ada: 18,878; cpp: 15,966; tcl: 11,651; python: 7,075; f90: 7,058; ml: 6,974; java: 6,665; perl: 5,029; sh: 2,208; makefile: 210; lisp: 75; sed: 25; fortran: 7
file content (95 lines) | stat: -rw-r--r-- 2,908 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
(*
Copyright 2008, 2009  Hezekiah M. Carty

This file is part of PLplot.

PLplot is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

PLplot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with PLplot.  If not, see <http://www.gnu.org/licenses/>.
*)

(* An example of using PLplot + Plcairo + Cairo + lablgtk to show a plot in a
   Gtk+ application.  This is meant to be run from the OCaml toplevel, after
   running "make" in the plcairo/ directory. *)

#use "topfind";;
#thread;;
#require "cairo.lablgtk2";;
#require "plplot";;
#directory "../_build/";;
#load "plcairo.cma";;

open Plplot

(* The plot surface size *)
let plot_width = 1600
let plot_height = 1000

(* The size of the GUI view of the plot *)
let gui_width = plot_width / 2
let gui_height = plot_height / 2

(** Get a Cairo context from the Gtk drawing area. *)
let get_cairo w =
  Cairo_lablgtk.create w#misc#window

(** Redraw the plot contents. *)
let redraw w plcairo _ =
  let cr = get_cairo w in
  let { Gtk.width = width ; Gtk.height = height } =
    w#misc#allocation in
  let width = float_of_int width in
  let height = float_of_int height in
  Plcairo.blit_to_cairo ~dest:cr ~dim:(`Both (width, height))
    ~xoff:0.0 ~yoff:0.0 plcairo;
  true

let () =
  (* Make a simple plot. *)
  let plcairo =
    Plcairo.init_cairo ~width:plot_width ~height:plot_height
      ~clear:true Plcairo.imagecairo
  in
  Plcairo.make_active plcairo;
  plenv (-180.0) 180.0 (-90.0) 90.0 1 0;
  plmap "globe" (-180.0) 180.0 (-90.0) 90.0;
  pllab "Latitude" "Longitude" "It's Earth!";
  plend ();

  (* DO NOT call Plcairo.finish yet.  The Cairo surface needs to remain active
     in order to use it in the GUI. *)

  (* Create a window for the app. *)
  let w = GWindow.window ~title:"PLplot + Gtk Integration Demo" () in
  (* Quit cleanly when the close button is clicked. *)
  ignore (w#connect#destroy GMain.quit);

  (* Put a box and frame around the plot. *)
  let b = GPack.vbox ~spacing:6 ~border_width:12 ~packing:w#add () in

  let f =
    GBin.frame ~shadow_type:`IN ~packing:(b#pack ~expand:true ~fill:true) ()
  in

  (* This drawing_area is where the plot will be displayed. *)
  let area =
    GMisc.drawing_area
      ~width:gui_width ~height:gui_height ~packing:f#add ()
  in

  (* Be sure to update the plot display when required. *)
  ignore (area#event#connect#expose (redraw area plcairo));

  (* Show the window and enter the main Gtk+ application loop. *)
  w#show ();
  GMain.main ()