0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-03-13 00:01:51 -05:00

Fix problem with fixed constraints

This commit is contained in:
alonso.torres 2022-11-08 12:06:28 +01:00
parent cdaba395c4
commit c1affe75e1
2 changed files with 61 additions and 33 deletions

View file

@ -130,61 +130,89 @@
(defn start-vector
[axis child-points parent-points]
((if (= :x axis) left-vector top-vector) child-points parent-points))
(let [pos-vector
(cond (= :x axis) left-vector
(= :y axis) top-vector)]
(pos-vector child-points parent-points)))
(defn end-vector
[axis child-points parent-points]
((if (= :x axis) right-vector bottom-vector) child-points parent-points))
(let [pos-vector
(cond (= :x axis) right-vector
(= :y axis) bottom-vector)]
(pos-vector child-points parent-points)))
(defn center-vector
[axis child-points parent-points]
((if (= :x axis) center-horizontal-vector center-vertical-vector) child-points parent-points))
(defn displacement
[before-v after-v]
(let [angl (gpt/angle-with-other before-v after-v)
sign (if (mth/close? angl 180) -1 1)
length (* sign (gpt/length before-v))]
(gpt/subtract after-v (gpt/scale (gpt/unit after-v) length))))
(defn side-vector
[axis [c0 c1 _ c3]]
(if (= axis :x)
(gpt/to-vec c0 c1)
(gpt/to-vec c0 c3)))
(defn side-vector-resize
[axis [c0 c1 _ c3] start-vector end-vector]
(if (= axis :x)
(gpt/to-vec (gpt/add c0 start-vector) (gpt/add c1 end-vector))
(gpt/to-vec (gpt/add c0 start-vector) (gpt/add c3 end-vector))))
;; Constraint function definitions
(defmulti constraint-modifier (fn [type & _] type))
(defmethod constraint-modifier :start
[_ axis child-points-before parent-points-before child-points-after parent-points-after]
(let [start-before (start-vector axis child-points-before parent-points-before)
start-after (start-vector axis child-points-after parent-points-after)]
(ctm/move-modifiers (displacement start-before start-after))))
(defmethod constraint-modifier :end
[_ axis child-points-before parent-points-before child-points-after parent-points-after]
(let [end-before (end-vector axis child-points-before parent-points-before)
end-after (end-vector axis child-points-after parent-points-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))
disp-vector-end (gpt/subtract end-after (gpt/scale (gpt/unit end-after) target-end))]
(ctm/move-modifiers disp-vector-end)))
end-after (end-vector axis child-points-after parent-points-after)]
(ctm/move-modifiers (displacement end-before end-after))))
(defmethod constraint-modifier :fixed
[_ axis child-points-before parent-points-before child-points-after parent-points-after transformed-parent]
(let [[c0 c1 _ c4] child-points-after
(let [;; Same as constraint end
end-before (end-vector axis child-points-before parent-points-before)
end-after (end-vector axis child-points-after parent-points-after)
start-before (start-vector axis child-points-before parent-points-before)
start-after (start-vector axis child-points-after parent-points-after)
;; Same as constraint end
end-before (end-vector axis child-points-before parent-points-before)
end-after (end-vector axis child-points-after parent-points-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))
disp-vector-end (gpt/subtract end-after (gpt/scale (gpt/unit end-after) target-end))
disp-end (displacement end-before end-after)
disp-start (displacement start-before start-after)
before-vec (if (= axis :x) (gpt/to-vec c0 c1) (gpt/to-vec c0 c4))
after-vec (if (= axis :x)
(gpt/to-vec c0 (gpt/add c1 disp-vector-end))
(gpt/to-vec c0 (gpt/add c4 disp-vector-end))
)
;; We get the current axis side and grow it on both side by the end+start displacements
before-vec (side-vector axis child-points-after)
after-vec (side-vector-resize axis child-points-after disp-start disp-end)
resize-angl (gpt/angle-with-other before-vec after-vec)
resize-sign (if (mth/close? resize-angl 180) -1 1)
;; after-vec will contain the side length of the grown side
;; we scale the shape by the diference and translate it by the start
;; displacement (so its left+top position is constant)
scale (/ (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))))
resize-origin (first child-points-after)
{:keys [transform transform-inverse]} transformed-parent]
(-> (ctm/empty)
(ctm/resize (get-scale axis scale) resize-origin transform transform-inverse)
(ctm/move disp-start))))
(defmethod constraint-modifier :center
[_ axis child-points-before parent-points-before child-points-after parent-points-after]
(let [center-before (center-vector axis child-points-before parent-points-before)
center-after (center-vector axis child-points-after parent-points-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))
disp-vector-center (gpt/subtract center-after (gpt/scale (gpt/unit center-after) target-center))]
(ctm/move-modifiers disp-vector-center)))
center-after (center-vector axis child-points-after parent-points-after)]
(ctm/move-modifiers (displacement center-before center-after))))
(defmethod constraint-modifier :default [_ _ _ _ _]
[])
@ -266,11 +294,11 @@
modifiers (normalize-modifiers constraints-h constraints-v modifiers child parent transformed-child transformed-parent)
transformed-child (gst/transform-shape child modifiers)
parent-points-before (:points parent)
child-points-before (bounding-box-parent-transform child parent)
parent-points-after (:points transformed-parent)
child-points-after (bounding-box-parent-transform transformed-child transformed-parent)
parent-points-before (bounding-box-parent-transform parent parent)
child-points-before (bounding-box-parent-transform child parent)
parent-points-after (bounding-box-parent-transform transformed-parent transformed-parent)
child-points-after (bounding-box-parent-transform transformed-child transformed-parent)
modifiers-h (constraint-modifier (constraints-h const->type+axis) :x
child-points-before parent-points-before

View file

@ -131,7 +131,7 @@
(update [_ state]
(-> state
(dissoc :workspace-modifiers)
(dissoc ::current-move-selected)))))
(dissoc :app.main.data.workspace.transforms/current-move-selected)))))
(defn create-modif-tree
[ids modifiers]