mirror of
https://github.com/penpot/penpot.git
synced 2025-05-23 19:46:10 +02:00
✨ Export/Import and edgecases fixing
This commit is contained in:
parent
8c25ee7796
commit
75f8e473a5
11 changed files with 240 additions and 129 deletions
|
@ -8,89 +8,106 @@
|
|||
(:require
|
||||
[app.common.data :as d]
|
||||
[app.common.geom.shapes :as gsh]
|
||||
[app.common.geom.shapes.path :as gsp]
|
||||
[app.common.path.bool :as pb]
|
||||
[app.common.path.shapes-to-path :as stp]
|
||||
[app.main.ui.hooks :refer [use-equal-memo]]
|
||||
[app.main.ui.shapes.export :as use]
|
||||
[app.main.ui.shapes.path :refer [path-shape]]
|
||||
[app.util.object :as obj]
|
||||
[rumext.alpha :as mf]))
|
||||
|
||||
(mf/defc debug-bool
|
||||
{::mf/wrap-props false}
|
||||
[props]
|
||||
|
||||
(let [frame (obj/get props "frame")
|
||||
shape (obj/get props "shape")
|
||||
childs (obj/get props "childs")
|
||||
|
||||
[content-a content-b]
|
||||
(mf/use-memo
|
||||
(mf/deps shape childs)
|
||||
(fn []
|
||||
(let [childs (d/mapm #(-> %2 (gsh/translate-to-frame frame) gsh/transform-shape) childs)
|
||||
[content-a content-b]
|
||||
(->> (:shapes shape)
|
||||
(map #(get childs %))
|
||||
(filter #(not (:hidden %)))
|
||||
(map #(stp/convert-to-path % childs))
|
||||
(mapv :content)
|
||||
(mapv pb/add-previous))]
|
||||
(pb/content-intersect-split content-a content-b))))]
|
||||
[:g.debug-bool
|
||||
[:g.shape-a
|
||||
[:& path-shape {:shape (-> shape
|
||||
(assoc :type :path)
|
||||
(assoc :stroke-color "blue")
|
||||
(assoc :stroke-opacity 1)
|
||||
(assoc :stroke-width 0.5)
|
||||
(assoc :stroke-style :solid)
|
||||
(dissoc :fill-color :fill-opacity)
|
||||
(assoc :content content-b))
|
||||
:frame frame}]
|
||||
(for [{:keys [x y]} (gsp/content->points content-b)]
|
||||
[:circle {:cx x
|
||||
:cy y
|
||||
:r 2.5
|
||||
:style {:fill "blue"}}])]
|
||||
|
||||
[:g.shape-b
|
||||
[:& path-shape {:shape (-> shape
|
||||
(assoc :type :path)
|
||||
(assoc :stroke-color "red")
|
||||
(assoc :stroke-opacity 1)
|
||||
(assoc :stroke-width 0.5)
|
||||
(assoc :stroke-style :solid)
|
||||
(dissoc :fill-color :fill-opacity)
|
||||
(assoc :content content-a))
|
||||
:frame frame}]
|
||||
(for [{:keys [x y]} (gsp/content->points content-a)]
|
||||
[:circle {:cx x
|
||||
:cy y
|
||||
:r 1.25
|
||||
:style {:fill "red"}}])]])
|
||||
)
|
||||
|
||||
|
||||
(defn bool-shape
|
||||
[shape-wrapper]
|
||||
(mf/fnc bool-shape
|
||||
{::mf/wrap-props false}
|
||||
[props]
|
||||
(let [frame (obj/get props "frame")
|
||||
shape (obj/get props "shape")
|
||||
childs (obj/get props "childs")
|
||||
{::mf/wrap-props false}
|
||||
[props]
|
||||
(let [frame (obj/get props "frame")
|
||||
shape (obj/get props "shape")
|
||||
childs (obj/get props "childs")
|
||||
|
||||
childs (use-equal-memo childs)
|
||||
childs (use-equal-memo childs)
|
||||
|
||||
;;[content-a content-b]
|
||||
;;(mf/use-memo
|
||||
;; (mf/deps shape childs)
|
||||
;; (fn []
|
||||
;; (let [childs (d/mapm #(gsh/transform-shape %2) childs)
|
||||
;; [content-a content-b]
|
||||
;; (->> (:shapes shape)
|
||||
;; (map #(get childs %))
|
||||
;; (filter #(not (:hidden %)))
|
||||
;; (map #(stp/convert-to-path % childs))
|
||||
;; (mapv :content)
|
||||
;; (mapv pb/add-previous))]
|
||||
;; (pb/content-intersect-split content-a content-b))))
|
||||
include-metadata? (mf/use-ctx use/include-metadata-ctx)
|
||||
|
||||
;;_ (.log js/console "content-a" (clj->js content-a))
|
||||
;;_ (.log js/console "content-b" (clj->js content-b))
|
||||
|
||||
bool-content
|
||||
(mf/use-memo
|
||||
(mf/deps shape childs)
|
||||
(fn []
|
||||
(let [childs (d/mapm #(gsh/transform-shape %2) childs)]
|
||||
(->> (:shapes shape)
|
||||
(map #(get childs %))
|
||||
(filter #(not (:hidden %)))
|
||||
(map #(stp/convert-to-path % childs))
|
||||
(mapv :content)
|
||||
(pb/content-bool (:bool-type shape))))))
|
||||
]
|
||||
bool-content
|
||||
(mf/use-memo
|
||||
(mf/deps shape childs)
|
||||
(fn []
|
||||
(let [childs (d/mapm #(-> %2 (gsh/translate-to-frame frame) gsh/transform-shape) childs)]
|
||||
(->> (:shapes shape)
|
||||
(map #(get childs %))
|
||||
(filter #(not (:hidden %)))
|
||||
(map #(stp/convert-to-path % childs))
|
||||
(mapv :content)
|
||||
(pb/content-bool (:bool-type shape))))))]
|
||||
|
||||
[:*
|
||||
[:& shape-wrapper {:shape (-> shape
|
||||
(assoc :type :path)
|
||||
(assoc :content bool-content))
|
||||
:frame frame}]
|
||||
[:*
|
||||
[:& path-shape {:shape (assoc shape :content bool-content)}]
|
||||
|
||||
(when include-metadata?
|
||||
[:> "penpot:bool" {}
|
||||
(for [item (->> (:shapes shape) (mapv #(get childs %)))]
|
||||
[:& shape-wrapper {:frame frame
|
||||
:shape item
|
||||
:key (:id item)}])])
|
||||
|
||||
#_[:*
|
||||
[:g
|
||||
[:& shape-wrapper {:shape (-> shape
|
||||
(assoc :type :path)
|
||||
(assoc :stroke-color "blue")
|
||||
(assoc :stroke-opacity 1)
|
||||
(assoc :stroke-width 0.5)
|
||||
(assoc :stroke-style :solid)
|
||||
(dissoc :fill-color :fill-opacity)
|
||||
(assoc :content content-b))
|
||||
:frame frame}]
|
||||
(for [{:keys [x y]} (app.common.geom.shapes.path/content->points content-b)]
|
||||
[:circle {:cx x
|
||||
:cy y
|
||||
:r 2.5
|
||||
:style {:fill "blue"}}])]
|
||||
|
||||
[:g
|
||||
[:& shape-wrapper {:shape (-> shape
|
||||
(assoc :type :path)
|
||||
(assoc :stroke-color "red")
|
||||
(assoc :stroke-opacity 1)
|
||||
(assoc :stroke-width 0.5)
|
||||
(assoc :stroke-style :solid)
|
||||
(dissoc :fill-color :fill-opacity)
|
||||
(assoc :content content-a))
|
||||
:frame frame}]
|
||||
(for [{:keys [x y]} (app.common.geom.shapes.path/content->points content-a)]
|
||||
[:circle {:cx x
|
||||
:cy y
|
||||
:r 1.25
|
||||
:style {:fill "red"}}])]]])))
|
||||
#_[:& debug-bool {:frame frame
|
||||
:shape shape
|
||||
:childs childs}]])))
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
text? (= :text (:type shape))
|
||||
path? (= :path (:type shape))
|
||||
mask? (and group? (:masked-group? shape))
|
||||
bool? (= :bool (:type shape))
|
||||
center (gsh/center-shape shape)]
|
||||
(-> props
|
||||
(add! :name)
|
||||
|
@ -102,7 +103,10 @@
|
|||
(add! :content (comp json/encode uuid->string))))
|
||||
|
||||
(cond-> mask?
|
||||
(obj/set! "penpot:masked-group" "true")))))
|
||||
(obj/set! "penpot:masked-group" "true"))
|
||||
|
||||
(cond-> bool?
|
||||
(add! :bool-type)))))
|
||||
|
||||
|
||||
(defn add-library-refs [props shape]
|
||||
|
|
|
@ -72,6 +72,7 @@
|
|||
[:> wrapper-tag wrapper-props
|
||||
(when include-metadata?
|
||||
[:& ed/export-data {:shape shape}])
|
||||
|
||||
[:defs
|
||||
[:& defs/svg-defs {:shape shape :render-id render-id}]
|
||||
[:& filters/filters {:shape shape :filter-id filter-id}]
|
||||
|
|
|
@ -201,11 +201,12 @@
|
|||
|
||||
[:& use/export-page {:options options}]
|
||||
|
||||
[:& (mf/provider embed/context) {:value true}
|
||||
;; Render root shape
|
||||
[:& shapes/root-shape {:key page-id
|
||||
:objects objects
|
||||
:active-frames @active-frames}]]]
|
||||
[:& (mf/provider use/include-metadata-ctx) {:value true}
|
||||
[:& (mf/provider embed/context) {:value true}
|
||||
;; Render root shape
|
||||
[:& shapes/root-shape {:key page-id
|
||||
:objects objects
|
||||
:active-frames @active-frames}]]]]
|
||||
|
||||
[:svg.viewport-controls
|
||||
{:xmlns "http://www.w3.org/2000/svg"
|
||||
|
|
|
@ -209,6 +209,13 @@
|
|||
(->> node :content last))]
|
||||
(merge (add-attrs {} (:attrs svg-node)) node-attrs))
|
||||
|
||||
(= type :bool)
|
||||
(->> node
|
||||
(:content)
|
||||
(filter #(= :path (:tag %)))
|
||||
(map #(:attrs %))
|
||||
(reduce add-attrs node-attrs))
|
||||
|
||||
:else
|
||||
node-attrs)))
|
||||
|
||||
|
@ -443,6 +450,11 @@
|
|||
mask?
|
||||
(assoc :masked-group? true))))
|
||||
|
||||
(defn add-bool-data
|
||||
[props node]
|
||||
(-> props
|
||||
(assoc :bool-type (get-meta node :bool-type keyword))))
|
||||
|
||||
(defn parse-shadow [node]
|
||||
{:id (uuid/next)
|
||||
:style (get-meta node :shadow-type keyword)
|
||||
|
@ -706,7 +718,10 @@
|
|||
(add-image-data type node))
|
||||
|
||||
(cond-> (= :text type)
|
||||
(add-text-data node))))))
|
||||
(add-text-data node))
|
||||
|
||||
(cond-> (= :bool type)
|
||||
(add-bool-data node))))))
|
||||
|
||||
(defn parse-page-data
|
||||
[node]
|
||||
|
|
|
@ -81,8 +81,8 @@
|
|||
last-move (if current-move? point last-move)]
|
||||
|
||||
(if (and (not current-move?) (pt= last-move point))
|
||||
(println (command->string (set-point current last-move)))
|
||||
(println (command->string current)))
|
||||
(print (command->string (set-point current last-move)))
|
||||
(print (command->string current)))
|
||||
|
||||
(when (and (not current-move?) (pt= last-move point))
|
||||
(print "Z"))
|
||||
|
|
|
@ -202,6 +202,7 @@
|
|||
(case type
|
||||
:frame (fb/close-artboard file)
|
||||
:group (fb/close-group file)
|
||||
:bool (fb/close-bool file)
|
||||
:svg-raw (fb/close-svg-raw file)
|
||||
#_default file)
|
||||
|
||||
|
@ -218,6 +219,7 @@
|
|||
file (case type
|
||||
:frame (fb/add-artboard file data)
|
||||
:group (fb/add-group file data)
|
||||
:bool (fb/add-bool file data)
|
||||
:rect (fb/create-rect file data)
|
||||
:circle (fb/create-circle file data)
|
||||
:path (fb/create-path file data)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue