diff --git a/common/src/app/common/geom/shapes/text.cljc b/common/src/app/common/geom/shapes/text.cljc index 9fdb0b34b..af23e0c15 100644 --- a/common/src/app/common/geom/shapes/text.cljc +++ b/common/src/app/common/geom/shapes/text.cljc @@ -28,3 +28,11 @@ [shape] (gpr/points->selrect (position-data-points shape))) +(defn overlaps-position-data? + "Checks if the given position data is inside the shape" + [{:keys [points]} position-data] + (let [bounding-box (gpr/points->selrect points) + fix-rect #(assoc % :y (- (:y %) (:height %)))] + (->> position-data + (some #(gpr/overlaps-rects? bounding-box (fix-rect %))) + (boolean)))) diff --git a/common/src/app/common/pages/common.cljc b/common/src/app/common/pages/common.cljc index 825558259..c412176f6 100644 --- a/common/src/app/common/pages/common.cljc +++ b/common/src/app/common/pages/common.cljc @@ -9,7 +9,7 @@ [app.common.colors :as clr] [app.common.uuid :as uuid])) -(def file-version 18) +(def file-version 19) (def default-color clr/gray-20) (def root uuid/zero) diff --git a/common/src/app/common/pages/migrations.cljc b/common/src/app/common/pages/migrations.cljc index eb0f1c77f..d2beb3ce0 100644 --- a/common/src/app/common/pages/migrations.cljc +++ b/common/src/app/common/pages/migrations.cljc @@ -10,6 +10,7 @@ [app.common.geom.matrix :as gmt] [app.common.geom.shapes :as gsh] [app.common.geom.shapes.path :as gsp] + [app.common.geom.shapes.text :as gsht] [app.common.logging :as l] [app.common.math :as mth] [app.common.pages :as cp] @@ -415,5 +416,21 @@ (update :pages-index d/update-vals update-container) (update :components d/update-vals update-container)))) +(defmethod migrate 19 + [data] + (letfn [(update-object [object] + (cond-> object + (and (cph/text-shape? object) + (d/not-empty? (:position-data object)) + (not (gsht/overlaps-position-data? object (:position-data object)))) + (dissoc :position-data))) + + (update-container [container] + (update container :objects d/update-vals update-object))] + + (-> data + (update :pages-index d/update-vals update-container) + (update :components d/update-vals update-container)))) + ;; TODO: pending to do a migration for delete already not used fill ;; and stroke props. This should be done for >1.14.x version. diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 826650731..951f5dae9 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -150,7 +150,11 @@ :workspace-undo {} :workspace-project project :workspace-file (assoc file :initialized true) - :workspace-data (:data file) + :workspace-data (-> (:data file) + ;; DEBUG: Uncomment this to try out migrations in local without changing + ;; the version number + #_(assoc :version 17) + #_(app.common.pages.migrations/migrate-data 19)) :workspace-libraries (d/index-by :id libraries))) ptk/WatchEvent diff --git a/frontend/src/app/main/ui/workspace/shapes/frame/thumbnail_render.cljs b/frontend/src/app/main/ui/workspace/shapes/frame/thumbnail_render.cljs index 5fd7d4eeb..1e763a462 100644 --- a/frontend/src/app/main/ui/workspace/shapes/frame/thumbnail_render.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/frame/thumbnail_render.cljs @@ -144,7 +144,7 @@ (mf/use-effect (mf/deps @render-frame? thumbnail-data) (fn [] - (if (and (some? thumbnail-data) @render-frame?) + (when (and (some? thumbnail-data) @render-frame?) (reset! render-frame? false)))) (mf/use-effect diff --git a/frontend/src/app/main/ui/workspace/shapes/text/viewport_texts.cljs b/frontend/src/app/main/ui/workspace/shapes/text/viewport_texts.cljs index f823fb880..3aca3072c 100644 --- a/frontend/src/app/main/ui/workspace/shapes/text/viewport_texts.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/text/viewport_texts.cljs @@ -9,7 +9,7 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.geom.shapes :as gsh] - [app.common.geom.shapes.rect :as gshr] + [app.common.geom.shapes.text :as gsht] [app.common.math :as mth] [app.common.pages.helpers :as cph] [app.common.text :as txt] @@ -22,7 +22,7 @@ [app.util.dom :as dom] [app.util.object :as obj] [app.util.text-editor :as ted] - [app.util.text-svg-position :as utp] + [app.util.text-svg-position :as tsp] [app.util.timers :as ts] [promesa.core :as p] [rumext.alpha :as mf])) @@ -62,38 +62,30 @@ (and (some? shape) (some? editor-content)) (assoc :content (d/txt-merge content editor-content))))) -(defn overlaps-position-data? - [bounding-box position-data] - (let [fix-rect #(assoc % :y (- (:y %) (:height %)))] - (->> position-data - (some #(gshr/overlaps-rects? bounding-box (fix-rect %))) - (boolean)))) - (defn- update-text-shape - [{:keys [grow-type id migrate points]} node] + [{:keys [grow-type id migrate] :as shape} node] ;; Check if we need to update the size because it's auto-width or auto-height ;; Update the position-data of every text fragment - (p/let [position-data (utp/calc-position-data node)] - (let [bounding-box (gsh/points->selrect points)] - ;; At least one paragraph needs to be inside the bounding box - (when (overlaps-position-data? bounding-box position-data) - (st/emit! (dwt/update-position-data id position-data))) + (p/let [position-data (tsp/calc-position-data node)] + ;; At least one paragraph needs to be inside the bounding box + (when (gsht/overlaps-position-data? shape position-data) + (st/emit! (dwt/update-position-data id position-data))) - (when (contains? #{:auto-height :auto-width} grow-type) - (let [{:keys [width height]} - (-> (dom/query node ".paragraph-set") - (dom/get-client-size)) - width (mth/ceil width) - height (mth/ceil height)] - (when (and (not (mth/almost-zero? width)) - (not (mth/almost-zero? height)) - (not migrate)) - (st/emit! (dwt/resize-text id width height)))))) + (when (contains? #{:auto-height :auto-width} grow-type) + (let [{:keys [width height]} + (-> (dom/query node ".paragraph-set") + (dom/get-client-size)) + width (mth/ceil width) + height (mth/ceil height)] + (when (and (not (mth/almost-zero? width)) + (not (mth/almost-zero? height)) + (not migrate)) + (st/emit! (dwt/resize-text id width height))))) (st/emit! (dwt/clean-text-modifier id)))) (defn- update-text-modifier [{:keys [grow-type id]} node] - (p/let [position-data (utp/calc-position-data node) + (p/let [position-data (tsp/calc-position-data node) props {:position-data position-data} props