File: druid.ml

package info (click to toggle)
lablgtk2 2.18.13-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 5,940 kB
  • sloc: ml: 41,454; ansic: 23,178; makefile: 685; sh: 75
file content (112 lines) | stat: -rw-r--r-- 3,470 bytes parent folder | download | duplicates (3)
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
(**************************************************************************)
(*    Lablgtk - Examples                                                  *)
(*                                                                        *)
(*    This code is in the public domain.                                  *)
(*    You may freely copy parts of it in your application.                *)
(*                                                                        *)
(**************************************************************************)

type color = 
  | RED
  | BLUE
  | YELLOW

type food =
  | DONUTS
  | YOGHURTS
  | PIZZA

class answer = object
  val mutable color = RED
  val mutable food = DONUTS
  method answer_color c () = color <- c
  method answer_food f () = food <- f
  method get_answer = "42"
end


let radio_color poll packing =
  let f = GBin.frame ~label:"Color" ~packing () in
  let vb = GPack.vbox ~packing:f#add () in
  let rb = GButton.radio_button ~label:"Red" ~packing:(vb#pack) () in
  rb#connect#clicked (poll#answer_color RED) ;
  let rb2 = GButton.radio_button ~group:rb#group ~label:"Blue" ~packing:(vb#pack) () in
  rb2#connect#clicked (poll#answer_color BLUE) ;
  let rb3 = GButton.radio_button ~group:rb#group ~label:"Yellow" ~packing:(vb#pack) () in
  rb3#connect#clicked (poll#answer_color YELLOW)

let radio_food poll =
  let vb = GPack.vbox () in
  let rb = GButton.radio_button ~label:"Donuts" ~packing:(vb#pack) () in
  rb#connect#clicked (poll#answer_food DONUTS) ;
  let rb2 = GButton.radio_button ~group:rb#group ~label:"Pizza" ~packing:(vb#pack) () in
  rb2#connect#clicked (poll#answer_food PIZZA) ;
  let rb3 = GButton.radio_button ~group:rb#group ~label:"Yoghurt" ~packing:(vb#pack) () in
  rb3#connect#clicked (poll#answer_food YOGHURTS) ;
  vb


let are_you_sure quit =
  let md = GWindow.message_dialog 
      ~message:"Are you sure ?"
      ~message_type:`QUESTION 
      ~buttons:GWindow.Buttons.yes_no
      ~modal:true () in
  let res = md#run () = `YES in
  md#destroy () ;
  if res then quit ()


let make_druid poll quit =
  let d = GnoDruid.druid () in

  d#connect#cancel (fun () -> are_you_sure quit) ;
  
  begin 
    let fp = GnoDruid.druid_page_edge ~position:`START ~aa:true ~title:"Poll !!" () in
    fp#set_text "Here is our great new poll.\nPlease answer all the questions !" ;
    d#append_page fp 
  end ;

  begin 
    let cp = GnoDruid.druid_page_standard ~title:"Color" () in
    radio_color poll cp#vbox#pack ;
    d#append_page cp 
  end ;

  begin 
    let mp = GnoDruid.druid_page_standard ~title:"Food" () in
    mp#append_item ~question:"Favorite food ?" ~additional_info:""
      (radio_food poll)#coerce ;
    d#append_page mp 
  end ;

  begin 
    let ep = GnoDruid.druid_page_edge ~position:`FINISH ~aa:true ~title:"The end" () in
    ep#set_text "Thank you for your co-operation." ; 
    d#append_page ep ;

    ep#connect#finish 
      (fun _ -> 
	let res = GWindow.message_dialog 
	    ~message:(Printf.sprintf "The answer is %s!" poll#get_answer)
	    ~message_type:`INFO ~buttons:GWindow.Buttons.close
	    ~modal:true () in
	res#run () ;
	res#destroy () ;
	quit ())
  end ;
  d

let window_and_druid () =
  let w = GWindow.window ~title:"Druid test" () in
  let poll = new answer in
  w#add (make_druid poll GMain.quit)#coerce ;
  w#event#connect#delete 
    (fun _ -> are_you_sure GMain.quit ; true) ;
  w

let _ = 
  let w = window_and_druid () in
  w#show () ;
  GMain.main ()