aboutsummaryrefslogtreecommitdiff
path: root/script.it/script_event
diff options
context:
space:
mode:
Diffstat (limited to 'script.it/script_event')
-rwxr-xr-xscript.it/script_event/delete.ml31
-rwxr-xr-xscript.it/script_event/mouse_down.ml84
-rwxr-xr-xscript.it/script_event/out.ml25
3 files changed, 137 insertions, 3 deletions
diff --git a/script.it/script_event/delete.ml b/script.it/script_event/delete.ml
new file mode 100755
index 0000000..edd5d23
--- /dev/null
+++ b/script.it/script_event/delete.ml
@@ -0,0 +1,31 @@
+(** Delete the selected element *)
+
+open StdLabels
+module State = Script_state.State
+module Selection = Script_state.Selection
+
+type t = { worker : Brr_webworkers.Worker.t }
+
+(* Click anywhere while in Out mode, we switch in edition *)
+let apply { worker } state =
+ match state.State.mode with
+ | Selection (Path id) ->
+ let paths = List.filter
+ state.State.paths
+ ~f:(fun p ->
+ p.Outline.id != id
+ ) in
+ { state with paths ; mode = Out}
+
+ | Selection (Point (id, point)) ->
+ List.iter
+ state.State.paths
+ ~f:(fun p ->
+ let id' = p.Outline.id in
+ match id' = id with
+ | false -> ()
+ | true -> State.post worker (`DeletePoint (point, p))
+ );
+ { state with mode = Selection (Path id) }
+
+ | _ -> state
diff --git a/script.it/script_event/mouse_down.ml b/script.it/script_event/mouse_down.ml
new file mode 100755
index 0000000..04ea2fd
--- /dev/null
+++ b/script.it/script_event/mouse_down.ml
@@ -0,0 +1,84 @@
+module State = Script_state.State
+module Selection = Script_state.Selection
+
+type t = { position : float * float
+ ; timer : Elements.Timer.t }
+
+let apply { position; timer } state =
+ match state.State.mode with
+
+ | Out ->
+ let x, y = position in
+ Elements.Timer.start timer 0.3;
+
+ let width = state.width
+ and angle = state.angle in
+
+ let stamp = 0. in
+ let point =
+ match Selection.get_from_paths position state.paths with
+ | _, None ->
+ (* Start a new path with the point clicked *)
+ Path.Point.create ~x ~y ~angle ~width ~stamp
+ | _, Some (p, _, _, _) ->
+ (* If the point is close to an existing path, we use the closest
+ point in the path instead *)
+ let x, y = Gg.V2.to_tuple p in
+ Path.Point.create ~x ~y ~angle ~width ~stamp
+ in
+
+ let current = Path.Path_Builder.add_point
+ point
+ state.current in
+ { state with
+ current
+ ; mode = Edit
+ ; mouse_down_position = Gg.V2.of_tuple (x, y)}
+
+ | (Selection (Path id))
+ | (Selection (Point (id, _))) ->
+
+ let get_any () =
+ begin match Selection.get_from_paths position state.paths with
+ | _, None ->
+ { state with
+ mode = Out
+ ; mouse_down_position = Gg.V2.of_tuple position }
+ | dist, Some selection ->
+ let _, outline, _, _ = selection in
+ if outline.Outline.id != id then (
+ let mouse_down_position = Gg.V2.of_tuple position in
+ State.select_segment position selection { state with mouse_down_position } dist
+ ) else
+ (* On the same segment, check for a point *)
+ let selection = Selection.select_point outline (Gg.V2.of_tuple position) in
+ match selection with
+ | Path _ ->
+ { state with
+ mode = Selection selection
+ ; mouse_down_position = Gg.V2.of_tuple position }
+ | Point (_, pt) ->
+ (* In order to handle the point move, start the timer *)
+ Elements.Timer.start timer 0.3;
+ { state with
+ mode = Selection selection
+ ; angle = Path.Point.get_angle pt
+ ; width = Path.Point.get_width pt
+ ; mouse_down_position = Gg.V2.of_tuple position }
+ end
+ in
+ (* First, check for a point in the selected path. If any of them in
+ found, check anything to select in all the elements *)
+ begin match Outline.find state.paths id with
+ | None -> get_any ()
+ | Some outline ->
+ begin match Selection.select_point outline (Gg.V2.of_tuple position) with
+ | Path _ -> get_any ()
+ | other ->
+ Elements.Timer.start timer 0.3;
+ {state with
+ mode = Selection other
+ ; mouse_down_position = Gg.V2.of_tuple position }
+ end
+ end
+ | Edit -> state
diff --git a/script.it/script_event/out.ml b/script.it/script_event/out.ml
index 45f05d3..b8b8599 100755
--- a/script.it/script_event/out.ml
+++ b/script.it/script_event/out.ml
@@ -8,6 +8,25 @@ type t = { point : float * float
; worker : Brr_webworkers.Worker.t
}
+(** Long click, move the selected element if any *)
+let longClick mouse_coord state worker = function
+ | State.Selection t ->
+ let mouse_v2 = Gg.V2.of_tuple mouse_coord in
+ begin match Selection.find_selection t state.State.paths with
+ | None -> state
+ | Some (Point (path, point)) ->
+ let point' = Path.Point.copy point mouse_v2 in
+ State.post worker (`TranslatePoint (point', path));
+ (* Just replace the position of the selected point *)
+ { state with mode = Selection (Point (path.id, point')) }
+ | Some (Path path) ->
+ let delta = Gg.V2.(mouse_v2 - state.State.mouse_down_position) in
+ State.post worker (`TranslatePath (path, delta));
+ state
+ end
+ (* TODO Long click in out mode should translate the slate *)
+ | _ -> state
+
let apply {point; timer ; worker} state =
match state.State.mode with
@@ -61,9 +80,9 @@ let apply {point; timer ; worker} state =
end
end
- | mode when Elements.Timer.delay timer < 0.3 ->
- State.click state mode
+ | _ when Elements.Timer.delay timer < 0.3 ->
+ state
| _ ->
- State.longClick point state worker state.mode
+ longClick point state worker state.mode