-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcollide_browser.ml
More file actions
128 lines (108 loc) · 4.35 KB
/
collide_browser.ml
File metadata and controls
128 lines (108 loc) · 4.35 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
open General.Abbr
open Collide
let get_by_id id coerce =
Js.Opt.get (coerce (Dom_html.getElementById id)) (fun () -> Exn.(raise NotFound))
module App = GraphicalApplication.Make(struct
module Cairo = JsOfOCairo
module GraphicalView = struct
let canvas = get_by_id "graphical_view" Dom_html.CoerceTo.canvas
let with_context f =
let context = JsOfOCairo.create canvas in
f ~context
let size () =
(canvas##.width, canvas##.height)
let resize_canvas () =
canvas##.height := Js.Optdef.get Dom_html.window##.innerHeight (fun () -> 320);
canvas##.width := Js.Optdef.get Dom_html.window##.innerWidth (fun () -> 240)
let () = resize_canvas ()
let on_resized f =
Dom_html.window##.onresize := Dom.handler (fun _ ->
resize_canvas ();
f ~dimensions:(size ());
Js._true
)
end
module Timer = struct
let set_recurring ~seconds f =
Dom_html.window##setInterval (Js.wrap_callback f) (seconds *. 1000.)
|> ignore
end
module Toolbar = struct
module Display = struct
let velocity_vectors = get_by_id "display_velocity_vectors" Dom_html.CoerceTo.input
let previous_positions = get_by_id "display_previous_positions" Dom_html.CoerceTo.input
type settings = {
velocity_vectors: bool;
previous_positions: int;
}
let settings () = {
velocity_vectors = velocity_vectors##.checked |> Js.to_bool;
(* @todo Allow user to specify this number *)
previous_positions = if (previous_positions##.checked |> Js.to_bool) then 10 else 0;
}
end
let on_display_settings_changed f = Display.(
let handler = Dom.handler (fun _ ->
let {velocity_vectors; previous_positions} = Display.settings () in
f ~velocity_vectors ~previous_positions;
Js._true
) in
velocity_vectors##.onchange := handler;
previous_positions##.onchange := handler
)
module Randomize = struct
let button = get_by_id "randomize_button" Dom_html.CoerceTo.button
(* @todo Remove values from html file, and initialize them using Application.Defaults *)
let balls = get_by_id "randomize_balls" Dom_html.CoerceTo.input
let max_speed = get_by_id "randomize_max_speed" Dom_html.CoerceTo.input
let min_radius = get_by_id "randomize_min_radius" Dom_html.CoerceTo.input
let max_radius = get_by_id "randomize_max_radius" Dom_html.CoerceTo.input
let min_density = get_by_id "randomize_min_density" Dom_html.CoerceTo.input
let max_density = get_by_id "randomize_max_density" Dom_html.CoerceTo.input
type settings = {
balls: int;
max_speed: float;
min_radius: float;
max_radius: float;
min_density: float;
max_density: float;
}
let settings () =
{
balls = balls##.value |> Js.to_string |> Int.of_string;
max_speed = max_speed##.value |> Js.to_string |> Fl.of_string;
min_radius = min_radius##.value |> Js.to_string |> Fl.of_string;
max_radius = max_radius##.value |> Js.to_string |> Fl.of_string;
min_density = min_density##.value |> Js.to_string |> Fl.of_string;
max_density = max_density##.value |> Js.to_string |> Fl.of_string;
}
end
let on_randomize f = Randomize.(
button##.onclick := Dom.handler (fun _ ->
let {balls; max_speed; min_radius; max_radius; min_density; max_density} = settings () in
f ~balls ~max_speed ~min_radius ~max_radius ~min_density ~max_density;
Js._true
)
)
let _ = Js.Unsafe.eval_string {|
jQuery("#toolbar").modal("show");
jQuery("#graphical_view").on("click", function() {
jQuery("#toolbar").modal("show");
});
jQuery("#show_randomize_dialog_button").on("click", function() {
jQuery("#toolbar").modal("hide");
jQuery("#randomize_dialog").modal("show");
})
|}
end
let initialize_app create =
let dimensions = GraphicalView.size ()
and {Toolbar.Randomize.balls; max_speed; min_radius; max_radius; min_density; max_density} = Toolbar.Randomize.settings ()
and {Toolbar.Display.velocity_vectors; previous_positions} = Toolbar.Display.settings () in
create
~dimensions
~balls ~max_speed
~min_radius ~max_radius
~min_density ~max_density
~velocity_vectors ~previous_positions
end)