From c82d936e9651ad064b3a626a4b1201377abe9294 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 17 Jun 2021 12:34:33 +0200 Subject: [PATCH] :sparkles: Improves selrect calculation --- common/src/app/common/file_builder.cljc | 99 ++++++++++++++++++++---- frontend/src/app/libs/file_builder.cljs | 18 +++-- frontend/src/app/util/import/parser.cljc | 30 +------ 3 files changed, 100 insertions(+), 47 deletions(-) diff --git a/common/src/app/common/file_builder.cljc b/common/src/app/common/file_builder.cljc index c2cd12a07b..17d2fef26b 100644 --- a/common/src/app/common/file_builder.cljc +++ b/common/src/app/common/file_builder.cljc @@ -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)) diff --git a/frontend/src/app/libs/file_builder.cljs b/frontend/src/app/libs/file_builder.cljs index 8d64cbb3a8..0560b919a6 100644 --- a/frontend/src/app/libs/file_builder.cljs +++ b/frontend/src/app/libs/file_builder.cljs @@ -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))) diff --git a/frontend/src/app/util/import/parser.cljc b/frontend/src/app/util/import/parser.cljc index 83ace5ca2f..7855017a1b 100644 --- a/frontend/src/app/util/import/parser.cljc +++ b/frontend/src/app/util/import/parser.cljc @@ -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]