mirror of
https://github.com/penpot/penpot.git
synced 2025-05-28 06:46:10 +02:00
✨ Fixed export/import for nested frames
This commit is contained in:
parent
a4cc57886b
commit
9bd382f833
6 changed files with 75 additions and 53 deletions
|
@ -222,9 +222,13 @@
|
||||||
|
|
||||||
(defn close-artboard [file]
|
(defn close-artboard [file]
|
||||||
(assert (nil? (:current-component-id file)))
|
(assert (nil? (:current-component-id file)))
|
||||||
|
|
||||||
|
(let [parent-id (peek (get file :parent-stack))
|
||||||
|
parent (lookup-shape file parent-id)
|
||||||
|
current-frame-id (or (:frame-id parent) root-frame)]
|
||||||
(-> file
|
(-> file
|
||||||
(assoc :current-frame-id root-frame)
|
(assoc :current-frame-id current-frame-id)
|
||||||
(update :parent-stack pop)))
|
(update :parent-stack pop))))
|
||||||
|
|
||||||
(defn add-group [file data]
|
(defn add-group [file data]
|
||||||
(let [frame-id (:current-frame-id file)
|
(let [frame-id (:current-frame-id file)
|
||||||
|
|
|
@ -105,9 +105,10 @@
|
||||||
"Returns a vector of parents of the specified shape."
|
"Returns a vector of parents of the specified shape."
|
||||||
[objects shape-id]
|
[objects shape-id]
|
||||||
(loop [result [] id shape-id]
|
(loop [result [] id shape-id]
|
||||||
(if-let [parent-id (dm/get-in objects [id :parent-id])]
|
(let [parent-id (dm/get-in objects [id :parent-id])]
|
||||||
|
(if (and (some? parent-id) (not= parent-id id))
|
||||||
(recur (conj result parent-id) parent-id)
|
(recur (conj result parent-id) parent-id)
|
||||||
result)))
|
result))))
|
||||||
|
|
||||||
(defn get-frame
|
(defn get-frame
|
||||||
"Get the frame that contains the shape. If the shape is already a
|
"Get the frame that contains the shape. If the shape is already a
|
||||||
|
@ -241,16 +242,15 @@
|
||||||
(let [[base index-a index-b] (get-base objects base-shape-id over-shape-id)]
|
(let [[base index-a index-b] (get-base objects base-shape-id over-shape-id)]
|
||||||
(cond
|
(cond
|
||||||
(= base base-shape-id)
|
(= base base-shape-id)
|
||||||
|
(and (frame-shape? objects base-shape-id)
|
||||||
(and (frame-shape? objects over-shape-id)
|
(root-frame? objects base-shape-id))
|
||||||
(root-frame? objects over-shape-id))
|
|
||||||
|
|
||||||
(= base over-shape-id)
|
(= base over-shape-id)
|
||||||
(or (not (frame-shape? objects over-shape-id))
|
(or (not (frame-shape? objects over-shape-id))
|
||||||
(not (root-frame? objects over-shape-id)))
|
(not (root-frame? objects over-shape-id)))
|
||||||
|
|
||||||
:else
|
:else
|
||||||
(> index-a index-b))))
|
(< index-a index-b))))
|
||||||
|
|
||||||
(defn sort-z-index
|
(defn sort-z-index
|
||||||
([objects ids]
|
([objects ids]
|
||||||
|
@ -667,3 +667,10 @@
|
||||||
(if (empty? next-pending-ids)
|
(if (empty? next-pending-ids)
|
||||||
next-val
|
next-val
|
||||||
(recur next-val (first next-pending-ids) (rest next-pending-ids)))))))))
|
(recur next-val (first next-pending-ids) (rest next-pending-ids)))))))))
|
||||||
|
|
||||||
|
(defn selected-with-children
|
||||||
|
[objects selected]
|
||||||
|
|
||||||
|
(into selected
|
||||||
|
(mapcat #(get-children-ids objects %))
|
||||||
|
selected))
|
||||||
|
|
|
@ -79,8 +79,7 @@
|
||||||
[{:keys [shape] :as props}]
|
[{:keys [shape] :as props}]
|
||||||
(let [childs (mapv #(get objects %) (:shapes shape))
|
(let [childs (mapv #(get objects %) (:shapes shape))
|
||||||
shape (gsh/transform-shape shape)]
|
shape (gsh/transform-shape shape)]
|
||||||
[:> shape-container {:shape shape}
|
[:& frame-shape {:shape shape :childs childs}]))))
|
||||||
[:& frame-shape {:shape shape :childs childs}]]))))
|
|
||||||
|
|
||||||
(defn group-wrapper-factory
|
(defn group-wrapper-factory
|
||||||
[objects]
|
[objects]
|
||||||
|
@ -255,8 +254,9 @@
|
||||||
[:& frame/frame-thumbnail {:shape item}]]
|
[:& frame/frame-thumbnail {:shape item}]]
|
||||||
|
|
||||||
frame?
|
frame?
|
||||||
|
[:> shape-container {:shape item}
|
||||||
[:& frame-wrapper {:shape item
|
[:& frame-wrapper {:shape item
|
||||||
:key (:id item)}]
|
:key (:id item)}]]
|
||||||
:else
|
:else
|
||||||
[:& shape-wrapper {:shape item
|
[:& shape-wrapper {:shape item
|
||||||
:key (:id item)}])))]]]))
|
:key (:id item)}])))]]]))
|
||||||
|
@ -389,6 +389,7 @@
|
||||||
text-shapes (sequence (filter cph/text-shape?) (vals objects))
|
text-shapes (sequence (filter cph/text-shape?) (vals objects))
|
||||||
render-texts? (and render-texts? (d/seek (comp nil? :position-data) text-shapes))]
|
render-texts? (and render-texts? (d/seek (comp nil? :position-data) text-shapes))]
|
||||||
|
|
||||||
|
[:& (mf/provider export/include-metadata-ctx) {:value true}
|
||||||
[:& (mf/provider embed/context) {:value render-embed?}
|
[:& (mf/provider embed/context) {:value render-embed?}
|
||||||
[:svg {:id (dm/str "screenshot-" object-id)
|
[:svg {:id (dm/str "screenshot-" object-id)
|
||||||
:view-box vbox
|
:view-box vbox
|
||||||
|
@ -406,7 +407,8 @@
|
||||||
[:& ff/fontfaces-style {:fonts fonts}])
|
[:& ff/fontfaces-style {:fonts fonts}])
|
||||||
|
|
||||||
(case (:type object)
|
(case (:type object)
|
||||||
:frame [:& frame-wrapper {:shape object :view-box vbox}]
|
:frame [:> shape-container {:shape object}
|
||||||
|
[:& frame-wrapper {:shape object :view-box vbox}]]
|
||||||
:group [:> shape-container {:shape object}
|
:group [:> shape-container {:shape object}
|
||||||
[:& group-wrapper {:shape object}]]
|
[:& group-wrapper {:shape object}]]
|
||||||
[:& shape-wrapper {:shape object}])]
|
[:& shape-wrapper {:shape object}])]
|
||||||
|
@ -424,7 +426,7 @@
|
||||||
:xmlns "http://www.w3.org/2000/svg"
|
:xmlns "http://www.w3.org/2000/svg"
|
||||||
:xmlnsXlink "http://www.w3.org/1999/xlink"
|
:xmlnsXlink "http://www.w3.org/1999/xlink"
|
||||||
:fill "none"}
|
:fill "none"}
|
||||||
[:& shape-wrapper {:shape (assoc object :x 0 :y 0)}]]]))]))
|
[:& shape-wrapper {:shape (assoc object :x 0 :y 0)}]]]))]]))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; SPRITES (DEBUG)
|
;; SPRITES (DEBUG)
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
(ns app.main.ui.components.context-menu
|
(ns app.main.ui.components.context-menu
|
||||||
(:require
|
(:require
|
||||||
[app.common.data :as d]
|
[app.common.data :as d]
|
||||||
|
[app.common.data.macros :as dm]
|
||||||
[app.main.refs :as refs]
|
[app.main.refs :as refs]
|
||||||
[app.main.ui.components.dropdown :refer [dropdown']]
|
[app.main.ui.components.dropdown :refer [dropdown']]
|
||||||
[app.main.ui.icons :as i]
|
[app.main.ui.icons :as i]
|
||||||
|
@ -110,10 +111,10 @@
|
||||||
(for [[index [option-name option-handler sub-options data-test]] (d/enumerate (:options level))]
|
(for [[index [option-name option-handler sub-options data-test]] (d/enumerate (:options level))]
|
||||||
(when option-name
|
(when option-name
|
||||||
(if (= option-name :separator)
|
(if (= option-name :separator)
|
||||||
[:li.separator]
|
[:li.separator {:key (dm/str "context-item-" index)}]
|
||||||
[:li.context-menu-item
|
[:li.context-menu-item
|
||||||
{:class (dom/classnames :is-selected (and selected (= option-name selected)))
|
{:class (dom/classnames :is-selected (and selected (= option-name selected)))
|
||||||
:key index}
|
:key (dm/str "context-item-" index)}
|
||||||
(if-not sub-options
|
(if-not sub-options
|
||||||
[:a.context-menu-action {:on-click #(do (dom/stop-propagation %)
|
[:a.context-menu-action {:on-click #(do (dom/stop-propagation %)
|
||||||
(on-close)
|
(on-close)
|
||||||
|
|
|
@ -95,6 +95,10 @@
|
||||||
(add! :constraints-v)
|
(add! :constraints-v)
|
||||||
(add! :fixed-scroll)
|
(add! :fixed-scroll)
|
||||||
|
|
||||||
|
(cond-> frame?
|
||||||
|
(-> (add! :show-content)
|
||||||
|
(add! :hide-in-viewer)))
|
||||||
|
|
||||||
(cond-> (and (or rect? image? frame?) (some? (:r1 shape)))
|
(cond-> (and (or rect? image? frame?) (some? (:r1 shape)))
|
||||||
(-> (add! :r1)
|
(-> (add! :r1)
|
||||||
(add! :r2)
|
(add! :r2)
|
||||||
|
|
|
@ -789,10 +789,14 @@
|
||||||
:content node-content}))))
|
:content node-content}))))
|
||||||
|
|
||||||
(defn add-frame-data [props node]
|
(defn add-frame-data [props node]
|
||||||
(let [grids (parse-grids node)]
|
(let [grids (parse-grids node)
|
||||||
(cond-> props
|
show-content (get-meta node :show-content str->bool)
|
||||||
(d/not-empty? grids)
|
hide-in-viewer (get-meta node :hide-in-viewer str->bool)]
|
||||||
(assoc :grids grids))))
|
(-> props
|
||||||
|
(assoc :show-content show-content)
|
||||||
|
(assoc :hide-in-viewer hide-in-viewer)
|
||||||
|
(cond-> (d/not-empty? grids)
|
||||||
|
(assoc :grids grids)))))
|
||||||
|
|
||||||
(defn has-image?
|
(defn has-image?
|
||||||
[node]
|
[node]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue