0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-18 21:06:11 -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." "A version parsing helper."
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.common.geom.matrix :as gmt]
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.pages.changes :as ch] [app.common.pages.changes :as ch]
[app.common.pages.init :as init] [app.common.pages.init :as init]
@ -52,7 +53,49 @@
:parent-id parent-id :parent-id parent-id
:obj obj})))) :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] [type data]
(if (= type :svg-raw) (if (= type :svg-raw)
(let [tag (get-in data [:content :tag])] (let [tag (get-in data [:content :tag])]
@ -62,7 +105,7 @@
:else (str tag)))) :else (str tag))))
(str/capital (d/name type)))) (str/capital (d/name type))))
(defn check-name (defn- check-name
"Given a tag returns its layer name" "Given a tag returns its layer name"
[data file type] [data file type]
@ -123,6 +166,7 @@
(let [obj (-> (init/make-minimal-shape :frame) (let [obj (-> (init/make-minimal-shape :frame)
(merge data) (merge data)
(check-name file :frame) (check-name file :frame)
(setup-selrect)
(d/without-nils))] (d/without-nils))]
(-> file (-> file
(commit-shape obj) (commit-shape obj)
@ -153,19 +197,46 @@
(defn close-group [file] (defn close-group [file]
(let [group-id (-> file :parent-stack peek) (let [group-id (-> file :parent-stack peek)
group (lookup-shape file group-id) group (lookup-shape file group-id)
shapes (->> group :shapes (mapv #(lookup-shape file %))) children (->> group :shapes (mapv #(lookup-shape file %)))
selrect (gsh/selection-rect shapes)
points (gsh/rect->points selrect)] 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 (-> 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)))) (update :parent-stack pop))))
(defn create-shape [file type data] (defn create-shape [file type data]
@ -175,6 +246,7 @@
obj (-> (init/make-minimal-shape type) obj (-> (init/make-minimal-shape type)
(merge data) (merge data)
(check-name file :type) (check-name file :type)
(setup-selrect)
(d/without-nils)) (d/without-nils))
obj (cond-> obj obj (cond-> obj
frame (gsh/translate-from-frame frame))] frame (gsh/translate-from-frame frame))]
@ -219,7 +291,6 @@
(-> file (-> file
(update :parent-stack pop))) (update :parent-stack pop)))
(defn generate-changes (defn generate-changes
[file] [file]
(:changes file)) (:changes file))

View file

@ -51,22 +51,28 @@
(set! file (fb/close-group file))) (set! file (fb/close-group file)))
(createRect [self data] (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] (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] (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] (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] (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] (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] (closeSVG [self]
(set! file (fb/close-svg-raw file))) (set! file (fb/close-svg-raw file)))

View file

@ -189,31 +189,10 @@
(defn parse-path (defn parse-path
[props center svg-data] [props center svg-data]
(let [transform-inverse (:transform-inverse props (gmt/matrix)) (let [content (upp/parse-path (:d svg-data))]
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))]
(-> props (-> props
(assoc :content content) (assoc :content content)
(assoc :selrect selrect) (assoc :center center))))
(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))))
(def url-regex #"url\(#([^\)]*)\)") (def url-regex #"url\(#([^\)]*)\)")
@ -325,10 +304,7 @@
(parse-circle svg-data) (parse-circle svg-data)
(= type :path) (= type :path)
(parse-path center svg-data) (parse-path center svg-data))))
(or (has-position? type) (= type :svg-raw) (= type :circle))
(setup-selrect))))
(defn add-fill (defn add-fill
[props node svg-data] [props node svg-data]