Renamed modifiers functions

This commit is contained in:
alonso.torres 2022-11-07 12:25:22 +01:00
parent b5df7bbfc5
commit a2e26210d1
17 changed files with 201 additions and 200 deletions

View file

@ -152,7 +152,7 @@
end-angl (gpt/angle-with-other end-before end-after) end-angl (gpt/angle-with-other end-before end-after)
target-end (if (mth/close? end-angl 180) (- (gpt/length end-before)) (gpt/length end-before)) target-end (if (mth/close? end-angl 180) (- (gpt/length end-before)) (gpt/length end-before))
disp-vector-end (gpt/subtract end-after (gpt/scale (gpt/unit end-after) target-end))] disp-vector-end (gpt/subtract end-after (gpt/scale (gpt/unit end-after) target-end))]
(ctm/move disp-vector-end))) (ctm/move-modifiers disp-vector-end)))
(defmethod constraint-modifier :fixed (defmethod constraint-modifier :fixed
[_ axis child-points-before parent-points-before child-points-after parent-points-after transformed-parent] [_ axis child-points-before parent-points-before child-points-after parent-points-after transformed-parent]
@ -174,9 +174,8 @@
resize-angl (gpt/angle-with-other before-vec after-vec) resize-angl (gpt/angle-with-other before-vec after-vec)
resize-sign (if (mth/close? resize-angl 180) -1 1) resize-sign (if (mth/close? resize-angl 180) -1 1)
scale (* resize-sign (/ (gpt/length after-vec) (gpt/length before-vec))) scale (* resize-sign (/ (gpt/length after-vec) (gpt/length before-vec)))]
] (ctm/resize-modifiers (get-scale axis scale) c0 (:transform transformed-parent) (:transform-inverse transformed-parent))))
(ctm/resize (get-scale axis scale) c0 (:transform transformed-parent) (:transform-inverse transformed-parent))))
(defmethod constraint-modifier :center (defmethod constraint-modifier :center
[_ axis child-points-before parent-points-before child-points-after parent-points-after] [_ axis child-points-before parent-points-before child-points-after parent-points-after]
@ -185,7 +184,7 @@
center-angl (gpt/angle-with-other center-before center-after) center-angl (gpt/angle-with-other center-before center-after)
target-center (if (mth/close? center-angl 180) (- (gpt/length center-before)) (gpt/length center-before)) target-center (if (mth/close? center-angl 180) (- (gpt/length center-before)) (gpt/length center-before))
disp-vector-center (gpt/subtract center-after (gpt/scale (gpt/unit center-after) target-center))] disp-vector-center (gpt/subtract center-after (gpt/scale (gpt/unit center-after) target-center))]
(ctm/move disp-vector-center))) (ctm/move-modifiers disp-vector-center)))
(defmethod constraint-modifier :default [_ _ _ _ _] (defmethod constraint-modifier :default [_ _ _ _ _]
[]) [])
@ -242,10 +241,10 @@
(cond-> modifiers (cond-> modifiers
(not= :scale constraints-h) (not= :scale constraints-h)
(ctm/set-resize (gpt/point scale-x 1) resize-origin transform transform-inverse) (ctm/resize (gpt/point scale-x 1) resize-origin transform transform-inverse)
(not= :scale constraints-v) (not= :scale constraints-v)
(ctm/set-resize (gpt/point 1 scale-y) resize-origin transform transform-inverse)))) (ctm/resize (gpt/point 1 scale-y) resize-origin transform transform-inverse))))
(defn calc-child-modifiers (defn calc-child-modifiers
[parent child modifiers ignore-constraints transformed-parent] [parent child modifiers ignore-constraints transformed-parent]

View file

@ -23,11 +23,11 @@
scale-x (/ (:width child-bb-before) (:width child-bb-after)) scale-x (/ (:width child-bb-before) (:width child-bb-after))
scale-y (/ (:height child-bb-before) (:height child-bb-after)) scale-y (/ (:height child-bb-before) (:height child-bb-after))
resize-origin (-> transformed-parent :points first) ;; TODO LAYOUT: IS always the origin?n resize-origin (-> transformed-parent :points first) ;; TODO LAYOUT: IS always the origin
resize-vector (gpt/point scale-x scale-y)] resize-vector (gpt/point scale-x scale-y)]
(-> modifiers (-> modifiers
(ctm/select-child-modifiers) (ctm/select-child-modifiers)
(ctm/set-resize resize-vector resize-origin transform transform-inverse)))) (ctm/resize resize-vector resize-origin transform transform-inverse))))
(defn calc-fill-width-data (defn calc-fill-width-data
"Calculates the size and modifiers for the width of an auto-fill child" "Calculates the size and modifiers for the width of an auto-fill child"
@ -41,7 +41,7 @@
(let [target-width (max (get-in children-data [(:id child) :child-width]) 0.01) (let [target-width (max (get-in children-data [(:id child) :child-width]) 0.01)
fill-scale (/ target-width child-width)] fill-scale (/ target-width child-width)]
{:width target-width {:width target-width
:modifiers (ctm/resize (gpt/point fill-scale 1) child-origin transform transform-inverse)}) :modifiers (ctm/resize-modifiers (gpt/point fill-scale 1) child-origin transform transform-inverse)})
(ctl/col? parent) (ctl/col? parent)
(let [target-width (max (- line-width (ctl/child-width-margin child)) 0.01) (let [target-width (max (- line-width (ctl/child-width-margin child)) 0.01)
@ -49,7 +49,7 @@
target-width (min max-width target-width) target-width (min max-width target-width)
fill-scale (/ target-width child-width)] fill-scale (/ target-width child-width)]
{:width target-width {:width target-width
:modifiers (ctm/resize (gpt/point fill-scale 1) child-origin transform transform-inverse)}))) :modifiers (ctm/resize-modifiers (gpt/point fill-scale 1) child-origin transform transform-inverse)})))
(defn calc-fill-height-data (defn calc-fill-height-data
"Calculates the size and modifiers for the height of an auto-fill child" "Calculates the size and modifiers for the height of an auto-fill child"
@ -63,7 +63,7 @@
(let [target-height (max (get-in children-data [(:id child) :child-height]) 0.01) (let [target-height (max (get-in children-data [(:id child) :child-height]) 0.01)
fill-scale (/ target-height child-height)] fill-scale (/ target-height child-height)]
{:height target-height {:height target-height
:modifiers (ctm/resize (gpt/point 1 fill-scale) child-origin transform transform-inverse)}) :modifiers (ctm/resize-modifiers (gpt/point 1 fill-scale) child-origin transform transform-inverse)})
(ctl/row? parent) (ctl/row? parent)
(let [target-height (max (- line-height (ctl/child-height-margin child)) 0.01) (let [target-height (max (- line-height (ctl/child-height-margin child)) 0.01)
@ -71,7 +71,7 @@
target-height (min max-height target-height) target-height (min max-height target-height)
fill-scale (/ target-height child-height)] fill-scale (/ target-height child-height)]
{:height target-height {:height target-height
:modifiers (ctm/resize (gpt/point 1 fill-scale) child-origin transform transform-inverse)}))) :modifiers (ctm/resize-modifiers (gpt/point 1 fill-scale) child-origin transform transform-inverse)})))
(defn layout-child-modifiers (defn layout-child-modifiers
"Calculates the modifiers for the layout" "Calculates the modifiers for the layout"
@ -93,9 +93,9 @@
move-vec (gpt/to-vec child-origin corner-p) move-vec (gpt/to-vec child-origin corner-p)
modifiers modifiers
(-> (ctm/empty-modifiers) (-> (ctm/empty)
(cond-> fill-width (ctm/add-modifiers (:modifiers fill-width))) (cond-> fill-width (ctm/add-modifiers (:modifiers fill-width)))
(cond-> fill-height (ctm/add-modifiers (:modifiers fill-height))) (cond-> fill-height (ctm/add-modifiers (:modifiers fill-height)))
(ctm/set-move move-vec))] (ctm/move move-vec))]
[modifiers layout-line])) [modifiers layout-line]))

View file

@ -98,7 +98,7 @@
(let [child-modifiers (gct/calc-child-modifiers parent child modifiers ignore-constraints transformed-parent) (let [child-modifiers (gct/calc-child-modifiers parent child modifiers ignore-constraints transformed-parent)
child-modifiers (cond-> child-modifiers snap-pixel? (gpp/set-pixel-precision child))] child-modifiers (cond-> child-modifiers snap-pixel? (gpp/set-pixel-precision child))]
(cond-> modif-tree (cond-> modif-tree
(not (ctm/empty-modifiers? child-modifiers)) (not (ctm/empty? child-modifiers))
(update-in [(:id child) :modifiers] ctm/add-modifiers child-modifiers))))] (update-in [(:id child) :modifiers] ctm/add-modifiers child-modifiers))))]
(reduce set-child modif-tree children))) (reduce set-child modif-tree children)))
@ -111,7 +111,7 @@
(ctm/select-child-geometry-modifiers) (ctm/select-child-geometry-modifiers)
(gcl/normalize-child-modifiers parent child transformed-parent))] (gcl/normalize-child-modifiers parent child transformed-parent))]
(cond-> modif-tree (cond-> modif-tree
(not (ctm/empty-modifiers? child-modifiers)) (not (ctm/empty? child-modifiers))
(update-in [(:id child) :modifiers] ctm/add-modifiers child-modifiers))))] (update-in [(:id child) :modifiers] ctm/add-modifiers child-modifiers))))]
(let [children (map (d/getf objects) (:shapes transformed-parent))] (let [children (map (d/getf objects) (:shapes transformed-parent))]
(reduce process-child modif-tree children)))) (reduce process-child modif-tree children))))
@ -178,14 +178,14 @@
(let [origin (-> parent :points first) (let [origin (-> parent :points first)
scale-width (/ auto-width (-> parent :selrect :width) )] scale-width (/ auto-width (-> parent :selrect :width) )]
(-> modifiers (-> modifiers
(ctm/set-resize-parent (gpt/point scale-width 1) origin (:transform parent) (:transform-inverse parent))))) (ctm/resize-parent (gpt/point scale-width 1) origin (:transform parent) (:transform-inverse parent)))))
(set-parent-auto-height (set-parent-auto-height
[modifiers parent auto-height] [modifiers parent auto-height]
(let [origin (-> parent :points first) (let [origin (-> parent :points first)
scale-height (/ auto-height (-> parent :selrect :height) )] scale-height (/ auto-height (-> parent :selrect :height) )]
(-> modifiers (-> modifiers
(ctm/set-resize-parent (gpt/point 1 scale-height) origin (:transform parent) (:transform-inverse parent)))))] (ctm/resize-parent (gpt/point 1 scale-height) origin (:transform parent) (:transform-inverse parent)))))]
(let [modifiers (get-in modif-tree [(:id parent) :modifiers]) (let [modifiers (get-in modif-tree [(:id parent) :modifiers])
children (->> parent children (->> parent

View file

@ -32,7 +32,7 @@
ratio-height (/ target-height curr-height) ratio-height (/ target-height curr-height)
scalev (gpt/point ratio-width ratio-height)] scalev (gpt/point ratio-width ratio-height)]
(-> modifiers (-> modifiers
(ctm/set-resize scalev origin transform transform-inverse)))) (ctm/resize scalev origin transform transform-inverse))))
(defn position-pixel-precision (defn position-pixel-precision
[modifiers shape] [modifiers shape]
@ -42,7 +42,7 @@
target-corner (gpt/round corner) target-corner (gpt/round corner)
deltav (gpt/to-vec corner target-corner)] deltav (gpt/to-vec corner target-corner)]
(-> modifiers (-> modifiers
(ctm/set-move deltav)))) (ctm/move deltav))))
(defn set-pixel-precision (defn set-pixel-precision
"Adjust modifiers so they adjust to the pixel grid" "Adjust modifiers so they adjust to the pixel grid"

View file

@ -403,7 +403,7 @@
([shape modifiers] ([shape modifiers]
(cond-> shape (cond-> shape
(and (some? modifiers) (not (ctm/empty-modifiers? modifiers))) (and (some? modifiers) (not (ctm/empty? modifiers)))
(apply-modifiers modifiers)))) (apply-modifiers modifiers))))
(defn transform-bounds (defn transform-bounds

View file

@ -5,6 +5,7 @@
;; Copyright (c) UXBOX Labs SL ;; Copyright (c) UXBOX Labs SL
(ns app.common.types.modifiers (ns app.common.types.modifiers
(:refer-clojure :exclude [empty empty?])
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.common.geom.matrix :as gmt] [app.common.geom.matrix :as gmt]
@ -13,7 +14,9 @@
[app.common.math :as mth] [app.common.math :as mth]
[app.common.pages.helpers :as cph] [app.common.pages.helpers :as cph]
[app.common.spec :as us] [app.common.spec :as us]
[app.common.text :as txt])) [app.common.text :as txt]
#?(:cljs [cljs.core :as c]
:clj [clojure.core :as c])))
;; --- Modifiers ;; --- Modifiers
@ -39,7 +42,7 @@
;; Public builder API ;; Public builder API
(defn empty-modifiers [] (defn empty []
{}) {})
(defn move-vec? [vector] (defn move-vec? [vector]
@ -50,16 +53,16 @@
(or (not (mth/almost-zero? (- (:x vector) 1))) (or (not (mth/almost-zero? (- (:x vector) 1)))
(not (mth/almost-zero? (- (:y vector) 1))))) (not (mth/almost-zero? (- (:y vector) 1)))))
(defn set-move-parent (defn move-parent
([modifiers x y] ([modifiers x y]
(set-move-parent modifiers (gpt/point x y))) (move-parent modifiers (gpt/point x y)))
([modifiers vector] ([modifiers vector]
(cond-> modifiers (cond-> modifiers
(move-vec? vector) (move-vec? vector)
(update :geometry-parent conjv {:type :move :vector vector})))) (update :geometry-parent conjv {:type :move :vector vector}))))
(defn set-resize-parent (defn resize-parent
([modifiers vector origin] ([modifiers vector origin]
(cond-> modifiers (cond-> modifiers
(resize-vec? vector) (resize-vec? vector)
@ -75,16 +78,16 @@
:origin origin :origin origin
:transform transform :transform transform
:transform-inverse transform-inverse})))) :transform-inverse transform-inverse}))))
(defn set-move (defn move
([modifiers x y] ([modifiers x y]
(set-move modifiers (gpt/point x y))) (move modifiers (gpt/point x y)))
([modifiers vector] ([modifiers vector]
(cond-> modifiers (cond-> modifiers
(move-vec? vector) (move-vec? vector)
(update :geometry-child conjv {:type :move :vector vector})))) (update :geometry-child conjv {:type :move :vector vector}))))
(defn set-resize (defn resize
([modifiers vector origin] ([modifiers vector origin]
(cond-> modifiers (cond-> modifiers
(resize-vec? vector) (resize-vec? vector)
@ -101,7 +104,7 @@
:transform transform :transform transform
:transform-inverse transform-inverse})))) :transform-inverse transform-inverse}))))
(defn set-rotation (defn rotation
[modifiers center angle] [modifiers center angle]
(cond-> modifiers (cond-> modifiers
(not (mth/close? angle 0)) (not (mth/close? angle 0))
@ -111,14 +114,14 @@
:center center :center center
:rotation angle})))) :rotation angle}))))
(defn set-remove-children (defn remove-children
[modifiers shapes] [modifiers shapes]
(cond-> modifiers (cond-> modifiers
(d/not-empty? shapes) (d/not-empty? shapes)
(update :structure-parent conjv {:type :remove-children (update :structure-parent conjv {:type :remove-children
:value shapes}))) :value shapes})))
(defn set-add-children (defn add-children
[modifiers shapes index] [modifiers shapes index]
(cond-> modifiers (cond-> modifiers
(d/not-empty? shapes) (d/not-empty? shapes)
@ -126,17 +129,17 @@
:value shapes :value shapes
:index index}))) :index index})))
(defn set-reflow (defn reflow
[modifiers] [modifiers]
(-> modifiers (-> modifiers
(update :structure-parent conjv {:type :reflow}))) (update :structure-parent conjv {:type :reflow})))
(defn set-scale-content (defn scale-content
[modifiers value] [modifiers value]
(-> modifiers (-> modifiers
(update :structure-child conjv {:type :scale-content :value value}))) (update :structure-child conjv {:type :scale-content :value value})))
(defn set-change-property (defn change-property
[modifiers property value] [modifiers property value]
(-> modifiers (-> modifiers
(update :structure-child conjv {:type :change-property (update :structure-child conjv {:type :change-property
@ -162,94 +165,66 @@
;; These are convenience methods to create single operation modifiers without the builder ;; These are convenience methods to create single operation modifiers without the builder
(defn move (defn move-modifiers
([x y] ([x y]
(set-move (empty-modifiers) (gpt/point x y))) (move (empty) (gpt/point x y)))
([vector] ([vector]
(set-move (empty-modifiers) vector))) (move (empty) vector)))
(defn move-parent (defn move-parent-modifiers
([x y] ([x y]
(set-move-parent (empty-modifiers) (gpt/point x y))) (move-parent (empty) (gpt/point x y)))
([vector] ([vector]
(set-move-parent (empty-modifiers) vector))) (move-parent (empty) vector)))
(defn resize (defn resize-modifiers
([vector origin] ([vector origin]
(set-resize (empty-modifiers) vector origin)) (resize (empty) vector origin))
([vector origin transform transform-inverse] ([vector origin transform transform-inverse]
(set-resize (empty-modifiers) vector origin transform transform-inverse))) (resize (empty) vector origin transform transform-inverse)))
(defn resize-parent (defn resize-parent-modifiers
([vector origin] ([vector origin]
(set-resize-parent (empty-modifiers) vector origin)) (resize-parent (empty) vector origin))
([vector origin transform transform-inverse] ([vector origin transform transform-inverse]
(set-resize-parent (empty-modifiers) vector origin transform transform-inverse))) (resize-parent (empty) vector origin transform transform-inverse)))
(defn rotation (defn rotation-modifiers
[shape center angle] [shape center angle]
(let [shape-center (gco/center-shape shape) (let [shape-center (gco/center-shape shape)
rotation (-> (gmt/matrix) rotation (-> (gmt/matrix)
(gmt/rotate angle center) (gmt/rotate angle center)
(gmt/rotate (- angle) shape-center))] (gmt/rotate (- angle) shape-center))]
(-> (empty-modifiers) (-> (empty)
(set-rotation shape-center angle) (rotation shape-center angle)
(set-move (gpt/transform (gpt/point 0 0) rotation))))) (move (gpt/transform (gpt/point 0 0) rotation)))))
(defn remove-children (defn remove-children-modifiers
[shapes] [shapes]
(-> (empty-modifiers) (-> (empty)
(set-remove-children shapes))) (remove-children shapes)))
(defn add-children (defn add-children-modifiers
[shapes index] [shapes index]
(-> (empty-modifiers) (-> (empty)
(set-add-children shapes index))) (add-children shapes index)))
(defn reflow (defn reflow-modifiers
[] []
(-> (empty-modifiers) (-> (empty)
(set-reflow))) (reflow)))
(defn scale-content (defn scale-content-modifiers
[value] [value]
(-> (empty-modifiers) (-> (empty)
(set-scale-content value))) (scale-content value)))
(defn child-modifiers? (defn change-dimensions-modifiers
[{:keys [geometry-child structure-child]}]
(or (d/not-empty? geometry-child)
(d/not-empty? structure-child)))
(defn select-child-modifiers
[modifiers]
(select-keys modifiers [:geometry-child :structure-child]))
(defn select-child-geometry-modifiers
[modifiers]
(select-keys modifiers [:geometry-child]))
(defn select-parent-modifiers
[modifiers]
(select-keys modifiers [:geometry-parent :structure-parent]))
(defn select-structure
[modifiers]
(select-keys modifiers [:structure-parent]))
(defn empty-modifiers?
[modifiers]
(and (empty? (:geometry-child modifiers))
(empty? (:geometry-parent modifiers))
(empty? (:structure-parent modifiers))
(empty? (:structure-child modifiers))))
(defn change-dimensions
[shape attr value] [shape attr value]
(us/assert map? shape) (us/assert map? shape)
(us/assert #{:width :height} attr) (us/assert #{:width :height} attr)
@ -281,7 +256,7 @@
scalev (gpt/divide (gpt/point width height) scalev (gpt/divide (gpt/point width height)
(gpt/point sr-width sr-height))] (gpt/point sr-width sr-height))]
(resize scalev origin shape-transform shape-transform-inv))) (resize-modifiers scalev origin shape-transform shape-transform-inv)))
(defn change-orientation-modifiers (defn change-orientation-modifiers
[shape orientation] [shape orientation]
@ -304,28 +279,56 @@
scalev (gpt/divide (gpt/point new-width new-height) scalev (gpt/divide (gpt/point new-width new-height)
(gpt/point sr-width sr-height))] (gpt/point sr-width sr-height))]
(resize scalev origin shape-transform shape-transform-inv))) (resize-modifiers scalev origin shape-transform shape-transform-inv)))
(defn merge-modifiers ;; Predicates
[objects modifiers]
(let [set-modifier (defn empty?
(fn [objects [id modifiers]] [modifiers]
(-> objects (and (c/empty? (:geometry-child modifiers))
(d/update-when id merge modifiers)))] (c/empty? (:geometry-parent modifiers))
(->> modifiers (c/empty? (:structure-parent modifiers))
(reduce set-modifier objects)))) (c/empty? (:structure-child modifiers))))
(defn child-modifiers?
[{:keys [geometry-child structure-child]}]
(or (d/not-empty? geometry-child)
(d/not-empty? structure-child)))
(defn only-move? (defn only-move?
"Returns true if there are only move operations"
[modifier] [modifier]
(or (and (= 1 (-> modifier :geometry-child count)) (or (and (= 1 (-> modifier :geometry-child count))
(= :move (-> modifier :geometry-child first :type))) (= :move (-> modifier :geometry-child first :type)))
(and (= 1 (-> modifier :geometry-parent count)) (and (= 1 (-> modifier :geometry-parent count))
(= :move (-> modifier :geometry-parent first :type))))) (= :move (-> modifier :geometry-parent first :type)))))
(defn get-frame-add-children (defn has-geometry?
[modif-tree] [{:keys [geometry-parent geometry-child]}]
(or (d/not-empty? geometry-parent)
(d/not-empty? geometry-child)))
;; Extract subsets of modifiers
(defn select-child-modifiers
[modifiers]
(select-keys modifiers [:geometry-child :structure-child]))
(defn select-child-geometry-modifiers
[modifiers]
(select-keys modifiers [:geometry-child]))
(defn select-parent-modifiers
[modifiers]
(select-keys modifiers [:geometry-parent :structure-parent]))
(defn select-structure
[modifiers]
(select-keys modifiers [:structure-parent]))
(defn added-children-frames
"Returns the frames that have an 'add-children' operation"
[modif-tree]
(let [structure-changes (let [structure-changes
(into {} (into {}
(comp (filter (fn [[_ val]] (-> val :modifiers :structure-parent some?))) (comp (filter (fn [[_ val]] (-> val :modifiers :structure-parent some?)))
@ -340,7 +343,10 @@
(->> value (map (fn [id] {:frame frame-id :shape id})))))))) (->> value (map (fn [id] {:frame frame-id :shape id}))))))))
structure-changes))) structure-changes)))
;; Main transformation functions
(defn modifiers->transform (defn modifiers->transform
"Given a set of modifiers returns its transformation matrix"
[modifiers] [modifiers]
(letfn [(apply-modifier [matrix {:keys [type vector rotation center origin transform transform-inverse] :as modifier}] (letfn [(apply-modifier [matrix {:keys [type vector rotation center origin transform transform-inverse] :as modifier}]
(case type (case type
@ -360,7 +366,6 @@
matrix) matrix)
:rotation :rotation
;; TODO LAYOUT: Maybe an issue when no center data
(gmt/multiply (gmt/multiply
(-> (gmt/matrix) (-> (gmt/matrix)
(gmt/translate center) (gmt/translate center)
@ -373,63 +378,60 @@
(->> modifiers (->> modifiers
(reduce apply-modifier (gmt/matrix)))))) (reduce apply-modifier (gmt/matrix))))))
(defn scale-text-content
[content value]
(->> content
(txt/transform-nodes
txt/is-text-node?
(fn [attrs]
(let [font-size (-> (get attrs :font-size 14)
(d/parse-double)
(* value)
(str)) ]
(d/txt-merge attrs {:font-size font-size}))))))
(defn apply-scale-content
[shape value]
(cond-> shape
(cph/text-shape? shape)
(update :content scale-text-content value)))
(defn apply-structure-modifiers (defn apply-structure-modifiers
"Apply structure changes to a shape"
[shape modifiers] [shape modifiers]
(let [remove-children (letfn [(scale-text-content
(fn [shapes children-to-remove] [content value]
(let [remove? (set children-to-remove)]
(d/removev remove? shapes)))
apply-modifier (->> content
(fn [shape {:keys [type property value index rotation]}] (txt/transform-nodes
(cond-> shape txt/is-text-node?
(= type :rotation) (fn [attrs]
(update :rotation #(mod (+ % rotation) 360)) (let [font-size (-> (get attrs :font-size 14)
(d/parse-double)
(* value)
(str)) ]
(d/txt-merge attrs {:font-size font-size}))))))
(and (= type :add-children) (some? index)) (apply-scale-content
(update :shapes [shape value]
(fn [shapes]
(if (vector? shapes)
(cph/insert-at-index shapes index value)
(d/concat-vec shapes value))))
(and (= type :add-children) (nil? index)) (cond-> shape
(update :shapes d/concat-vec value) (cph/text-shape? shape)
(update :content scale-text-content value)))]
(let [remove-children
(fn [shapes children-to-remove]
(let [remove? (set children-to-remove)]
(d/removev remove? shapes)))
(= type :remove-children) apply-modifier
(update :shapes remove-children value) (fn [shape {:keys [type property value index rotation]}]
(cond-> shape
(= type :rotation)
(update :rotation #(mod (+ % rotation) 360))
(= type :scale-content) (and (= type :add-children) (some? index))
(apply-scale-content value) (update :shapes
(fn [shapes]
(if (vector? shapes)
(cph/insert-at-index shapes index value)
(d/concat-vec shapes value))))
(= type :change-property) (and (= type :add-children) (nil? index))
(assoc property value)))] (update :shapes d/concat-vec value)
(= type :remove-children)
(update :shapes remove-children value)
(= type :scale-content)
(apply-scale-content value)
(= type :change-property)
(assoc property value)))]
(as-> shape $
(reduce apply-modifier $ (:structure-parent modifiers))
(reduce apply-modifier $ (:structure-child modifiers))))))
(as-> shape $
(reduce apply-modifier $ (:structure-parent modifiers))
(reduce apply-modifier $ (:structure-child modifiers)))))
(defn has-geometry?
[{:keys [geometry-parent geometry-child]}]
(or (d/not-empty? geometry-parent)
(d/not-empty? geometry-child)))

View file

@ -60,7 +60,7 @@
(t/testing "Transform shape with translation modifiers" (t/testing "Transform shape with translation modifiers"
(t/are [type] (t/are [type]
(let [modifiers (ctm/move (gpt/point 10 -10))] (let [modifiers (ctm/move-modifiers (gpt/point 10 -10))]
(let [shape-before (create-test-shape type {:modifiers modifiers}) (let [shape-before (create-test-shape type {:modifiers modifiers})
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(t/is (not= shape-before shape-after)) (t/is (not= shape-before shape-after))
@ -92,7 +92,7 @@
(t/testing "Transform shape with resize modifiers" (t/testing "Transform shape with resize modifiers"
(t/are [type] (t/are [type]
(let [modifiers (ctm/resize (gpt/point 2 2) (gpt/point 0 0)) (let [modifiers (ctm/resize-modifiers (gpt/point 2 2) (gpt/point 0 0))
shape-before (create-test-shape type {:modifiers modifiers}) shape-before (create-test-shape type {:modifiers modifiers})
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(t/is (not= shape-before shape-after)) (t/is (not= shape-before shape-after))
@ -112,7 +112,7 @@
(t/testing "Transform with empty resize" (t/testing "Transform with empty resize"
(t/are [type] (t/are [type]
(let [modifiers (ctm/resize (gpt/point 1 1) (gpt/point 0 0)) (let [modifiers (ctm/resize-modifiers (gpt/point 1 1) (gpt/point 0 0))
shape-before (create-test-shape type {:modifiers modifiers}) shape-before (create-test-shape type {:modifiers modifiers})
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(t/are [prop] (t/are [prop]
@ -123,7 +123,7 @@
(t/testing "Transform with resize=0" (t/testing "Transform with resize=0"
(t/are [type] (t/are [type]
(let [modifiers (ctm/resize (gpt/point 0 0) (gpt/point 0 0)) (let [modifiers (ctm/resize-modifiers (gpt/point 0 0) (gpt/point 0 0))
shape-before (create-test-shape type {:modifiers modifiers}) shape-before (create-test-shape type {:modifiers modifiers})
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
(t/is (> (get-in shape-before [:selrect :width]) (t/is (> (get-in shape-before [:selrect :width])
@ -138,7 +138,7 @@
(t/testing "Transform shape with rotation modifiers" (t/testing "Transform shape with rotation modifiers"
(t/are [type] (t/are [type]
(let [shape-before (create-test-shape type) (let [shape-before (create-test-shape type)
modifiers (ctm/rotation shape-before (gsh/center-shape shape-before) 30 ) modifiers (ctm/rotation-modifiers shape-before (gsh/center-shape shape-before) 30 )
shape-before (assoc shape-before :modifiers modifiers) shape-before (assoc shape-before :modifiers modifiers)
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]
@ -160,7 +160,7 @@
(t/testing "Transform shape with rotation = 0 should leave equal selrect" (t/testing "Transform shape with rotation = 0 should leave equal selrect"
(t/are [type] (t/are [type]
(let [shape-before (create-test-shape type) (let [shape-before (create-test-shape type)
modifiers (ctm/rotation shape-before (gsh/center-shape shape-before) 0) modifiers (ctm/rotation-modifiers shape-before (gsh/center-shape shape-before) 0)
shape-after (gsh/transform-shape (assoc shape-before :modifiers modifiers))] shape-after (gsh/transform-shape (assoc shape-before :modifiers modifiers))]
(t/are [prop] (t/are [prop]
(t/is (close? (get-in shape-before [:selrect prop]) (t/is (close? (get-in shape-before [:selrect prop])
@ -170,7 +170,7 @@
(t/testing "Transform shape with invalid selrect fails gracefully" (t/testing "Transform shape with invalid selrect fails gracefully"
(t/are [type selrect] (t/are [type selrect]
(let [modifiers (ctm/move 0 0) (let [modifiers (ctm/move-modifiers 0 0)
shape-before (-> (create-test-shape type {:modifiers modifiers}) shape-before (-> (create-test-shape type {:modifiers modifiers})
(assoc :selrect selrect)) (assoc :selrect selrect))
shape-after (gsh/transform-shape shape-before)] shape-after (gsh/transform-shape shape-before)]

View file

@ -47,9 +47,9 @@
(-> shape (-> shape
(assoc :click-draw? false) (assoc :click-draw? false)
(gsh/transform-shape (-> (ctm/empty-modifiers) (gsh/transform-shape (-> (ctm/empty)
(ctm/set-resize scalev (gpt/point x y)) (ctm/resize scalev (gpt/point x y))
(ctm/set-move movev)))))) (ctm/move movev))))))
(defn update-drawing [state initial point lock?] (defn update-drawing [state initial point lock?]
(update-in state [:workspace-drawing :object] resize-shape initial point lock?)) (update-in state [:workspace-drawing :object] resize-shape initial point lock?))

View file

@ -51,7 +51,7 @@
(and click-draw? (not text?)) (and click-draw? (not text?))
(-> (assoc :width min-side :height min-side) (-> (assoc :width min-side :height min-side)
(gsh/transform-shape (ctm/move (- (/ min-side 2)) (- (/ min-side 2))))) (gsh/transform-shape (ctm/move-modifiers (- (/ min-side 2)) (- (/ min-side 2)))))
(and click-draw? text?) (and click-draw? text?)
(assoc :height 17 :width 4 :grow-type :auto-width) (assoc :height 17 :width 4 :grow-type :auto-width)

View file

@ -159,11 +159,11 @@
(filterv #(contains? child-set %)))] (filterv #(contains? child-set %)))]
(cond-> modif-tree (cond-> modif-tree
(not= original-frame target-frame) (not= original-frame target-frame)
(-> (update-in [original-frame :modifiers] ctm/set-remove-children shapes) (-> (update-in [original-frame :modifiers] ctm/remove-children shapes)
(update-in [target-frame :modifiers] ctm/set-add-children shapes drop-index)) (update-in [target-frame :modifiers] ctm/add-children shapes drop-index))
(and layout? (= original-frame target-frame)) (and layout? (= original-frame target-frame))
(update-in [target-frame :modifiers] ctm/set-add-children shapes drop-index))))] (update-in [target-frame :modifiers] ctm/add-children shapes drop-index))))]
(reduce update-frame-modifiers modif-tree origin-frame-ids))) (reduce update-frame-modifiers modif-tree origin-frame-ids)))
@ -214,7 +214,7 @@
get-modifier get-modifier
(fn [shape] (fn [shape]
(ctm/rotation shape center angle)) (ctm/rotation-modifiers shape center angle))
modif-tree modif-tree
(-> (build-modif-tree ids objects get-modifier) (-> (build-modif-tree ids objects get-modifier)

View file

@ -52,7 +52,7 @@
(let [objects (wsh/lookup-page-objects state) (let [objects (wsh/lookup-page-objects state)
ids (->> ids (filter (partial ctl/layout? objects)))] ids (->> ids (filter (partial ctl/layout? objects)))]
(if (d/not-empty? ids) (if (d/not-empty? ids)
(let [modif-tree (dwm/create-modif-tree ids (ctm/reflow))] (let [modif-tree (dwm/create-modif-tree ids (ctm/reflow-modifiers))]
(rx/of (dwm/set-modifiers modif-tree) (rx/of (dwm/set-modifiers modif-tree)
(dwm/apply-modifiers))) (dwm/apply-modifiers)))
(rx/empty)))))) (rx/empty))))))

View file

@ -322,11 +322,11 @@
{shape-width :width shape-height :height} selrect] {shape-width :width shape-height :height} selrect]
(cond-> shape (cond-> shape
(and (not-changed? shape-width new-width) (= grow-type :auto-width)) (and (not-changed? shape-width new-width) (= grow-type :auto-width))
(gsh/transform-shape (ctm/change-dimensions shape :width new-width)) (gsh/transform-shape (ctm/change-dimensions-modifiers shape :width new-width))
(and (not-changed? shape-height new-height) (and (not-changed? shape-height new-height)
(or (= grow-type :auto-height) (= grow-type :auto-width))) (or (= grow-type :auto-height) (= grow-type :auto-width)))
(gsh/transform-shape (ctm/change-dimensions shape :height new-height)))))] (gsh/transform-shape (ctm/change-dimensions-modifiers shape :height new-height)))))]
(rx/of (dch/update-shapes [id] update-fn {:reg-objects? true :save-undo? false})))))) (rx/of (dch/update-shapes [id] update-fn {:reg-objects? true :save-undo? false}))))))
@ -346,10 +346,10 @@
(let [new-shape (let [new-shape
(cond-> shape (cond-> shape
(some? width) (some? width)
(gsh/transform-shape (ctm/change-dimensions shape :width width)) (gsh/transform-shape (ctm/change-dimensions-modifiers shape :width width))
(some? height) (some? height)
(gsh/transform-shape (ctm/change-dimensions shape :height height)) (gsh/transform-shape (ctm/change-dimensions-modifiers shape :height height))
(some? position-data) (some? position-data)
(assoc :position-data position-data)) (assoc :position-data position-data))

View file

@ -185,19 +185,19 @@
(and layout-child? fill-height?))) (and layout-child? fill-height?)))
modifiers modifiers
(-> (ctm/empty-modifiers) (-> (ctm/empty)
(cond-> displacement (cond-> displacement
(ctm/set-move displacement)) (ctm/move displacement))
(ctm/set-resize scalev resize-origin shape-transform shape-transform-inverse) (ctm/resize scalev resize-origin shape-transform shape-transform-inverse)
(cond-> set-fix-width? (cond-> set-fix-width?
(ctm/set-change-property :layout-item-h-sizing :fix)) (ctm/change-property :layout-item-h-sizing :fix))
(cond-> set-fix-height? (cond-> set-fix-height?
(ctm/set-change-property :layout-item-v-sizing :fix)) (ctm/change-property :layout-item-v-sizing :fix))
(cond-> scale-text (cond-> scale-text
(ctm/set-scale-content (:x scalev)))) (ctm/scale-content (:x scalev))))
modif-tree (dwm/create-modif-tree ids modifiers)] modif-tree (dwm/create-modif-tree ids modifiers)]
(rx/of (dwm/set-modifiers modif-tree)))) (rx/of (dwm/set-modifiers modif-tree))))
@ -251,7 +251,7 @@
snap-pixel? (and (contains? (:workspace-layout state) :snap-pixel-grid) snap-pixel? (and (contains? (:workspace-layout state) :snap-pixel-grid)
(int? value)) (int? value))
get-modifier get-modifier
(fn [shape] (ctm/change-dimensions shape attr value)) (fn [shape] (ctm/change-dimensions-modifiers shape attr value))
modif-tree modif-tree
(-> (dwm/build-modif-tree ids objects get-modifier) (-> (dwm/build-modif-tree ids objects get-modifier)
@ -486,7 +486,7 @@
(->> move-stream (->> move-stream
(rx/map (rx/map
(fn [[move-vector target-frame drop-index]] (fn [[move-vector target-frame drop-index]]
(-> (dwm/create-modif-tree ids (ctm/move move-vector)) (-> (dwm/create-modif-tree ids (ctm/move-modifiers move-vector))
(dwm/build-change-frame-modifiers objects selected target-frame drop-index) (dwm/build-change-frame-modifiers objects selected target-frame drop-index)
(dwm/set-modifiers))))) (dwm/set-modifiers)))))
@ -540,7 +540,7 @@
(rx/merge (rx/merge
(->> move-events (->> move-events
(rx/scan #(gpt/add %1 mov-vec) (gpt/point 0 0)) (rx/scan #(gpt/add %1 mov-vec) (gpt/point 0 0))
(rx/map #(dwm/create-modif-tree selected (ctm/move %))) (rx/map #(dwm/create-modif-tree selected (ctm/move-modifiers %)))
(rx/map (partial dwm/set-modifiers)) (rx/map (partial dwm/set-modifiers))
(rx/take-until stopper)) (rx/take-until stopper))
(rx/of (move-selected direction shift?))) (rx/of (move-selected direction shift?)))
@ -573,7 +573,7 @@
(or (:y position) (:y bbox))) (or (:y position) (:y bbox)))
delta (gpt/subtract pos cpos) delta (gpt/subtract pos cpos)
modif-tree (dwm/create-modif-tree [id] (ctm/move delta))] modif-tree (dwm/create-modif-tree [id] (ctm/move-modifiers delta))]
(rx/of (dwm/set-modifiers modif-tree) (rx/of (dwm/set-modifiers modif-tree)
(dwm/apply-modifiers)))))) (dwm/apply-modifiers))))))
@ -633,9 +633,9 @@
modif-tree (dwm/create-modif-tree modif-tree (dwm/create-modif-tree
selected selected
(-> (ctm/empty-modifiers) (-> (ctm/empty)
(ctm/set-resize (gpt/point -1.0 1.0) origin) (ctm/resize (gpt/point -1.0 1.0) origin)
(ctm/set-move (gpt/point (:width selrect) 0))))] (ctm/move (gpt/point (:width selrect) 0))))]
(rx/of (dwm/set-modifiers modif-tree true) (rx/of (dwm/set-modifiers modif-tree true)
(dwm/apply-modifiers)))))) (dwm/apply-modifiers))))))
@ -652,9 +652,9 @@
modif-tree (dwm/create-modif-tree modif-tree (dwm/create-modif-tree
selected selected
(-> (ctm/empty-modifiers) (-> (ctm/empty)
(ctm/set-resize (gpt/point 1.0 -1.0) origin) (ctm/resize (gpt/point 1.0 -1.0) origin)
(ctm/set-move (gpt/point 0 (:height selrect)))))] (ctm/move (gpt/point 0 (:height selrect)))))]
(rx/of (dwm/set-modifiers modif-tree true) (rx/of (dwm/set-modifiers modif-tree true)
(dwm/apply-modifiers)))))) (dwm/apply-modifiers))))))

View file

@ -187,7 +187,7 @@
mod-ids (cons object-id (cph/get-children-ids objects object-id)) mod-ids (cons object-id (cph/get-children-ids objects object-id))
updt-fn #(update %1 %2 gsh/transform-shape (ctm/move vector))] updt-fn #(update %1 %2 gsh/transform-shape (ctm/move-modifiers vector))]
(reduce updt-fn objects mod-ids))) (reduce updt-fn objects mod-ids)))
@ -254,14 +254,14 @@
objects objects
(mf/with-memo [frame-id objects vector] (mf/with-memo [frame-id objects vector]
(let [update-fn #(update %1 %2 gsh/transform-shape (ctm/move vector))] (let [update-fn #(update %1 %2 gsh/transform-shape (ctm/move-modifiers vector))]
(->> children-ids (->> children-ids
(into [frame-id]) (into [frame-id])
(reduce update-fn objects)))) (reduce update-fn objects))))
frame frame
(mf/with-memo [vector] (mf/with-memo [vector]
(gsh/transform-shape frame (ctm/move vector))) (gsh/transform-shape frame (ctm/move-modifiers vector)))
frame frame
(cond-> frame (cond-> frame
@ -313,7 +313,7 @@
(mf/deps vector objects group-id) (mf/deps vector objects group-id)
(fn [] (fn []
(let [children-ids (cons group-id (cph/get-children-ids objects group-id)) (let [children-ids (cons group-id (cph/get-children-ids objects group-id))
update-fn #(update %1 %2 gsh/transform-shape (ctm/move vector))] update-fn #(update %1 %2 gsh/transform-shape (ctm/move-modifiers vector))]
(reduce update-fn objects children-ids)))) (reduce update-fn objects children-ids))))
group (get objects group-id) group (get objects group-id)

View file

@ -33,7 +33,7 @@
(let [frame-id (:id frame) (let [frame-id (:id frame)
vector (-> (gpt/point (:x size) (:y size)) vector (-> (gpt/point (:x size) (:y size))
(gpt/negate)) (gpt/negate))
update-fn #(d/update-when %1 %2 gsh/transform-shape (ctm/move vector))] update-fn #(d/update-when %1 %2 gsh/transform-shape (ctm/move-modifiers vector))]
(->> (cph/get-children-ids objects frame-id) (->> (cph/get-children-ids objects frame-id)
(into [frame-id]) (into [frame-id])
(reduce update-fn objects)))) (reduce update-fn objects))))

View file

@ -188,7 +188,7 @@
(/ (:height shape) (:height shape')))] (/ (:height shape) (:height shape')))]
;; Reverse the change in size so we can recalculate the layout ;; Reverse the change in size so we can recalculate the layout
(-> modifiers (-> modifiers
(ctm/set-resize scalev (-> shape' :points first) (:transform shape') (:transform-inverse shape'))))) (ctm/resize scalev (-> shape' :points first) (:transform shape') (:transform-inverse shape')))))
(defn use-dynamic-modifiers (defn use-dynamic-modifiers
[objects node modifiers] [objects node modifiers]
@ -205,7 +205,7 @@
(ctm/modifiers->transform modifiers))) (ctm/modifiers->transform modifiers)))
modifiers)))) modifiers))))
add-children (mf/use-memo (mf/deps modifiers) #(ctm/get-frame-add-children modifiers)) add-children (mf/use-memo (mf/deps modifiers) #(ctm/added-children-frames modifiers))
add-children (hooks/use-equal-memo add-children) add-children (hooks/use-equal-memo add-children)
add-children-prev (hooks/use-previous add-children) add-children-prev (hooks/use-previous add-children)

View file

@ -42,7 +42,7 @@
deltav (gpt/to-vec (gpt/point (:selrect shape')) deltav (gpt/to-vec (gpt/point (:selrect shape'))
(gpt/point (:selrect shape)))] (gpt/point (:selrect shape)))]
(gsh/transform-shape shape' (ctm/move deltav)))) (gsh/transform-shape shape' (ctm/move-modifiers deltav))))
(defn process-shape [modifiers {:keys [id] :as shape}] (defn process-shape [modifiers {:keys [id] :as shape}]
(let [modifier (dm/get-in modifiers [id :modifiers])] (let [modifier (dm/get-in modifiers [id :modifiers])]