mirror of
https://github.com/penpot/penpot.git
synced 2025-06-07 01:11:39 +02:00
🐛 Fix problem when moving shapes inside nested frames
This commit is contained in:
parent
9cb6e71258
commit
ddf8aaf68f
10 changed files with 43 additions and 21 deletions
|
@ -9,7 +9,8 @@
|
||||||
- Fix overlay closed on clicked outside [Taiga #4027](https://tree.taiga.io/project/penpot/issue/4027)
|
- Fix overlay closed on clicked outside [Taiga #4027](https://tree.taiga.io/project/penpot/issue/4027)
|
||||||
- Fix animate multiple overlays [Taiga #3993](https://tree.taiga.io/project/penpot/issue/3993)
|
- Fix animate multiple overlays [Taiga #3993](https://tree.taiga.io/project/penpot/issue/3993)
|
||||||
- Fix problem with snap to grids [#2221](https://github.com/penpot/penpot/issues/2221)
|
- Fix problem with snap to grids [#2221](https://github.com/penpot/penpot/issues/2221)
|
||||||
- Fix issue when scaling to value 0 [Taiga #4109](https://tree.taiga.io/project/penpot/issue/4109)
|
- Fix issue when scaling to value 0 [#2252](https://github.com/penpot/penpot/issues/2252)
|
||||||
|
- Fix problem when moving shapes inside nested frames [Taiga #4113](https://tree.taiga.io/project/penpot/issue/4113)
|
||||||
|
|
||||||
## 1.15.3-beta
|
## 1.15.3-beta
|
||||||
|
|
||||||
|
|
|
@ -287,6 +287,26 @@
|
||||||
(d/seek #(and position (gsh/has-point? (get objects %) position))))]
|
(d/seek #(and position (gsh/has-point? (get objects %) position))))]
|
||||||
(or top-frame uuid/zero)))
|
(or top-frame uuid/zero)))
|
||||||
|
|
||||||
|
(defn all-frames-by-position
|
||||||
|
[objects position]
|
||||||
|
(->> (get-frames-ids objects)
|
||||||
|
(sort-z-index objects)
|
||||||
|
(filterv #(and position (gsh/has-point? (get objects %) position)))))
|
||||||
|
|
||||||
|
(defn top-nested-frame
|
||||||
|
"Search for the top nested frame for positioning shapes when moving or creating.
|
||||||
|
Looks for all the frames in a position and then goes in depth between the top-most and its
|
||||||
|
children to find the target."
|
||||||
|
[objects position]
|
||||||
|
(let [frame-ids (all-frames-by-position objects position)
|
||||||
|
frame-set (set frame-ids)]
|
||||||
|
(loop [current-id (first frame-ids)]
|
||||||
|
(let [current-shape (get objects current-id)
|
||||||
|
child-frame-id (d/seek #(contains? frame-set %) (-> (:shapes current-shape) reverse))]
|
||||||
|
(if (nil? child-frame-id)
|
||||||
|
(or current-id uuid/zero)
|
||||||
|
(recur child-frame-id))))))
|
||||||
|
|
||||||
(defn frame-by-position
|
(defn frame-by-position
|
||||||
[objects position]
|
[objects position]
|
||||||
(let [frame-id (frame-id-by-position objects position)]
|
(let [frame-id (frame-id-by-position objects position)]
|
||||||
|
|
|
@ -1344,7 +1344,7 @@
|
||||||
[frame-id frame-id delta])
|
[frame-id frame-id delta])
|
||||||
|
|
||||||
(empty? page-selected)
|
(empty? page-selected)
|
||||||
(let [frame-id (cph/frame-id-by-position page-objects mouse-pos)
|
(let [frame-id (cph/top-nested-frame page-objects mouse-pos)
|
||||||
delta (gpt/subtract mouse-pos orig-pos)]
|
delta (gpt/subtract mouse-pos orig-pos)]
|
||||||
[frame-id frame-id delta])
|
[frame-id frame-id delta])
|
||||||
|
|
||||||
|
@ -1456,7 +1456,7 @@
|
||||||
height 16
|
height 16
|
||||||
page-id (:current-page-id state)
|
page-id (:current-page-id state)
|
||||||
frame-id (-> (wsh/lookup-page-objects state page-id)
|
frame-id (-> (wsh/lookup-page-objects state page-id)
|
||||||
(cph/frame-id-by-position @ms/mouse-position))
|
(cph/top-nested-frame @ms/mouse-position))
|
||||||
shape (cp/setup-rect-selrect
|
shape (cp/setup-rect-selrect
|
||||||
{:id id
|
{:id id
|
||||||
:type :text
|
:type :text
|
||||||
|
|
|
@ -65,7 +65,7 @@
|
||||||
focus (:workspace-focus-selected state)
|
focus (:workspace-focus-selected state)
|
||||||
zoom (get-in state [:workspace-local :zoom] 1)
|
zoom (get-in state [:workspace-local :zoom] 1)
|
||||||
|
|
||||||
fid (cph/frame-id-by-position objects initial)
|
fid (cph/top-nested-frame objects initial)
|
||||||
|
|
||||||
shape (get-in state [:workspace-drawing :object])
|
shape (get-in state [:workspace-drawing :object])
|
||||||
shape (-> shape
|
shape (-> shape
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
(let [objects (wsh/lookup-page-objects state)
|
(let [objects (wsh/lookup-page-objects state)
|
||||||
content (get-in state [:workspace-drawing :object :content] [])
|
content (get-in state [:workspace-drawing :object :content] [])
|
||||||
position (get-in content [0 :params] nil)
|
position (get-in content [0 :params] nil)
|
||||||
frame-id (cph/frame-id-by-position objects position)]
|
frame-id (cph/top-nested-frame objects position)]
|
||||||
(-> state
|
(-> state
|
||||||
(assoc-in [:workspace-drawing :object :frame-id] frame-id))))))
|
(assoc-in [:workspace-drawing :object :frame-id] frame-id))))))
|
||||||
|
|
||||||
|
|
|
@ -146,7 +146,7 @@
|
||||||
objects (:objects page)
|
objects (:objects page)
|
||||||
unames (volatile! (un/retrieve-used-names objects))
|
unames (volatile! (un/retrieve-used-names objects))
|
||||||
|
|
||||||
frame-id (cph/frame-id-by-position objects (gpt/add orig-pos delta))
|
frame-id (cph/top-nested-frame objects (gpt/add orig-pos delta))
|
||||||
|
|
||||||
update-new-shape
|
update-new-shape
|
||||||
(fn [new-shape original-shape]
|
(fn [new-shape original-shape]
|
||||||
|
|
|
@ -258,7 +258,7 @@
|
||||||
(let [objects (wsh/lookup-page-objects state)
|
(let [objects (wsh/lookup-page-objects state)
|
||||||
content (get-in state [:workspace-drawing :object :content] [])
|
content (get-in state [:workspace-drawing :object :content] [])
|
||||||
position (get-in content [0 :params] nil)
|
position (get-in content [0 :params] nil)
|
||||||
frame-id (cph/frame-id-by-position objects position)]
|
frame-id (cph/top-nested-frame objects position)]
|
||||||
(-> state
|
(-> state
|
||||||
(assoc-in [:workspace-drawing :object :frame-id] frame-id))))))
|
(assoc-in [:workspace-drawing :object :frame-id] frame-id))))))
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
;; Calculate the frame over which we're drawing
|
;; Calculate the frame over which we're drawing
|
||||||
(let [position @ms/mouse-position
|
(let [position @ms/mouse-position
|
||||||
frame-id (:frame-id attrs (cph/frame-id-by-position objects position))
|
frame-id (:frame-id attrs (cph/top-nested-frame objects position))
|
||||||
shape (when-not (empty? selected)
|
shape (when-not (empty? selected)
|
||||||
(cph/get-base-shape objects selected))]
|
(cph/get-base-shape objects selected))]
|
||||||
|
|
||||||
|
@ -252,7 +252,6 @@
|
||||||
(ptk/reify ::create-and-add-shape
|
(ptk/reify ::create-and-add-shape
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [_ state _]
|
(watch [_ state _]
|
||||||
(prn ">>>create-")
|
|
||||||
(let [{:keys [width height]} data
|
(let [{:keys [width height]} data
|
||||||
|
|
||||||
[vbc-x vbc-y] (viewport-center state)
|
[vbc-x vbc-y] (viewport-center state)
|
||||||
|
@ -260,7 +259,7 @@
|
||||||
y (:y data (- vbc-y (/ height 2)))
|
y (:y data (- vbc-y (/ height 2)))
|
||||||
page-id (:current-page-id state)
|
page-id (:current-page-id state)
|
||||||
frame-id (-> (wsh/lookup-page-objects state page-id)
|
frame-id (-> (wsh/lookup-page-objects state page-id)
|
||||||
(cph/frame-id-by-position {:x frame-x :y frame-y}))
|
(cph/top-nested-frame {:x frame-x :y frame-y}))
|
||||||
shape (-> (cp/make-minimal-shape type)
|
shape (-> (cp/make-minimal-shape type)
|
||||||
(merge data)
|
(merge data)
|
||||||
(merge {:x x :y y})
|
(merge {:x x :y y})
|
||||||
|
|
|
@ -437,7 +437,7 @@
|
||||||
(try
|
(try
|
||||||
(let [page-id (:current-page-id state)
|
(let [page-id (:current-page-id state)
|
||||||
objects (wsh/lookup-page-objects state page-id)
|
objects (wsh/lookup-page-objects state page-id)
|
||||||
frame-id (cph/frame-id-by-position objects position)
|
frame-id (cph/top-nested-frame objects position)
|
||||||
selected (wsh/lookup-selected state)
|
selected (wsh/lookup-selected state)
|
||||||
|
|
||||||
[vb-x vb-y vb-width vb-height] (svg-dimensions svg-data)
|
[vb-x vb-y vb-width vb-height] (svg-dimensions svg-data)
|
||||||
|
|
|
@ -864,7 +864,7 @@
|
||||||
(let [position @ms/mouse-position
|
(let [position @ms/mouse-position
|
||||||
page-id (:current-page-id state)
|
page-id (:current-page-id state)
|
||||||
objects (wsh/lookup-page-objects state page-id)
|
objects (wsh/lookup-page-objects state page-id)
|
||||||
frame-id (cph/frame-id-by-position objects position)
|
frame-id (cph/top-nested-frame objects position)
|
||||||
|
|
||||||
moving-shapes
|
moving-shapes
|
||||||
(->> ids
|
(->> ids
|
||||||
|
@ -878,15 +878,17 @@
|
||||||
|
|
||||||
changes (-> (pcb/empty-changes it page-id)
|
changes (-> (pcb/empty-changes it page-id)
|
||||||
(pcb/with-objects objects)
|
(pcb/with-objects objects)
|
||||||
(pcb/update-shapes moving-frames (fn [shape]
|
(pcb/update-shapes
|
||||||
;; Hide in viwer must be enabled just when a board is moved inside another artboard an nested to it, we have to avoid situations like:
|
moving-frames
|
||||||
;; - Moving inside the same frame
|
(fn [shape]
|
||||||
;; - Moving outside the frame
|
;; Hide in viwer must be enabled just when a board is moved inside another artboard an nested to it, we have to avoid situations like:
|
||||||
(cond-> shape
|
;; - Moving inside the same frame
|
||||||
(and (not= frame-id (:id shape))
|
;; - Moving outside the frame
|
||||||
(not= frame-id (:frame-id shape))
|
(cond-> shape
|
||||||
(not= frame-id uuid/zero))
|
(and (not= frame-id (:id shape))
|
||||||
(assoc :hide-in-viewer true))))
|
(not= frame-id (:frame-id shape))
|
||||||
|
(not= frame-id uuid/zero))
|
||||||
|
(assoc :hide-in-viewer true))))
|
||||||
(pcb/change-parent frame-id moving-shapes))]
|
(pcb/change-parent frame-id moving-shapes))]
|
||||||
|
|
||||||
(when-not (empty? changes)
|
(when-not (empty? changes)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue