diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index 717b2b03dd..c53fa6e58c 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -618,7 +618,9 @@ (extract-property-changes modif-tree)] (-> state (assoc :prev-wasm-props (:wasm-props state)) - (assoc :wasm-props property-changes)))) + (assoc :wasm-props property-changes) + ;; Keep overlays in sync during WASM transforms. + (assoc :workspace-modifiers modif-tree)))) ptk/WatchEvent (watch [_ state _] diff --git a/frontend/src/app/main/ui/workspace/viewport_wasm.cljs b/frontend/src/app/main/ui/workspace/viewport_wasm.cljs index 3e516e923f..26bab1150d 100644 --- a/frontend/src/app/main/ui/workspace/viewport_wasm.cljs +++ b/frontend/src/app/main/ui/workspace/viewport_wasm.cljs @@ -98,6 +98,7 @@ drawing (mf/deref refs/workspace-drawing) focus (mf/deref refs/workspace-focus-selected) wasm-modifiers (mf/deref refs/workspace-wasm-modifiers) + modifiers (mf/deref refs/workspace-modifiers) workspace-editor-state (mf/deref refs/workspace-editor-state) @@ -704,7 +705,8 @@ (when show-grid-editor? [:& grid-layout/editor {:zoom zoom - :objects objects-modified + :objects base-objects + :modifiers modifiers :shape (or (get base-objects edition) (get base-objects @hover-top-frame-id)) :view-only (not show-grid-editor?)}])] diff --git a/render-wasm/src/render/grid_layout.rs b/render-wasm/src/render/grid_layout.rs index c319e5410f..699aea8cde 100644 --- a/render-wasm/src/render/grid_layout.rs +++ b/render-wasm/src/render/grid_layout.rs @@ -1,21 +1,30 @@ use skia_safe::{self as skia}; -use crate::math::Rect; use crate::shapes::modifiers::grid_layout::grid_cell_data; use crate::shapes::Shape; use crate::state::ShapesPoolRef; pub fn render_overlay(zoom: f32, canvas: &skia::Canvas, shape: &Shape, shapes: ShapesPoolRef) { - let cells = grid_cell_data(shape, shapes, true); + let cells: Vec> = grid_cell_data(shape, shapes, true); + let bounds = shape.bounds(); let mut paint = skia::Paint::default(); paint.set_style(skia::PaintStyle::Stroke); paint.set_color(skia::Color::from_rgb(255, 111, 224)); + paint.set_anti_alias(shape.should_use_antialias(zoom)); paint.set_stroke_width(1.0 / zoom); for cell in cells.iter() { - let rect = Rect::from_xywh(cell.anchor.x, cell.anchor.y, cell.width, cell.height); - canvas.draw_rect(rect, &paint); + let hv = bounds.hv(cell.width); + let vv = bounds.vv(cell.height); + let points = [ + cell.anchor, + cell.anchor + hv, + cell.anchor + hv + vv, + cell.anchor + vv, + ]; + let polygon = skia::Path::polygon(&points, true, None, None); + canvas.draw_path(&polygon, &paint); } } diff --git a/render-wasm/src/render/ui.rs b/render-wasm/src/render/ui.rs index 3f662bc009..97c8dd4867 100644 --- a/render-wasm/src/render/ui.rs +++ b/render-wasm/src/render/ui.rs @@ -2,6 +2,7 @@ use skia_safe::{self as skia, Color4f}; use super::{RenderState, ShapesPoolRef, SurfaceId}; use crate::render::grid_layout; +use crate::shapes::{Layout, Type}; pub fn render(render_state: &mut RenderState, shapes: ShapesPoolRef) { let canvas = render_state.surfaces.canvas(SurfaceId::UI); @@ -18,12 +19,37 @@ pub fn render(render_state: &mut RenderState, shapes: ShapesPoolRef) { let canvas = render_state.surfaces.canvas(SurfaceId::UI); - if let Some(id) = render_state.show_grid { + let show_grid_id = render_state.show_grid; + + if let Some(id) = show_grid_id { if let Some(shape) = shapes.get(&id) { grid_layout::render_overlay(zoom, canvas, shape, shapes); } } + // Render overlays for empty grid frames + for shape in shapes.iter() { + if shape.id.is_nil() || !shape.children.is_empty() { + continue; + } + + if show_grid_id == Some(shape.id) { + continue; + } + + let Type::Frame(frame) = &shape.shape_type else { + continue; + }; + + if !matches!(frame.layout, Some(Layout::GridLayout(_, _))) { + continue; + } + + if let Some(shape) = shapes.get(&shape.id) { + grid_layout::render_overlay(zoom, canvas, shape, shapes); + } + } + canvas.restore(); render_state.surfaces.draw_into( SurfaceId::UI,