aboutsummaryrefslogtreecommitdiff
path: root/script.it/script_event/property.ml
blob: b41d3f840022aef7d58f270c4ff65155b2c02860 (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
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
  | 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


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
      ( 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 } )
  | `Width ->
      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 } )