0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-13 02:28:18 -05:00

Improves selrect calculation

This commit is contained in:
alonso.torres 2021-06-17 12:34:33 +02:00 committed by Andrés Moya
parent 7b4603e33e
commit c82d936e96
3 changed files with 100 additions and 47 deletions

View file

@ -8,6 +8,7 @@
"A version parsing helper."
(:require
[app.common.data :as d]
[app.common.geom.matrix :as gmt]
[app.common.geom.shapes :as gsh]
[app.common.pages.changes :as ch]
[app.common.pages.init :as init]
@ -52,7 +53,49 @@
:parent-id parent-id
:obj obj}))))
(defn generate-name
(defn setup-rect-selrect [obj]
(let [rect (select-keys obj [:x :y :width :height])
center (gsh/center-rect rect)
transform (:transform obj (gmt/matrix))
selrect (gsh/rect->selrect rect)
points (-> (gsh/rect->points rect)
(gsh/transform-points center transform))]
(assoc obj
:selrect selrect
:points points)))
(defn- setup-path-selrect
[obj]
(let [content (:content obj)
center (:center obj)
transform-inverse
(->> (:transform-inverse obj (gmt/matrix))
(gmt/transform-in center))
transform
(->> (:transform obj (gmt/matrix))
(gmt/transform-in center))
content' (gsh/transform-content content transform-inverse)
selrect (gsh/content->selrect content')
points (-> (gsh/rect->points selrect)
(gsh/transform-points transform))]
(-> obj
(dissoc :center)
(assoc :selrect selrect)
(assoc :points points))))
(defn- setup-selrect
[obj]
(if (= (:type obj) :path)
(setup-path-selrect obj)
(setup-rect-selrect obj)))
(defn- generate-name
[type data]
(if (= type :svg-raw)
(let [tag (get-in data [:content :tag])]
@ -62,7 +105,7 @@
:else (str tag))))
(str/capital (d/name type))))
(defn check-name
(defn- check-name
"Given a tag returns its layer name"
[data file type]
@ -123,6 +166,7 @@
(let [obj (-> (init/make-minimal-shape :frame)
(merge data)
(check-name file :frame)
(setup-selrect)
(d/without-nils))]
(-> file
(commit-shape obj)
@ -153,19 +197,46 @@
(defn close-group [file]
(let [group-id (-> file :parent-stack peek)
group (lookup-shape file group-id)
shapes (->> group :shapes (mapv #(lookup-shape file %)))
selrect (gsh/selection-rect shapes)
points (gsh/rect->points selrect)]
children (->> group :shapes (mapv #(lookup-shape file %)))
file
(cond
(empty? children)
(commit-change
file
{:type :del-obj
:page-id (:current-page-id file)
:id group-id})
(:masked-group? group)
(let [mask (first children)]
(commit-change
file
{:type :mod-obj
:page-id (:current-page-id file)
:id group-id
:operations
[{:type :set :attr :x :val (-> mask :selrect :x)}
{:type :set :attr :y :val (-> mask :selrect :y)}
{:type :set :attr :width :val (-> mask :selrect :width)}
{:type :set :attr :height :val (-> mask :selrect :height)}
{:type :set :attr :flip-x :val (-> mask :flip-x)}
{:type :set :attr :flip-y :val (-> mask :flip-y)}
{:type :set :attr :selrect :val (-> mask :selrect)}
{:type :set :attr :points :val (-> mask :points)}]}))
:else
(let [group' (gsh/update-group-selrect group children)]
(commit-change
file
{:type :mod-obj
:page-id (:current-page-id file)
:id group-id
:operations
[{:type :set :attr :selrect :val (:selrect group')}
{:type :set :attr :points :val (:points group')}]})))]
(-> file
(cond-> (not (empty? shapes))
(commit-change
{:type :mod-obj
:page-id (:current-page-id file)
:id group-id
:operations
[{:type :set :attr :selrect :val selrect}
{:type :set :attr :points :val points}]}))
(update :parent-stack pop))))
(defn create-shape [file type data]
@ -175,6 +246,7 @@
obj (-> (init/make-minimal-shape type)
(merge data)
(check-name file :type)
(setup-selrect)
(d/without-nils))
obj (cond-> obj
frame (gsh/translate-from-frame frame))]
@ -219,7 +291,6 @@
(-> file
(update :parent-stack pop)))
(defn generate-changes
[file]
(:changes file))

View file

@ -51,22 +51,28 @@
(set! file (fb/close-group file)))
(createRect [self data]
(set! file (fb/create-rect file (parse-data data))))
(set! file (fb/create-rect file (parse-data data)))
(str (:last-id file)))
(createCircle [self data]
(set! file (fb/create-circle file (parse-data data))))
(set! file (fb/create-circle file (parse-data data)))
(str (:last-id file)))
(createPath [self data]
(set! file (fb/create-path file (parse-data data))))
(set! file (fb/create-path file (parse-data data)))
(str (:last-id file)))
(createText [self data]
(set! file (fb/create-text file (parse-data data))))
(set! file (fb/create-text file (parse-data data)))
(str (:last-id file)))
(createImage [self data]
(set! file (fb/create-image file (parse-data data))))
(set! file (fb/create-image file (parse-data data)))
(str (:last-id file)))
(createSVG [self data]
(set! file (fb/create-svg-raw file (parse-data data))))
(set! file (fb/create-svg-raw file (parse-data data)))
(str (:last-id file)))
(closeSVG [self]
(set! file (fb/close-svg-raw file)))

View file

@ -189,31 +189,10 @@
(defn parse-path
[props center svg-data]
(let [transform-inverse (:transform-inverse props (gmt/matrix))
transform (:transform props (gmt/matrix))
content (upp/parse-path (:d svg-data))
content-tr (gsh/transform-content
content
(gmt/transform-in center transform-inverse))
selrect (gsh/content->selrect content-tr)
points (-> (gsh/rect->points selrect)
(gsh/transform-points center transform))]
(let [content (upp/parse-path (:d svg-data))]
(-> props
(assoc :content content)
(assoc :selrect selrect)
(assoc :points points))))
(defn setup-selrect [props]
(let [data (select-keys props [:x :y :width :height])
transform (:transform props (gmt/matrix))
selrect (gsh/rect->selrect data)
points (gsh/rect->points data)
center (gsh/center-rect data)]
(assoc props
:selrect selrect
:points (gsh/transform-points points center transform))))
(assoc :center center))))
(def url-regex #"url\(#([^\)]*)\)")
@ -325,10 +304,7 @@
(parse-circle svg-data)
(= type :path)
(parse-path center svg-data)
(or (has-position? type) (= type :svg-raw) (= type :circle))
(setup-selrect))))
(parse-path center svg-data))))
(defn add-fill
[props node svg-data]