mirror of
https://github.com/penpot/penpot.git
synced 2025-10-28 08:57:37 +01:00
♻️ Refactor plugins proxies internal data
This commit is contained in:
parent
b59dae57ca
commit
d6de1fdbdf
7 changed files with 454 additions and 429 deletions
frontend/src/app/plugins
|
|
@ -8,13 +8,11 @@
|
|||
"RPC for plugins runtime."
|
||||
(:require
|
||||
[app.common.data :as d]
|
||||
[app.common.data.macros :as dm]
|
||||
[app.common.files.helpers :as cfh]
|
||||
[app.common.record :as crc]
|
||||
[app.common.spec :as us]
|
||||
[app.common.text :as txt]
|
||||
[app.common.types.shape :as cts]
|
||||
[app.common.uuid :as uuid]
|
||||
[app.main.data.workspace :as udw]
|
||||
[app.main.data.workspace.changes :as dwc]
|
||||
[app.main.data.workspace.selection :as dws]
|
||||
|
|
@ -22,350 +20,353 @@
|
|||
[app.main.data.workspace.shapes :as dwsh]
|
||||
[app.main.store :as st]
|
||||
[app.plugins.grid :as grid]
|
||||
[app.plugins.utils :as utils :refer [get-data get-data-fn get-state]]
|
||||
[app.plugins.utils :as utils :refer [locate-shape proxy->shape array-to-js]]
|
||||
[app.util.object :as obj]))
|
||||
|
||||
(declare data->shape-proxy)
|
||||
(declare shape-proxy)
|
||||
|
||||
(defn- array-to-js
|
||||
[value]
|
||||
(.freeze
|
||||
js/Object
|
||||
(apply array (->> value (map utils/to-js)))))
|
||||
|
||||
(defn- locate-shape
|
||||
[shape-id]
|
||||
(let [page-id (:current-page-id @st/state)]
|
||||
(dm/get-in @st/state [:workspace-data :pages-index page-id :objects shape-id])))
|
||||
|
||||
(deftype ShapeProxy [#_:clj-kondo/ignore _data]
|
||||
(deftype ShapeProxy [$file $page $id]
|
||||
Object
|
||||
(resize
|
||||
[self width height]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (udw/update-dimensions [id] :width width)
|
||||
(udw/update-dimensions [id] :height height))))
|
||||
[_ width height]
|
||||
(st/emit! (udw/update-dimensions [$id] :width width)
|
||||
(udw/update-dimensions [$id] :height height)))
|
||||
|
||||
(clone [self]
|
||||
(let [id (get-data self :id)
|
||||
page-id (:current-page-id @st/state)
|
||||
ret-v (atom nil)]
|
||||
(st/emit! (dws/duplicate-shapes #{id} :change-selection? false :return-ref ret-v))
|
||||
(let [new-id (deref ret-v)
|
||||
shape (dm/get-in @st/state [:workspace-data :pages-index page-id :objects new-id])]
|
||||
(data->shape-proxy shape))))
|
||||
(clone
|
||||
[_]
|
||||
(let [ret-v (atom nil)]
|
||||
(st/emit! (dws/duplicate-shapes #{$id} :change-selection? false :return-ref ret-v))
|
||||
(shape-proxy (deref ret-v))))
|
||||
|
||||
(remove [self]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (dwsh/delete-shapes #{id}))))
|
||||
(remove
|
||||
[_]
|
||||
(st/emit! (dwsh/delete-shapes #{$id})))
|
||||
|
||||
;; Only for frames + groups + booleans
|
||||
(getChildren
|
||||
[self]
|
||||
(apply array (->> (get-state self :shapes)
|
||||
(map locate-shape)
|
||||
(map data->shape-proxy))))
|
||||
[_]
|
||||
(apply array (->> (locate-shape $file $page $id)
|
||||
:shapes
|
||||
(map #(shape-proxy $file $page %)))))
|
||||
|
||||
(appendChild [self child]
|
||||
(let [parent-id (get-data self :id)
|
||||
child-id (uuid/uuid (obj/get child "id"))]
|
||||
(st/emit! (udw/relocate-shapes #{child-id} parent-id 0))))
|
||||
(appendChild
|
||||
[_ child]
|
||||
(let [child-id (obj/get child "$id")]
|
||||
(st/emit! (udw/relocate-shapes #{child-id} $id 0))))
|
||||
|
||||
(insertChild [self index child]
|
||||
(let [parent-id (get-data self :id)
|
||||
child-id (uuid/uuid (obj/get child "id"))]
|
||||
(st/emit! (udw/relocate-shapes #{child-id} parent-id index))))
|
||||
(insertChild
|
||||
[_ index child]
|
||||
(let [child-id (obj/get child "$id")]
|
||||
(st/emit! (udw/relocate-shapes #{child-id} $id index))))
|
||||
|
||||
;; Only for frames
|
||||
(addFlexLayout [self]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (dwsl/create-layout-from-id id :flex :from-frame? true :calculate-params? false))))
|
||||
(addFlexLayout
|
||||
[_]
|
||||
(st/emit! (dwsl/create-layout-from-id $id :flex :from-frame? true :calculate-params? false)))
|
||||
|
||||
(addGridLayout [self]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (dwsl/create-layout-from-id id :grid :from-frame? true :calculate-params? false))
|
||||
(grid/grid-layout-proxy (obj/get self "_data")))))
|
||||
(addGridLayout
|
||||
[_]
|
||||
(st/emit! (dwsl/create-layout-from-id $id :grid :from-frame? true :calculate-params? false))
|
||||
(grid/grid-layout-proxy $file $page $id)))
|
||||
|
||||
(crc/define-properties!
|
||||
ShapeProxy
|
||||
{:name js/Symbol.toStringTag
|
||||
:get (fn [] (str "ShapeProxy"))})
|
||||
|
||||
(defn data->shape-proxy
|
||||
[data]
|
||||
(defn shape-proxy
|
||||
([id]
|
||||
(shape-proxy (:current-file-id @st/state) (:current-page-id @st/state) id))
|
||||
|
||||
(-> (ShapeProxy. data)
|
||||
(crc/add-properties!
|
||||
{:name "_data"
|
||||
:enumerable false}
|
||||
([page-id id]
|
||||
(shape-proxy (:current-file-id @st/state) page-id id))
|
||||
|
||||
{:name "id"
|
||||
:get (get-data-fn :id str)}
|
||||
([file-id page-id id]
|
||||
(assert (uuid? file-id))
|
||||
(assert (uuid? page-id))
|
||||
(assert (uuid? id))
|
||||
|
||||
{:name "type"
|
||||
:get (get-data-fn :type name)}
|
||||
(let [data (locate-shape file-id page-id id)]
|
||||
(-> (ShapeProxy. file-id page-id id)
|
||||
(crc/add-properties!
|
||||
{:name "$id" :enumerable false}
|
||||
{:name "$file" :enumerable false}
|
||||
{:name "$page" :enumerable false}
|
||||
|
||||
{:name "name"
|
||||
:get #(get-state % :name)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :name value)))))}
|
||||
{:name "id"
|
||||
:get #(-> % proxy->shape :id str)}
|
||||
|
||||
{:name "blocked"
|
||||
:get #(get-state % :blocked boolean)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :blocked value)))))}
|
||||
{:name "type"
|
||||
:get #(-> % proxy->shape :type name)}
|
||||
|
||||
{:name "hidden"
|
||||
:get #(get-state % :hidden boolean)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :hidden value)))))}
|
||||
{:name "name"
|
||||
:get #(-> % proxy->shape :name)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :name value)))))}
|
||||
|
||||
{:name "proportionLock"
|
||||
:get #(get-state % :proportion-lock boolean)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :proportion-lock value)))))}
|
||||
{:name "blocked"
|
||||
:get #(-> % proxy->shape :blocked boolean)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :blocked value)))))}
|
||||
|
||||
{:name "constraintsHorizontal"
|
||||
:get #(get-state % :constraints-h d/name)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (keyword value)]
|
||||
(when (contains? cts/horizontal-constraint-types value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :constraints-h value))))))}
|
||||
{:name "hidden"
|
||||
:get #(-> % proxy->shape :hidden boolean)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :hidden value)))))}
|
||||
|
||||
{:name "constraintsVertical"
|
||||
:get #(get-state % :constraints-v d/name)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (keyword value)]
|
||||
(when (contains? cts/vertical-constraint-types value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :constraints-v value))))))}
|
||||
{:name "proportionLock"
|
||||
:get #(-> % proxy->shape :proportion-lock boolean)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :proportion-lock value)))))}
|
||||
|
||||
{:name "borderRadius"
|
||||
:get #(get-state % :rx)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :rx value :ry value))))))}
|
||||
{:name "constraintsHorizontal"
|
||||
:get #(-> % proxy->shape :constraints-h d/name)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (keyword value)]
|
||||
(when (contains? cts/horizontal-constraint-types value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :constraints-h value))))))}
|
||||
|
||||
{:name "borderRadiusTopLeft"
|
||||
:get #(get-state % :r1)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :r1 value))))))}
|
||||
{:name "constraintsVertical"
|
||||
:get #(-> % proxy->shape :constraints-v d/name)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (keyword value)]
|
||||
(when (contains? cts/vertical-constraint-types value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :constraints-v value))))))}
|
||||
|
||||
{:name "borderRadiusTopRight"
|
||||
:get #(get-state % :r2)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :r2 value))))))}
|
||||
{:name "borderRadius"
|
||||
:get #(-> % proxy->shape :rx)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :rx value :ry value))))))}
|
||||
|
||||
{:name "borderRadiusBottomRight"
|
||||
:get #(get-state % :r3)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :r3 value))))))}
|
||||
{:name "borderRadiusTopLeft"
|
||||
:get #(-> % proxy->shape :r1)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :r1 value))))))}
|
||||
|
||||
{:name "borderRadiusBottomLeft"
|
||||
:get #(get-state % :r4)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :r4 value))))))}
|
||||
{:name "borderRadiusTopRight"
|
||||
:get #(-> % proxy->shape :r2)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :r2 value))))))}
|
||||
|
||||
{:name "opacity"
|
||||
:get #(get-state % :opacity)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(when (and (us/safe-number? value) (>= value 0) (<= value 1))
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :opacity value))))))}
|
||||
{:name "borderRadiusBottomRight"
|
||||
:get #(-> % proxy->shape :r3)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :r3 value))))))}
|
||||
|
||||
{:name "blendMode"
|
||||
:get #(get-state % :blend-mode d/name)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (keyword value)]
|
||||
(when (contains? cts/blend-modes value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :blend-mode value))))))}
|
||||
{:name "borderRadiusBottomLeft"
|
||||
:get #(-> % proxy->shape :r4)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(when (us/safe-int? value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :r4 value))))))}
|
||||
|
||||
{:name "shadows"
|
||||
:get #(get-state % :shadow array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :shadows value)))))}
|
||||
{:name "opacity"
|
||||
:get #(-> % proxy->shape :opacity)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(when (and (us/safe-number? value) (>= value 0) (<= value 1))
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :opacity value))))))}
|
||||
|
||||
{:name "blur"
|
||||
:get #(get-state % :blur utils/to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (utils/from-js value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :blur value)))))}
|
||||
{:name "blendMode"
|
||||
:get #(-> % proxy->shape :blend-mode (d/nilv :normal) d/name)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (keyword value)]
|
||||
(when (contains? cts/blend-modes value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :blend-mode value))))))}
|
||||
|
||||
{:name "exports"
|
||||
:get #(get-state % :exports array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :exports value)))))}
|
||||
{:name "shadows"
|
||||
:get #(-> % proxy->shape :shadow array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :shadows value)))))}
|
||||
|
||||
;; Geometry properties
|
||||
{:name "x"
|
||||
:get #(get-state % :x)
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (udw/update-position id {:x value}))))}
|
||||
{:name "blur"
|
||||
:get #(-> % proxy->shape :blur utils/to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (utils/from-js value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :blur value)))))}
|
||||
|
||||
{:name "y"
|
||||
:get #(get-state % :y)
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (udw/update-position id {:y value}))))}
|
||||
{:name "exports"
|
||||
:get #(-> % proxy->shape :exports array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :exports value)))))}
|
||||
|
||||
{:name "parentX"
|
||||
:get (fn [self]
|
||||
(let [page-id (:current-page-id @st/state)
|
||||
parent-id (get-state self :parent-id)
|
||||
parent-x (dm/get-in @st/state [:workspace-data :pages-index page-id :objects parent-id :x])]
|
||||
(- (get-state self :x) parent-x)))
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [page-id (:current-page-id @st/state)
|
||||
id (get-data self :id)
|
||||
parent-id (get-state self :parent-id)
|
||||
parent-x (dm/get-in @st/state [:workspace-data :pages-index page-id :objects parent-id :x])]
|
||||
(st/emit! (udw/update-position id {:x (+ parent-x value)}))))}
|
||||
;; Geometry properties
|
||||
{:name "x"
|
||||
:get #(-> % proxy->shape :x)
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(st/emit! (udw/update-position id {:x value}))))}
|
||||
|
||||
{:name "parentY"
|
||||
:get (fn [self]
|
||||
(let [page-id (:current-page-id @st/state)
|
||||
parent-id (get-state self :parent-id)
|
||||
parent-y (dm/get-in @st/state [:workspace-data :pages-index page-id :objects parent-id :y])]
|
||||
(- (get-state self :y) parent-y)))
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [page-id (:current-page-id @st/state)
|
||||
id (get-data self :id)
|
||||
parent-id (get-state self :parent-id)
|
||||
parent-y (dm/get-in @st/state [:workspace-data :pages-index page-id :objects parent-id :y])]
|
||||
(st/emit! (udw/update-position id {:y (+ parent-y value)}))))}
|
||||
{:name "y"
|
||||
:get #(-> % proxy->shape :y)
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(st/emit! (udw/update-position id {:y value}))))}
|
||||
|
||||
{:name "frameX"
|
||||
:get (fn [self]
|
||||
(let [page-id (:current-page-id @st/state)
|
||||
frame-id (get-state self :frame-id)
|
||||
frame-x (dm/get-in @st/state [:workspace-data :pages-index page-id :objects frame-id :x])]
|
||||
(- (get-state self :x) frame-x)))
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [page-id (:current-page-id @st/state)
|
||||
id (get-data self :id)
|
||||
frame-id (get-state self :frame-id)
|
||||
frame-x (dm/get-in @st/state [:workspace-data :pages-index page-id :objects frame-id :x])]
|
||||
(st/emit! (udw/update-position id {:x (+ frame-x value)}))))}
|
||||
{:name "parentX"
|
||||
:get (fn [self]
|
||||
(let [shape (proxy->shape self)
|
||||
parent-id (:parent-id shape)
|
||||
parent (locate-shape (obj/get self "$file") (obj/get self "$page") parent-id)]
|
||||
(- (:x shape) (:x parent))))
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
parent-id (-> self proxy->shape :parent-id)
|
||||
parent (locate-shape (obj/get self "$file") (obj/get self "$page") parent-id)
|
||||
parent-x (:x parent)]
|
||||
(st/emit! (udw/update-position id {:x (+ parent-x value)}))))}
|
||||
|
||||
{:name "frameY"
|
||||
:get (fn [self]
|
||||
(let [page-id (:current-page-id @st/state)
|
||||
frame-id (get-state self :frame-id)
|
||||
frame-y (dm/get-in @st/state [:workspace-data :pages-index page-id :objects frame-id :y])]
|
||||
(- (get-state self :y) frame-y)))
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [page-id (:current-page-id @st/state)
|
||||
id (get-data self :id)
|
||||
frame-id (get-state self :frame-id)
|
||||
frame-y (dm/get-in @st/state [:workspace-data :pages-index page-id :objects frame-id :y])]
|
||||
(st/emit! (udw/update-position id {:y (+ frame-y value)}))))}
|
||||
{:name "parentY"
|
||||
:get (fn [self]
|
||||
(let [shape (proxy->shape self)
|
||||
parent-id (:parent-id shape)
|
||||
parent (locate-shape (obj/get self "$file") (obj/get self "$page") parent-id)
|
||||
parent-y (:y parent)]
|
||||
(- (:y shape) parent-y)))
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
parent-id (-> self proxy->shape :parent-id)
|
||||
parent (locate-shape (obj/get self "$file") (obj/get self "$page") parent-id)
|
||||
parent-y (:y parent)]
|
||||
(st/emit! (udw/update-position id {:y (+ parent-y value)}))))}
|
||||
|
||||
{:name "width"
|
||||
:get #(get-state % :width)}
|
||||
{:name "frameX"
|
||||
:get (fn [self]
|
||||
(let [shape (proxy->shape self)
|
||||
frame-id (:parent-id shape)
|
||||
frame (locate-shape (obj/get self "$file") (obj/get self "$page") frame-id)
|
||||
frame-x (:x frame)]
|
||||
(- (:x shape) frame-x)))
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
frame-id (-> self proxy->shape :frame-id)
|
||||
frame (locate-shape (obj/get self "$file") (obj/get self "$page") frame-id)
|
||||
frame-x (:x frame)]
|
||||
(st/emit! (udw/update-position id {:x (+ frame-x value)}))))}
|
||||
|
||||
{:name "height"
|
||||
:get #(get-state % :height)}
|
||||
{:name "frameY"
|
||||
:get (fn [self]
|
||||
(let [shape (proxy->shape self)
|
||||
frame-id (:parent-id shape)
|
||||
frame (locate-shape (obj/get self "$file") (obj/get self "$page") frame-id)
|
||||
frame-y (:y frame)]
|
||||
(- (:y shape) frame-y)))
|
||||
:set
|
||||
(fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
frame-id (-> self proxy->shape :frame-id)
|
||||
frame (locate-shape (obj/get self "$file") (obj/get self "$page") frame-id)
|
||||
frame-y (:y frame)]
|
||||
(st/emit! (udw/update-position id {:y (+ frame-y value)}))))}
|
||||
|
||||
{:name "flipX"
|
||||
:get #(get-state % :flip-x)}
|
||||
{:name "width"
|
||||
:get #(-> % proxy->shape :width)}
|
||||
|
||||
{:name "flipY"
|
||||
:get #(get-state % :flip-y)}
|
||||
{:name "height"
|
||||
:get #(-> % proxy->shape :height)}
|
||||
|
||||
;; Strokes and fills
|
||||
{:name "fills"
|
||||
:get #(get-state % :fills array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :fills value)))))}
|
||||
{:name "flipX"
|
||||
:get #(-> % proxy->shape :flip-x)}
|
||||
|
||||
{:name "strokes"
|
||||
:get #(get-state % :strokes array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :strokes value)))))})
|
||||
{:name "flipY"
|
||||
:get #(-> % proxy->shape :flip-y)}
|
||||
|
||||
(cond-> (or (cfh/frame-shape? data) (cfh/group-shape? data) (cfh/svg-raw-shape? data) (cfh/bool-shape? data))
|
||||
(crc/add-properties!
|
||||
{:name "children"
|
||||
:get #(.getChildren ^js %)}))
|
||||
;; Strokes and fills
|
||||
{:name "fills"
|
||||
:get #(-> % proxy->shape :fills array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :fills value)))))}
|
||||
|
||||
(cond-> (not (or (cfh/frame-shape? data) (cfh/group-shape? data) (cfh/svg-raw-shape? data) (cfh/bool-shape? data)))
|
||||
(-> (obj/unset! "appendChild")
|
||||
(obj/unset! "insertChild")
|
||||
(obj/unset! "getChildren")))
|
||||
{:name "strokes"
|
||||
:get #(-> % proxy->shape :strokes array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :strokes value)))))})
|
||||
|
||||
(cond-> (cfh/frame-shape? data)
|
||||
(-> (crc/add-properties!
|
||||
{:name "grid"
|
||||
:get
|
||||
(fn [self]
|
||||
(let [layout (get-state self :layout)]
|
||||
(when (= :grid layout)
|
||||
(grid/grid-layout-proxy data))))}
|
||||
(cond-> (or (cfh/frame-shape? data) (cfh/group-shape? data) (cfh/svg-raw-shape? data) (cfh/bool-shape? data))
|
||||
(crc/add-properties!
|
||||
{:name "children"
|
||||
:enumerable false
|
||||
:get #(.getChildren ^js %)}))
|
||||
|
||||
{:name "guides"
|
||||
:get #(get-state % :grids array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :grids value)))))})
|
||||
(cond-> (not (or (cfh/frame-shape? data) (cfh/group-shape? data) (cfh/svg-raw-shape? data) (cfh/bool-shape? data)))
|
||||
(-> (obj/unset! "appendChild")
|
||||
(obj/unset! "insertChild")
|
||||
(obj/unset! "getChildren")))
|
||||
|
||||
;; TODO: Flex properties
|
||||
#_(crc/add-properties!
|
||||
{:name "flex"
|
||||
:get
|
||||
(fn [self]
|
||||
(let [layout (get-state self :layout)]
|
||||
(when (= :flex layout)
|
||||
(flex-layout-proxy data))))})))
|
||||
(cond-> (cfh/frame-shape? data)
|
||||
(-> (crc/add-properties!
|
||||
{:name "grid"
|
||||
:get
|
||||
(fn [self]
|
||||
(let [layout (-> self proxy->shape :layout)
|
||||
file-id (obj/get self "$file")
|
||||
page-id (obj/get self "$page")
|
||||
id (obj/get self "$id")]
|
||||
(when (= :grid layout)
|
||||
(grid/grid-layout-proxy file-id page-id id))))}
|
||||
|
||||
(cond-> (not (cfh/frame-shape? data))
|
||||
(-> (obj/unset! "addGridLayout")
|
||||
(obj/unset! "addFlexLayout")))
|
||||
{:name "guides"
|
||||
:get #(-> % proxy->shape :grids array-to-js)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (mapv #(utils/from-js %) value)]
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :grids value)))))})
|
||||
|
||||
(cond-> (cfh/text-shape? data)
|
||||
(-> (crc/add-properties!
|
||||
{:name "characters"
|
||||
:get #(get-state % :content txt/content->text)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)]
|
||||
(st/emit! (dwc/update-shapes [id] #(txt/change-text % value)))))})
|
||||
;; TODO: Flex properties
|
||||
#_(crc/add-properties!
|
||||
{:name "flex"
|
||||
:get
|
||||
(fn [self]
|
||||
(let [layout (-> self proxy->shape :layout)]
|
||||
(when (= :flex layout)
|
||||
(flex-layout-proxy (proxy->shape self)))))})))
|
||||
|
||||
(crc/add-properties!
|
||||
{:name "growType"
|
||||
:get #(get-state % :grow-type d/name)
|
||||
:set (fn [self value]
|
||||
(let [id (get-data self :id)
|
||||
value (keyword value)]
|
||||
(when (contains? #{:auto-width :auto-height :fixed} value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :grow-type value))))))})))))
|
||||
(cond-> (not (cfh/frame-shape? data))
|
||||
(-> (obj/unset! "addGridLayout")
|
||||
(obj/unset! "addFlexLayout")))
|
||||
|
||||
(cond-> (cfh/text-shape? data)
|
||||
(-> (crc/add-properties!
|
||||
{:name "characters"
|
||||
:get #(-> % proxy->shape :content txt/content->text)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")]
|
||||
(st/emit! (dwc/update-shapes [id] #(txt/change-text % value)))))})
|
||||
|
||||
(crc/add-properties!
|
||||
{:name "growType"
|
||||
:get #(-> % proxy->shape :grow-type d/name)
|
||||
:set (fn [self value]
|
||||
(let [id (obj/get self "$id")
|
||||
value (keyword value)]
|
||||
(when (contains? #{:auto-width :auto-height :fixed} value)
|
||||
(st/emit! (dwc/update-shapes [id] #(assoc % :grow-type value))))))})))))))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue