mirror of
https://github.com/penpot/penpot.git
synced 2025-06-14 21:21:38 +02:00
✨ Allow to drop shape inside frames or groups in layers panel
This commit is contained in:
parent
0f7b33837c
commit
6cb4822842
4 changed files with 45 additions and 27 deletions
|
@ -1074,6 +1074,10 @@ input[type=range]:focus::-ms-fill-upper {
|
||||||
-webkit-user-drag: element;
|
-webkit-user-drag: element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dnd-over > .element-list-body {
|
||||||
|
border: 1px solid white !important;
|
||||||
|
}
|
||||||
|
|
||||||
.dnd-over-top {
|
.dnd-over-top {
|
||||||
border-top: 1px solid white !important;
|
border-top: 1px solid white !important;
|
||||||
}
|
}
|
||||||
|
|
|
@ -918,9 +918,9 @@
|
||||||
;; TODO: pending UNDO
|
;; TODO: pending UNDO
|
||||||
|
|
||||||
(defn relocate-shape
|
(defn relocate-shape
|
||||||
[id ref-id index]
|
[id parent-id index]
|
||||||
(us/verify ::us/uuid id)
|
(us/verify ::us/uuid id)
|
||||||
(us/verify ::us/uuid ref-id)
|
(us/verify ::us/uuid parent-id)
|
||||||
(us/verify number? index)
|
(us/verify number? index)
|
||||||
|
|
||||||
(ptk/reify ::relocate-shape
|
(ptk/reify ::relocate-shape
|
||||||
|
@ -930,15 +930,13 @@
|
||||||
ptk/WatchEvent
|
ptk/WatchEvent
|
||||||
(watch [_ state stream]
|
(watch [_ state stream]
|
||||||
(let [page-id (:current-page-id state)
|
(let [page-id (:current-page-id state)
|
||||||
selected (get-in state [:workspace-local :selected])
|
selected (get-in state [:workspace-local :selected])]
|
||||||
objects (get-in state [:workspace-data page-id :objects])
|
|
||||||
parent-id (cp/get-parent ref-id objects)]
|
|
||||||
(rx/of (dwc/commit-changes [{:type :mov-objects
|
(rx/of (dwc/commit-changes [{:type :mov-objects
|
||||||
:parent-id parent-id
|
:parent-id parent-id
|
||||||
:index index
|
:index index
|
||||||
:shapes (vec selected)}]
|
:shapes (vec selected)}]
|
||||||
[]
|
[]
|
||||||
{:commit-local? true}))))))
|
{:commit-local? true}))))))
|
||||||
|
|
||||||
;; --- Change Page Order (D&D Ordering)
|
;; --- Change Page Order (D&D Ordering)
|
||||||
|
|
||||||
|
|
|
@ -85,8 +85,20 @@
|
||||||
(set! (.-src img) imd)
|
(set! (.-src img) imd)
|
||||||
img))
|
img))
|
||||||
|
|
||||||
|
(defn drop-side
|
||||||
|
[height ypos detect-center?]
|
||||||
|
(let [thold (/ height 2)
|
||||||
|
thold1 (* height 0.2)
|
||||||
|
thold2 (* height 0.8)]
|
||||||
|
(if detect-center?
|
||||||
|
(cond
|
||||||
|
(< ypos thold1) :top
|
||||||
|
(> ypos thold2) :bot
|
||||||
|
:else :center)
|
||||||
|
(if (> ypos thold) :bot :top))))
|
||||||
|
|
||||||
(defn use-sortable
|
(defn use-sortable
|
||||||
[& {:keys [type data on-drop on-drag] :as opts}]
|
[& {:keys [type data on-drop on-drag detect-center?] :as opts}]
|
||||||
(let [ref (mf/use-ref)
|
(let [ref (mf/use-ref)
|
||||||
state (mf/use-state {})
|
state (mf/use-state {})
|
||||||
|
|
||||||
|
@ -115,8 +127,7 @@
|
||||||
dtrans (unchecked-get event "dataTransfer")
|
dtrans (unchecked-get event "dataTransfer")
|
||||||
ypos (unchecked-get event "offsetY")
|
ypos (unchecked-get event "offsetY")
|
||||||
height (unchecked-get target "clientHeight")
|
height (unchecked-get target "clientHeight")
|
||||||
thold (/ height 2)
|
side (drop-side height ypos detect-center?)]
|
||||||
side (if (> ypos thold) :bot :top)]
|
|
||||||
|
|
||||||
(set! (.-dropEffect dtrans) "move")
|
(set! (.-dropEffect dtrans) "move")
|
||||||
(set! (.-effectAllowed dtrans) "move")
|
(set! (.-effectAllowed dtrans) "move")
|
||||||
|
@ -159,8 +170,7 @@
|
||||||
|
|
||||||
ypos (unchecked-get event "offsetY")
|
ypos (unchecked-get event "offsetY")
|
||||||
height (unchecked-get target "clientHeight")
|
height (unchecked-get target "clientHeight")
|
||||||
thold (/ height 2)
|
side (drop-side height ypos detect-center?)]
|
||||||
side (if (> ypos thold) :bot :top)]
|
|
||||||
|
|
||||||
;; TODO: seems unnecessary
|
;; TODO: seems unnecessary
|
||||||
(swap! state (fn [state]
|
(swap! state (fn [state]
|
||||||
|
|
|
@ -87,6 +87,7 @@
|
||||||
[{:keys [index item selected objects] :as props}]
|
[{:keys [index item selected objects] :as props}]
|
||||||
(let [id (:id item)
|
(let [id (:id item)
|
||||||
selected? (contains? selected id)
|
selected? (contains? selected id)
|
||||||
|
container? (or (= (:type item) :frame) (= (:type item) :group))
|
||||||
|
|
||||||
expanded-iref (mf/use-memo
|
expanded-iref (mf/use-memo
|
||||||
(mf/deps id)
|
(mf/deps id)
|
||||||
|
@ -149,25 +150,30 @@
|
||||||
(dw/select-shape id))))
|
(dw/select-shape id))))
|
||||||
|
|
||||||
on-drop
|
on-drop
|
||||||
(fn [side {:keys [id name] :as data}]
|
(fn [side {:keys [id] :as data}]
|
||||||
(let [index (if (= :top side) (inc index) index)]
|
(if (= side :center)
|
||||||
(st/emit! (dw/relocate-shape id (:id item) index))))
|
(st/emit! (dw/relocate-shape id (:id item) 0))
|
||||||
|
(let [index (if (= side :top) (inc index) index)
|
||||||
|
parent-id (cp/get-parent (:id item) objects)]
|
||||||
|
(st/emit! (dw/relocate-shape id parent-id index)))))
|
||||||
|
|
||||||
[dprops dref] (hooks/use-sortable
|
[dprops dref] (hooks/use-sortable
|
||||||
:type (str (:frame-id item))
|
:type (str (:frame-id item))
|
||||||
:on-drop on-drop
|
:on-drop on-drop
|
||||||
:on-drag on-drag
|
:on-drag on-drag
|
||||||
|
:detect-center? container?
|
||||||
:data {:id (:id item)
|
:data {:id (:id item)
|
||||||
:index index
|
:index index
|
||||||
:name (:name item)})
|
:name (:name item)})]
|
||||||
]
|
|
||||||
[:li {:on-context-menu on-context-menu
|
[:li {:on-context-menu on-context-menu
|
||||||
:ref dref
|
:ref dref
|
||||||
:class (dom/classnames
|
:class (dom/classnames
|
||||||
:dnd-over-top (= (:over dprops) :top)
|
:dnd-over (= (:over dprops) :center)
|
||||||
:dnd-over-bot (= (:over dprops) :bot)
|
:dnd-over-top (= (:over dprops) :top)
|
||||||
:selected selected?
|
:dnd-over-bot (= (:over dprops) :bot)
|
||||||
)}
|
:selected selected?)}
|
||||||
|
|
||||||
[:div.element-list-body {:class (dom/classnames :selected selected?
|
[:div.element-list-body {:class (dom/classnames :selected selected?
|
||||||
:icon-layer (= (:type item) :icon))
|
:icon-layer (= (:type item) :icon))
|
||||||
:on-click select-shape
|
:on-click select-shape
|
||||||
|
@ -245,15 +251,15 @@
|
||||||
[:ul.element-list
|
[:ul.element-list
|
||||||
(for [[index id] (reverse (d/enumerate (:shapes root)))]
|
(for [[index id] (reverse (d/enumerate (:shapes root)))]
|
||||||
(let [obj (get objects id)]
|
(let [obj (get objects id)]
|
||||||
(if (= :frame (:type obj))
|
(if (= (:type obj) :frame)
|
||||||
[:& frame-wrapper
|
[:& frame-wrapper
|
||||||
{:item (get objects id)
|
{:item obj
|
||||||
:selected selected
|
:selected selected
|
||||||
:index index
|
:index index
|
||||||
:objects objects
|
:objects objects
|
||||||
:key id}]
|
:key id}]
|
||||||
[:& layer-item
|
[:& layer-item
|
||||||
{:item (get objects id)
|
{:item obj
|
||||||
:selected selected
|
:selected selected
|
||||||
:index index
|
:index index
|
||||||
:objects objects
|
:objects objects
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue