diff --git a/common/app/common/pages.cljc b/common/app/common/pages.cljc index eda4584d1..8e2c58bb2 100644 --- a/common/app/common/pages.cljc +++ b/common/app/common/pages.cljc @@ -294,8 +294,6 @@ :internal.shape/proportion-lock :internal.shape/rx :internal.shape/ry - :internal.shape/cx - :internal.shape/cy :internal.shape/x :internal.shape/y :internal.shape/exports @@ -319,7 +317,7 @@ :fill-color-ref-file :fill-group :fill-color-ref-id :fill-group :fill-opacity :fill-group - :content :text-content-group + :content :content-group :font-family :text-font-group :font-size :text-font-group :font-style :text-font-group @@ -334,11 +332,19 @@ :stroke-style :stroke-group :stroke-width :stroke-group :stroke-alignment :stroke-group - :width :size-group - :height :size-group - :proportion :size-group - :rx :radius-group - :ry :radius-group + :selrect :geometry-group + :points :geometry-group + :locked :geometry-group + :proportion :geometry-group + :proportion-lock :geometry-group + :rx :geometry-group + :ry :geometry-group + :x :geometry-group + :y :geometry-group + :width :geometry-group + :height :geometry-group + :transform :geometry-group + :transform-inverse :geometry-group :masked-group? :mask-group}) ;; shapes-group is handled differently @@ -1074,7 +1080,12 @@ group (get component-sync-attrs attr)] (cond-> shape - (and shape-ref group (not ignore) (not= val (get shape attr))) + (and shape-ref group (not ignore) (not= val (get shape attr)) + ;; FIXME: it's difficult to tell if the geometry changes affect + ;; an individual shape inside the component, or are for + ;; the whole component (in which case we shouldn't set + ;; touched). For the moment we disable geometry touched. + (not= group :geometry-group)) (update :touched cph/set-touched-group group) (nil? val) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index bd6608a3b..0d539806e 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -14,6 +14,7 @@ [app.common.data :as d] [app.common.pages-helpers :as cph] [app.common.geom.point :as gpt] + [app.common.geom.shapes :as geom] [app.common.pages :as cp] [app.util.logging :as log] [app.util.text :as ut])) @@ -50,7 +51,7 @@ (declare move-shape) (declare change-touched) (declare update-attrs) -(declare calc-new-pos) +(declare reposition-shape) ;; ---- Create a new component ---- @@ -658,16 +659,13 @@ (cph/get-parents parent-shape (:objects container)))) update-new-shape (fn [new-shape original-shape] - (let [new-pos (calc-new-pos new-shape - original-shape - root-instance - root-master)] + (let [new-shape (reposition-shape new-shape + root-master + root-instance)] (cond-> new-shape true (assoc :shape-ref (:id original-shape) - :frame-id (:frame-id parent-shape) - :x (:x new-pos) - :y (:y new-pos)) + :frame-id (:frame-id parent-shape)) (:component-id original-shape) (assoc :component-id (:component-id original-shape)) @@ -736,13 +734,9 @@ (cph/get-parents component-parent-shape (:objects component)))) update-new-shape (fn [new-shape original-shape] - (let [new-pos (calc-new-pos new-shape - original-shape - root-master - root-instance)] - (assoc new-shape - :x (:x new-pos) - :y (:y new-pos)))) + (reposition-shape new-shape + root-instance + root-master)) update-original-shape (fn [original-shape new-shape] (if-not (:shape-ref original-shape) @@ -966,23 +960,17 @@ (if (cph/page? container) "[P] " "[C] ") (:name dest-shape))) - (let [; The position attributes need a special sync algorith, because we do - ; not synchronize the absolute position, but the position relative of - ; the container shape of the component. - new-pos (calc-new-pos dest-shape origin-shape dest-root origin-root) - touched (get dest-shape :touched #{})] + (let [; To synchronize geometry attributes we need to make a prior + ; operation, because coordinates are absolute, but we need to + ; sync only the position relative to the origin of the component. + ; We solve this by moving the origin shape so it is aligned with + ; the dest root before syncing. + origin-shape (reposition-shape origin-shape origin-root dest-root) + touched (get dest-shape :touched #{})] - (loop [attrs (seq (keys (dissoc cp/component-sync-attrs :x :y))) - roperations (if (or (not= (:x new-pos) (:x dest-shape)) - (not= (:y new-pos) (:y dest-shape))) - [{:type :set :attr :x :val (:x new-pos)} - {:type :set :attr :y :val (:y new-pos)}] - []) - uoperations (if (or (not= (:x new-pos) (:x dest-shape)) - (not= (:y new-pos) (:y dest-shape))) - [{:type :set :attr :x :val (:x dest-shape)} - {:type :set :attr :y :val (:y dest-shape)}] - [])] + (loop [attrs (seq (keys cp/component-sync-attrs)) + roperations [] + uoperations []] (let [attr (first attrs)] (if (nil? attr) @@ -1042,13 +1030,13 @@ (conj roperations roperation) (conj uoperations uoperation)))))))))) -(defn- calc-new-pos - [dest-shape origin-shape dest-root origin-root] - (let [root-pos (gpt/point (:x dest-root) (:y dest-root)) - origin-root-pos (gpt/point (:x origin-root) (:y origin-root)) - origin-pos (gpt/point (:x origin-shape) (:y origin-shape)) - delta (gpt/subtract origin-pos origin-root-pos) - shape-pos (gpt/point (:x dest-shape) (:y dest-shape)) - new-pos (gpt/add root-pos delta)] - new-pos)) +(defn- reposition-shape + [shape origin-root dest-root] + (let [shape-pos (fn [shape] + (gpt/point (get-in shape [:selrect :x]) + (get-in shape [:selrect :y]))) + origin-root-pos (shape-pos origin-root) + dest-root-pos (shape-pos dest-root) + delta (gpt/subtract dest-root-pos origin-root-pos)] + (geom/move shape delta)))