From 89dbb39c3fcd188ef7acf092061d756046b2c5d4 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Tue, 22 Feb 2022 14:14:04 +0100 Subject: Reformating --- script.it/script_event/click.ml | 106 ++++++++++++-------------- script.it/script_event/export.ml | 34 +++++---- script.it/script_event/mouse_down.ml | 142 ++++++++++++++++++----------------- script.it/script_event/property.ml | 76 +++++++++---------- 4 files changed, 176 insertions(+), 182 deletions(-) (limited to 'script.it/script_event') diff --git a/script.it/script_event/click.ml b/script.it/script_event/click.ml index b7ffcb6..d1fd2e2 100755 --- a/script.it/script_event/click.ml +++ b/script.it/script_event/click.ml @@ -1,12 +1,14 @@ module State = Script_state.State module Selection = Script_state.Selection +module Path = Script_path (** Handle a click outside of the selection *) -type t = { point : float * float - ; timer : Elements.Timer.t - ; worker : Brr_webworkers.Worker.t - } +type t = + { point : float * float + ; timer : Elements.Timer.t + ; worker : Brr_webworkers.Worker.t + } (** The drag function is incorrectly named, as we dont't care if we are selecting an element or not. @@ -14,78 +16,62 @@ type t = { point : float * float But, in the case we are (point, path…), we effectively move the element with the mouse. *) let drag 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 + let mouse_v2 = Gg.V2.of_tuple mouse_coord in + ( 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')) } + 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 + let delta = Gg.V2.(mouse_v2 - state.State.mouse_down_position) in + State.post worker (`TranslatePath (path, delta)); + state ) (* TODO Long click in out mode should translate the whole slate *) | _ -> state -let process {point; timer ; worker} state = - match state.State.mode with +let process { point; timer; worker } state = + match state.State.mode with | Edit -> - let stamp = Elements.Timer.delay timer in - Elements.Timer.stop timer; - begin match Path.Path_Builder.peek2 state.current with + let stamp = Elements.Timer.delay timer in + Elements.Timer.stop timer; + ( match Path.Path_Builder.peek2 state.current with (* If there is at last two points selected, handle this as a curve creation. And we add the new point in the current path *) | Some _ -> + let current = + State.insert_or_replace state point stamp state.current + in + let path = Path.Fixed.to_fixed (module Path.Path_Builder) current in - let current = State.insert_or_replace state point stamp state.current in - let path = Path.Fixed.to_fixed - (module Path.Path_Builder) - current in - - (* Create a copy from the path with all the interior points *) - let back = Path.Fixed.map - path - (fun pt -> Path.Point.copy pt @@ Path.Point.get_coord' pt) in + (* Create a copy from the path with all the interior points *) + let back = + Path.Fixed.map path (fun pt -> + Path.Point.copy pt @@ Path.Point.get_coord' pt ) + in - let last = - Outline.{ path - ; back - ; id = Outline.get_id () - } - in + let last = Outline.{ path; back; id = Outline.get_id () } in - (* Send to the worker for a full review *) - let () = State.post worker (`Complete last) in + (* Send to the worker for a full review *) + let () = State.post worker (`Complete last) in - let state = - { state with - mode = Out - ; paths = last::state.paths - ; current = Path.Path_Builder.empty } in - state - - (* Else, check if there is a curve under the cursor, and remove it *) - | None -> - let current = Path.Path_Builder.empty in - begin match Selection.get_from_paths point state.paths with - | _, None -> + let state = { state with mode = Out - ; current + ; paths = last :: state.paths + ; current = Path.Path_Builder.empty } + in + state + (* Else, check if there is a curve under the cursor, and remove it *) + | None -> + let current = Path.Path_Builder.empty in + ( match Selection.get_from_paths point state.paths with + | _, None -> { state with mode = Out; current } | dist, Some selection -> - State.select_segment point selection { state with current } dist - - end - end - - | _ when Elements.Timer.delay timer < 0.3 -> - state - - | _ -> - drag point state worker state.mode - + State.select_segment point selection { state with current } dist + ) ) + | _ when Elements.Timer.delay timer < 0.3 -> state + | _ -> drag point state worker state.mode diff --git a/script.it/script_event/export.ml b/script.it/script_event/export.ml index 10dd937..db2f89c 100755 --- a/script.it/script_event/export.ml +++ b/script.it/script_event/export.ml @@ -1,30 +1,32 @@ open StdLabels open Brr module State = Script_state.State +module Path = Script_path type t = unit let process () state = let my_host = Uri.host @@ Window.location @@ G.window in - if (Hashtbl.hash my_host) = Blog.Hash_host.expected_host then ( + ( if Hashtbl.hash my_host = Blog.Hash_host.expected_host + then (* Convert the path into an sVG element *) - let svg = Layer.Svg.svg - ~at:Brr.At.[ - v (Jstr.v "xmlns") (Jstr.v "http://www.w3.org/2000/svg") - ; v (Jstr.v "xmlns:xlink") (Jstr.v "http://www.w3.org/1999/xlink") ] - (List.map state.State.paths - ~f:(fun path -> - - Layer.Paths.to_svg - ~color:Blog.Nord.nord0 - (module Path.Fixed) - Outline.(path.path, path.back) - state.State.rendering - - )) in + let svg = + Layer.Svg.svg + ~at: + Brr.At. + [ v (Jstr.v "xmlns") (Jstr.v "http://www.w3.org/2000/svg") + ; v (Jstr.v "xmlns:xlink") (Jstr.v "http://www.w3.org/1999/xlink") + ] + (List.map state.State.paths ~f:(fun path -> + Layer.Paths.to_svg + ~color:Blog.Nord.nord0 + (module Path.Fixed) + Outline.(path.path, path.back) + state.State.rendering ) ) + in let content = El.prop Elements.Prop.outerHTML svg in Elements.Transfert.send ~mime_type:(Jstr.v "image/svg+xml") ~filename:(Jstr.v "out.svg") - content); + content ); state diff --git a/script.it/script_event/mouse_down.ml b/script.it/script_event/mouse_down.ml index 1c25a7d..88fefb4 100755 --- a/script.it/script_event/mouse_down.ml +++ b/script.it/script_event/mouse_down.ml @@ -1,84 +1,90 @@ module State = Script_state.State module Selection = Script_state.Selection +module Path = Script_path -type t = { position : float * float - ; timer : Elements.Timer.t } +type t = + { position : float * float + ; timer : Elements.Timer.t + } let process { 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 x, y = position in + Elements.Timer.start timer 0.3; - 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 width = state.width + and angle = state.angle 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 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 get_any () = - begin match Selection.get_from_paths position state.paths with + 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 () = + match Selection.get_from_paths position state.paths with | _, None -> - { state with - mode = Out - ; mouse_down_position = Gg.V2.of_tuple position } + { 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 + 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 + } ) + in + (* First, check for a point in the selected path. If any of them in + found, check anything to select in all the elements *) + ( 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 -> + ( 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 + { state with + mode = Selection other + ; mouse_down_position = Gg.V2.of_tuple position + } ) ) | Edit -> state diff --git a/script.it/script_event/property.ml b/script.it/script_event/property.ml index dbdc1de..b41d3f8 100755 --- a/script.it/script_event/property.ml +++ b/script.it/script_event/property.ml @@ -1,52 +1,52 @@ module State = Script_state.State module Selection = Script_state.Selection +module Path = Script_path let update_property worker state value f = function | None -> state | Some (Selection.Path outline) -> - (* Change width for the whole path *) - let outline = { outline with - Outline.path = Path.Fixed.map outline.Outline.path (fun p -> - f p value) - } in - State.post worker (`Back outline); - state + (* Change width for the whole path *) + let outline = + { outline with + Outline.path = + Path.Fixed.map outline.Outline.path (fun p -> f p value) + } + in + State.post worker (`Back outline); + state | Some (Point (outline, point)) -> - let path = Path.Fixed.map - outline.path - (fun pt -> - match Path.Point.id pt = Path.Point.id point with - | false -> pt - | true -> f pt value) - in - let outline = {outline with path} in - State.post worker (`Back outline); - state + let path = + Path.Fixed.map outline.path (fun pt -> + match Path.Point.id pt = Path.Point.id point with + | false -> pt + | true -> f pt value ) + in + let outline = { outline with path } in + State.post worker (`Back outline); + state -type t = { prop : [`Angle | `Width ] - ; value : float - ; worker : Brr_webworkers.Worker.t - } -let process { prop; value ; worker } state = +type t = + { prop : [ `Angle | `Width ] + ; value : float + ; worker : Brr_webworkers.Worker.t + } + +let process { prop; value; worker } state = match prop with | `Angle -> - let angle = value in - begin match state.State.mode with - + let angle = value in + ( match state.State.mode with | Selection t -> - let state = { state with angle } in - Selection.find_selection t state.paths - |> update_property worker state angle Path.Point.set_angle - | _ -> { state with angle } - end + let state = { state with angle } in + Selection.find_selection t state.paths + |> update_property worker state angle Path.Point.set_angle + | _ -> { state with angle } ) | `Width -> - let width = value in - begin match state.State.mode with - + let width = value in + ( match state.State.mode with | Selection t -> - let state = { state with width } in - Selection.find_selection t state.paths - |> update_property worker state width Path.Point.set_width - | _ -> { state with width } - end + let state = { state with width } in + Selection.find_selection t state.paths + |> update_property worker state width Path.Point.set_width + | _ -> { state with width } ) -- cgit v1.2.3