diff --git a/common/src/app/common/types/shape/layout.cljc b/common/src/app/common/types/shape/layout.cljc index 215d9709cf..c5eb7d6ccc 100644 --- a/common/src/app/common/types/shape/layout.cljc +++ b/common/src/app/common/types/shape/layout.cljc @@ -328,24 +328,21 @@ (defn paddings [{:keys [layout-padding-type layout-padding]}] - (let [{pad-top :p1 pad-right :p2 pad-bottom :p3 pad-left :p4} layout-padding] + (let [{pad-top :p1 pad-right :p2 pad-bottom :p3 pad-left :p4 + :or {pad-top 0 pad-right 0 pad-bottom 0 pad-left 0}} layout-padding] (if (= :simple layout-padding-type) [pad-top pad-right pad-top pad-right] [pad-top pad-right pad-bottom pad-left]))) (defn h-padding - [{:keys [layout-padding-type layout-padding]}] - (let [{pad-right :p2 pad-left :p4} layout-padding] - (if (= :simple layout-padding-type) - (+ pad-right pad-right) - (+ pad-right pad-left)))) + [shape] + (let [[_ right _ left] (paddings shape)] + (+ right left))) (defn v-padding - [{:keys [layout-padding-type layout-padding]}] - (let [{pad-top :p1 pad-bottom :p3} layout-padding] - (if (= :simple layout-padding-type) - (+ pad-top pad-top) - (+ pad-top pad-bottom)))) + [shape] + (let [[top _ bottom _] (paddings shape)] + (+ top bottom))) (defn padding-type-for "`:simple` when top≈bottom and left≈right, `:multiple` otherwise (nil sides = 0)." diff --git a/common/test/common_tests/geom_bounds_layout_nil_test.cljc b/common/test/common_tests/geom_bounds_layout_nil_test.cljc index dda9fa957f..a0b5d728a1 100644 --- a/common/test/common_tests/geom_bounds_layout_nil_test.cljc +++ b/common/test/common_tests/geom_bounds_layout_nil_test.cljc @@ -11,7 +11,9 @@ [app.common.geom.point :as gpt] [app.common.geom.rect :as grc] [app.common.geom.shapes.flex-layout.bounds :as fb] + [app.common.geom.shapes.flex-layout.layout-data :as fld] [app.common.geom.shapes.grid-layout.bounds :as gb] + [app.common.geom.shapes.grid-layout.layout-data :as gld] [app.common.geom.shapes.min-size-layout :as msl] [app.common.types.shape :as cts] [app.common.types.shape.layout :as ctl] @@ -89,6 +91,27 @@ (apply dissoc full exclude-ids) full))) +(t/deftest layout-calculation-without-optional-padding + (doseq [layout-type [:flex :grid] + padding-type [nil :simple :multiple]] + (let [parent-id (uuid/next) + child-id (uuid/next) + child (make-rect child-id 10 10 50 50) + parent (cond-> (dissoc (case layout-type + :flex (make-flex-frame parent-id [child-id]) + :grid (make-grid-frame parent-id [child-id])) + :layout-padding :layout-padding-type) + padding-type (assoc :layout-padding-type padding-type)) + objects (make-objects [parent child]) + bounds (bounds-map-from-objects objects) + calculate (case layout-type :flex fld/calc-layout-data :grid gld/calc-layout-data) + explicit (assoc parent :layout-padding {:p1 0 :p2 0 :p3 0 :p4 0})] + (t/is (cts/valid-shape? parent)) + (t/is (= (calculate explicit (:points parent) [[(:points child) child]] bounds + (assoc objects parent-id explicit)) + (calculate parent (:points parent) [[(:points child) child]] bounds objects)) + (str "Absent padding must keep " layout-type " layout geometry"))))) + ;; ---- Tests for flex layout bounds with nil bounds ---- (t/deftest layout-content-points-with-missing-parent-bounds diff --git a/common/test/common_tests/types/shape_layout_test.cljc b/common/test/common_tests/types/shape_layout_test.cljc index d32ea5a6b6..4ec0ef268b 100644 --- a/common/test/common_tests/types/shape_layout_test.cljc +++ b/common/test/common_tests/types/shape_layout_test.cljc @@ -354,6 +354,16 @@ :layout-padding {:p1 8 :p2 10 :p3 99 :p4 99})] (t/is (= 16 (layout/v-padding shape)))))) +(t/deftest absent-layout-padding-means-zero + (doseq [layout-type [:flex :grid] + padding-type [nil :simple :multiple]] + (let [shape (cond-> (make-frame :layout layout-type) + padding-type (assoc :layout-padding-type padding-type))] + (t/is (cts/valid-shape? shape) "Padding is optional in stored shapes") + (t/is (= [0 0 0 0] (layout/paddings shape))) + (t/is (zero? (layout/h-padding shape))) + (t/is (zero? (layout/v-padding shape)))))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; child-min/max-width/height ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;