diff options
Diffstat (limited to 'script.it/script_event')
| -rwxr-xr-x | script.it/script_event/delete.ml | 31 | ||||
| -rwxr-xr-x | script.it/script_event/mouse_down.ml | 84 | ||||
| -rwxr-xr-x | script.it/script_event/out.ml | 25 | 
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 | 
