From 9af0e6ca442a92b5c344cf9495842d757d917b72 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 27 Feb 2023 16:43:59 +0100 Subject: [PATCH 1/3] :bug: Fix problem when creating layout from selection --- .../src/app/main/data/workspace/shape_layout.cljs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frontend/src/app/main/data/workspace/shape_layout.cljs b/frontend/src/app/main/data/workspace/shape_layout.cljs index 6e7c6df84d..c708bb93a7 100644 --- a/frontend/src/app/main/data/workspace/shape_layout.cljs +++ b/frontend/src/app/main/data/workspace/shape_layout.cljs @@ -183,6 +183,13 @@ (-> shape (assoc :layout-item-h-sizing :auto :layout-item-v-sizing :auto)))) + ;; Set the children to fixed to remove strange interactions + (dwc/update-shapes + selected + (fn [shape] + (-> shape + (assoc :layout-item-h-sizing :fix + :layout-item-v-sizing :fix)))) (ptk/data-event :layout/update [new-shape-id]) (dws/delete-shapes page-id selected) @@ -204,6 +211,13 @@ (merge flex-params) (assoc :layout-item-h-sizing :auto :layout-item-v-sizing :auto)))) + ;; Set the children to fixed to remove strange interactions + (dwc/update-shapes + selected + (fn [shape] + (-> shape + (assoc :layout-item-h-sizing :fix + :layout-item-v-sizing :fix)))) (ptk/data-event :layout/update [new-shape-id]) (dwu/commit-undo-transaction undo-id)))))))) From 8f2e3d5fe40dbd19a4ce4ebeff1c3120dcd8b46f Mon Sep 17 00:00:00 2001 From: Eva Date: Fri, 24 Feb 2023 13:23:47 +0100 Subject: [PATCH 2/3] :bug: Fix copy paste a very nested boards inside itself --- CHANGES.md | 9 +-- frontend/src/app/main/data/workspace.cljs | 83 +++++++++++++---------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 8ccddfb217..7e028548a1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,9 @@ # CHANGELOG +## 1.17.3 + +### :bug: Bugs fixed +- Fix copy and paste very nested inside itself [Taiga #4848](https://tree.taiga.io/project/penpot/issue/4848) + ## 1.17.2 ### :bug: Bugs fixed @@ -8,10 +13,6 @@ - Fix correct behaviour for space-around and added space-evenly option - Fix duplicate with alt and undo only undo one step [Taiga #4746](https://tree.taiga.io/project/penpot/issue/4746) - Fix problem creating frames inside layout [Taiga #4844](https://tree.taiga.io/project/penpot/issue/4844) - -## 1.17.2 - -### :bug: Bugs fixed - Fix paste board inside itself [Taiga #4775](https://tree.taiga.io/project/penpot/issue/4775) - Fix middle button panning can drag guides [Taiga #4266](https://tree.taiga.io/project/penpot/issue/4266) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index f5ec2bfb70..5ef562b6b2 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -429,7 +429,7 @@ name (cp/generate-unique-name unames (:name page)) no_thumbnails_objects (->> (:objects page) - (d/mapm (fn [_ val] (dissoc val :use-for-thumbnail?)))) + (d/mapm (fn [_ val] (dissoc val :use-for-thumbnail?)))) page (-> page (assoc :name name :id id :objects no_thumbnails_objects)) @@ -1099,13 +1099,13 @@ qparams {:page-id page-id}] ;; qparams {:page-id page-id :layout :assets}] (rx/merge - (rx/of (rt/nav :workspace pparams qparams)) - (->> stream - (rx/filter (ptk/type? ::dwv/initialize-viewport)) - (rx/take 1) - (rx/mapcat #(do - (on-page-selected) - (rx/of (dws/select-shapes (lks/set shape-id))))))))))))) + (rx/of (rt/nav :workspace pparams qparams)) + (->> stream + (rx/filter (ptk/type? ::dwv/initialize-viewport)) + (rx/take 1) + (rx/mapcat #(do + (on-page-selected) + (rx/of (dws/select-shapes (lks/set shape-id))))))))))))) (defn go-to-component [component-id] @@ -1440,9 +1440,17 @@ (and (= 1 (count selected)) (= :frame (get-in objects [(first selected) :type]))))) -(defn same-frame-from-selected? [state frame-id] - (let [selected (wsh/lookup-selected state)] - (contains? frame-id (first selected)))) +(defn get-tree-root-shapes [tree] + ;; This fn gets a map of shapes and finds what shapes are parent of the rest + (let [shapes-in-tree (vals tree) + shape-ids (keys tree) + parent-ids (set (map #(:parent-id %) shapes-in-tree))] + (->> shape-ids + (filter #(contains? parent-ids %))))) + +(defn any-same-frame-from-selected? [state frame-ids] + (let [selected (first (wsh/lookup-selected state))] + (< 0 (count (filter #(= % selected) frame-ids))))) (defn frame-same-size? [paste-obj frame-obj] @@ -1491,22 +1499,27 @@ item)) (calculate-paste-position [state mouse-pos in-viewport?] - (let [page-objects (wsh/lookup-page-objects state) - selected-objs (map #(get paste-objects %) selected) - first-selected-obj (first selected-objs) - page-selected (wsh/lookup-selected state) - wrapper (gsh/selection-rect selected-objs) - orig-pos (gpt/point (:x1 wrapper) (:y1 wrapper)) - frame-id (first page-selected) - frame-object (get page-objects frame-id) - base (cph/get-base-shape page-objects page-selected) - index (cph/get-position-on-parent page-objects (:id base))] + (let [page-objects (wsh/lookup-page-objects state) + selected-objs (map #(get paste-objects %) selected) + first-selected-obj (first selected-objs) + page-selected (wsh/lookup-selected state) + wrapper (gsh/selection-rect selected-objs) + orig-pos (gpt/point (:x1 wrapper) (:y1 wrapper)) + frame-id (first page-selected) + frame-object (get page-objects frame-id) + base (cph/get-base-shape page-objects page-selected) + index (cph/get-position-on-parent page-objects (:id base)) + tree-root (get-tree-root-shapes paste-objects) + only-one-root-shape? (and + (< 1 (count paste-objects)) + (= 1 (count tree-root)))] (cond (selected-frame? state) - (if (or (same-frame-from-selected? state (first (vals paste-objects))) - (frame-same-size? paste-objects frame-object)) + (if (or (any-same-frame-from-selected? state (keys paste-objects)) + (and only-one-root-shape? + (frame-same-size? paste-objects (first tree-root)))) ;; Paste next to selected frame, if selected is itself or of the same size as the copied (let [selected-frame-obj (get page-objects (first page-selected)) parent-id (:parent-id base) @@ -1544,7 +1557,7 @@ ;; - Respect the distance of the object to the right and bottom in the original frame (gpt/point paste-x paste-y))] [frame-id frame-id delta])) - + (empty? page-selected) (let [frame-id (ctst/top-nested-frame page-objects mouse-pos) delta (gpt/subtract mouse-pos orig-pos)] @@ -1837,8 +1850,8 @@ (dwm/create-shapes-img pos media-obj))] (->> (rx/concat - (rx/of (update-remove-graphics index)) - (rx/map process-shapes shapes)) + (rx/of (update-remove-graphics index)) + (rx/map process-shapes shapes)) (rx/catch #(do (log/error :msg (str "Error removing " (:name media-obj)) :hint (ex-message %) @@ -1872,15 +1885,15 @@ (ctst/generate-shape-grid media-points start-pos grid-gap)] (rx/concat - (rx/of (modal/show {:type :remove-graphics-dialog :file-name file-name}) - (initialize-remove-graphics (count media))) - (when new-page? - (rx/of (dch/commit-changes (-> (pcb/empty-changes it) - (pcb/set-save-undo? false) - (pcb/add-page (:id page) page))))) - (rx/mapcat (partial remove-graphic it file-data' page) - (rx/from (d/enumerate (d/zip media shape-grid)))) - (rx/of (complete-remove-graphics))))))) + (rx/of (modal/show {:type :remove-graphics-dialog :file-name file-name}) + (initialize-remove-graphics (count media))) + (when new-page? + (rx/of (dch/commit-changes (-> (pcb/empty-changes it) + (pcb/set-save-undo? false) + (pcb/add-page (:id page) page))))) + (rx/mapcat (partial remove-graphic it file-data' page) + (rx/from (d/enumerate (d/zip media shape-grid)))) + (rx/of (complete-remove-graphics))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Read only From ccf91a129c798b9efde76642db7c55fec90e16ce Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 24 Feb 2023 10:50:35 +0100 Subject: [PATCH 3/3] :bug: Fix custom fonts not rendered correctly --- CHANGES.md | 1 + frontend/src/app/main/data/workspace.cljs | 98 ++++++++++++----------- 2 files changed, 54 insertions(+), 45 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 7e028548a1..83eeaef7eb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,7 @@ ### :bug: Bugs fixed - Fix copy and paste very nested inside itself [Taiga #4848](https://tree.taiga.io/project/penpot/issue/4848) +- Fix custom fonts not rendered correctly [Taiga #4874](https://tree.taiga.io/project/penpot/issue/4874) ## 1.17.2 diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 5ef562b6b2..c4c1ad6d90 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -177,56 +177,64 @@ (watch [_ _ stream] (let [team-id (:team-id project) stoper (rx/filter (ptk/type? ::bundle-fetched) stream)] - (->> (rx/merge - ;; Initialize notifications & load team fonts + (->> (rx/concat + ;; Initialize notifications (rx/of (dwn/initialize team-id id) - (dwsl/initialize) - (df/load-team-fonts team-id)) + (dwsl/initialize)) - ;; Load all pages, independently if they are pointers or already - ;; resolved values. - (->> (rx/from (seq (:pages-index data))) - (rx/merge-map - (fn [[_ page :as kp]] - (if (t/pointer? page) - (resolve-pointer id kp) - (rx/of kp)))) - (rx/merge-map - (fn [[id page]] - (let [page (update page :objects ctst/start-page-index)] - (->> (uw/ask! {:cmd :initialize-page-index :page page}) - (rx/map (constantly [id page])))))) - (rx/reduce conj {}) - (rx/map (fn [pages-index] - (-> data - (assoc :pages-index pages-index) - (workspace-data-loaded))))) + ;; Load team fonts. We must ensure custom fonts are fully loadad before starting the workspace load + (rx/merge + (->> stream + (rx/filter (ptk/type? :app.main.data.fonts/team-fonts-loaded)) + (rx/take 1) + (rx/ignore)) + (rx/of (df/load-team-fonts team-id))) - ;; Once workspace data is loaded, proceed asynchronously load - ;; the local library and all referenced libraries, without - ;; blocking the main workspace load process. - (->> stream - (rx/filter (ptk/type? ::workspace-data-loaded)) - (rx/take 1) - (rx/merge-map - (fn [_] - (rx/merge - (rx/of (workspace-initialized)) + (rx/merge + ;; Load all pages, independently if they are pointers or already + ;; resolved values. + (->> (rx/from (seq (:pages-index data))) + (rx/merge-map + (fn [[_ page :as kp]] + (if (t/pointer? page) + (resolve-pointer id kp) + (rx/of kp)))) + (rx/merge-map + (fn [[id page]] + (let [page (update page :objects ctst/start-page-index)] + (->> (uw/ask! {:cmd :initialize-page-index :page page}) + (rx/map (constantly [id page])))))) + (rx/reduce conj {}) + (rx/map (fn [pages-index] + (-> data + (assoc :pages-index pages-index) + (workspace-data-loaded))))) - (->> data - (filter (comp t/pointer? val)) - (resolve-pointers id) - (rx/map workspace-data-pointers-loaded)) + ;; Once workspace data is loaded, proceed asynchronously load + ;; the local library and all referenced libraries, without + ;; blocking the main workspace load process. + (->> stream + (rx/filter (ptk/type? ::workspace-data-loaded)) + (rx/take 1) + (rx/merge-map + (fn [_] + (rx/merge + (rx/of (workspace-initialized)) - (->> (rp/cmd! :get-file-libraries {:file-id id :features features}) - (rx/mapcat identity) - (rx/mapcat - (fn [{:keys [id data] :as file}] - (->> (filter (comp t/pointer? val) data) - (resolve-pointers id) - (rx/map #(update file :data merge %))))) - (rx/reduce conj []) - (rx/map libraries-fetched))))))) + (->> data + (filter (comp t/pointer? val)) + (resolve-pointers id) + (rx/map workspace-data-pointers-loaded)) + + (->> (rp/cmd! :get-file-libraries {:file-id id :features features}) + (rx/mapcat identity) + (rx/mapcat + (fn [{:keys [id data] :as file}] + (->> (filter (comp t/pointer? val) data) + (resolve-pointers id) + (rx/map #(update file :data merge %))))) + (rx/reduce conj []) + (rx/map libraries-fetched)))))))) (rx/take-until stoper)))))))