forked from 1b-agent/opencadstudio-upstream
fix(grid): independent, clipped grid per viewport
Grid (and grid-snap) state was shared through the global show_grid flag, so toggling it in model space also turned it on in paper space, and a floating viewport's grid painted across the whole paper — and beyond the 3-D view when zoomed in. - Store grid/snap per view: a model tile in model space, the active floating viewport or the layout's sheet viewport in paper space, round-tripped via the viewport status flags. - adopt_view_display on layout switch and viewport enter/exit so the live toggle follows the view you are in. - Render one grid per view (paper_viewport_grid_views): the sheet over the paper, each floating viewport clipped to its screen rectangle. - Clamp the grid clip to the widget so an overflowing viewport rectangle never paints grid outside the 3-D view. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
ba834fb166
commit
26479b6faa
4 files changed
+122
-35
No files matched your search
+20
-3
@@ -284,11 +284,28 @@ impl canvas::Program<Message> for SelectionCanvas {
|
||||
}
|
||||
|
||||
// ── Grid display ──────────────────────────────────────────────────
|
||||
// One entry per pane with its grid on. Each is clipped to its own tile
|
||||
// rectangle so lines never spill into neighbouring panes.
|
||||
// One entry per pane with its grid on. Each is clipped to its own
|
||||
// rectangle so lines never spill into neighbouring panes — and the clip
|
||||
// is intersected with the widget so a zoomed-in viewport whose rectangle
|
||||
// overflows the canvas never paints grid outside the 3-D view.
|
||||
for g in &self.grid {
|
||||
let gb = g.bounds;
|
||||
frame.with_clip(gb, |f| draw_grid(f, g.view_proj, g.plane, gb));
|
||||
let cx0 = gb.x.max(0.0);
|
||||
let cy0 = gb.y.max(0.0);
|
||||
let cx1 = (gb.x + gb.width).min(bounds.width);
|
||||
let cy1 = (gb.y + gb.height).min(bounds.height);
|
||||
if cx1 <= cx0 || cy1 <= cy0 {
|
||||
continue;
|
||||
}
|
||||
let clip = iced::Rectangle {
|
||||
x: cx0,
|
||||
y: cy0,
|
||||
width: cx1 - cx0,
|
||||
height: cy1 - cy0,
|
||||
};
|
||||
// Project with the full viewport rect `gb` so the grid stays aligned;
|
||||
// only the clip is clamped.
|
||||
frame.with_clip(clip, |f| draw_grid(f, g.view_proj, g.plane, gb));
|
||||
}
|
||||
|
||||
if let (Some(a), Some(b)) = (self.selection.box_anchor, self.selection.box_current) {
|
||||
|
||||
Reference in new issue
Block a user