mirror of
https://github.com/penpot/penpot.git
synced 2025-06-04 07:11:38 +02:00
🐛 Fix incorrect absolute frame positioning with measures sidebar
This commit is contained in:
parent
68a89556d6
commit
7fdb0873db
2 changed files with 47 additions and 29 deletions
|
@ -283,6 +283,22 @@
|
||||||
:else
|
:else
|
||||||
(get-root-frame objects (:frame-id frame)))))
|
(get-root-frame objects (:frame-id frame)))))
|
||||||
|
|
||||||
|
(defn get-parent-frame
|
||||||
|
"Similar to `get-frame, but always return the parent frame. When root
|
||||||
|
frame is provided, then itself is returned."
|
||||||
|
[objects shape-or-id]
|
||||||
|
(cond
|
||||||
|
(map? shape-or-id)
|
||||||
|
(get objects (dm/get-prop shape-or-id :frame-id))
|
||||||
|
|
||||||
|
(= uuid/zero shape-or-id)
|
||||||
|
(get objects uuid/zero)
|
||||||
|
|
||||||
|
:else
|
||||||
|
(some->> shape-or-id
|
||||||
|
(get objects)
|
||||||
|
(get-frame objects))))
|
||||||
|
|
||||||
(defn valid-frame-target?
|
(defn valid-frame-target?
|
||||||
[objects parent-id shape-id]
|
[objects parent-id shape-id]
|
||||||
(let [shape (get objects shape-id)]
|
(let [shape (get objects shape-id)]
|
||||||
|
|
|
@ -859,42 +859,44 @@
|
||||||
(rx/of (reorder-selected-layout-child direction))
|
(rx/of (reorder-selected-layout-child direction))
|
||||||
(rx/of (nudge-selected-shapes direction shift?)))))))
|
(rx/of (nudge-selected-shapes direction shift?)))))))
|
||||||
|
|
||||||
(defn- get-delta [position bbox]
|
(defn- calculate-delta
|
||||||
(let [cpos (gpt/point (:x bbox) (:y bbox))
|
[position bbox relative-to]
|
||||||
pos (gpt/point (or (:x position) (:x bbox))
|
(let [current (gpt/point (:x bbox) (:y bbox))
|
||||||
(or (:y position) (:y bbox)))]
|
position (gpt/point (or (some-> (:x position) (+ (dm/get-prop relative-to :x)))
|
||||||
(gpt/subtract pos cpos)))
|
(:x bbox))
|
||||||
|
(or (some-> (:y position) (+ (dm/get-prop relative-to :y)))
|
||||||
(defn- get-relative-delta [position bbox frame]
|
(:y bbox)))]
|
||||||
(let [frame-bbox (-> frame :points grc/points->rect)
|
(gpt/subtract position current)))
|
||||||
relative-cpos (gpt/subtract (gpt/point (:x bbox) (:y bbox))
|
|
||||||
(gpt/point (:x frame-bbox)
|
|
||||||
(:y frame-bbox)))
|
|
||||||
cpos (gpt/point (:x relative-cpos) (:y relative-cpos))
|
|
||||||
pos (gpt/point (or (:x position) (:x relative-cpos))
|
|
||||||
(or (:y position) (:y relative-cpos)))]
|
|
||||||
(gpt/subtract pos cpos)))
|
|
||||||
|
|
||||||
(defn update-position
|
(defn update-position
|
||||||
"Move shapes to a new position"
|
"Move shapes to a new position. It will resolve to the current frame
|
||||||
|
of the shape, unless given the absolute option. In this case it will
|
||||||
|
resolve to the root frame of the page.
|
||||||
|
|
||||||
|
The position is a map that can have a partial position (it means it
|
||||||
|
can receive {:x 10}."
|
||||||
([id position] (update-position id position nil))
|
([id position] (update-position id position nil))
|
||||||
([id position options]
|
([id position options]
|
||||||
(dm/assert! (uuid? id))
|
(assert (uuid? id) "expected a valid uuid for `id`")
|
||||||
|
(assert (map? position) "expected a valid map for `position`")
|
||||||
|
|
||||||
(ptk/reify ::update-position
|
(ptk/reify ::update-position
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [_ state _]
|
(watch [_ state _]
|
||||||
(let [page-id (or (get options :page-id)
|
(let [page-id (or (get options :page-id)
|
||||||
(get state :current-page-id))
|
(get state :current-page-id))
|
||||||
objects (dsh/lookup-page-objects state page-id)
|
objects (dsh/lookup-page-objects state page-id)
|
||||||
shape (get objects id)
|
shape (get objects id)
|
||||||
;; FIXME: performance rect
|
|
||||||
bbox (-> shape :points grc/points->rect)
|
bbox (-> shape :points grc/points->rect)
|
||||||
frame (cfh/get-frame objects shape)
|
frame (if (:absolute? options)
|
||||||
delta (if (:absolute? options)
|
(cfh/get-frame objects)
|
||||||
(get-delta position bbox)
|
(cfh/get-parent-frame objects shape))
|
||||||
(get-relative-delta position bbox frame))
|
|
||||||
modif-tree (dwm/create-modif-tree [id] (ctm/move-modifiers delta))]
|
delta (calculate-delta position bbox frame)
|
||||||
(rx/of (dwm/apply-modifiers {:modifiers modif-tree
|
modifiers (dwm/create-modif-tree [id] (ctm/move-modifiers delta))]
|
||||||
|
|
||||||
|
(rx/of (dwm/apply-modifiers {:modifiers modifiers
|
||||||
:page-id page-id
|
:page-id page-id
|
||||||
:ignore-constraints false
|
:ignore-constraints false
|
||||||
:ignore-touched (:ignore-touched options)
|
:ignore-touched (:ignore-touched options)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue