aboutsummaryrefslogtreecommitdiff
path: root/script.it/script_event/mouse_down.ml
blob: 88fefb4535f0c1dea99f51fa48409b705ffed434 (plain)
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
module State = Script_state.State
module Selection = Script_state.Selection
module Path = Script_path

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 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 () =
        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
                  } )
      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 ->
        ( 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
            } ) )
  | Edit -> state