forked from 1b-agent/opencadstudio-upstream
feat(ui): unified viewport control chip + per-tile grid rendering
Move grid and grid-snap toggles off the status bar (and its customization menu) into the top-left viewport chip, now a single container holding the horizontal/vertical split buttons, render-mode picker, and grid/snap toggles, sized to the render-mode picker. Add grid + magnet (snap) icons. Render the grid per model tile from each tile's own grid_on, in its own bounds and camera, instead of a single grid in the active tile. This stops the grid flickering on/off as the cursor crosses panes or leaves the viewport, and lets each pane show its own grid independently. Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
1 parent
d4a665a34c
commit
9eb805df23
8 files changed
+170
-133
No files matched your search
@@ -6446,6 +6446,35 @@ impl Scene {
|
||||
/// `(vw, vh)`. Full canvas outside the Model layout or for a single
|
||||
/// tile. Used to map cursor coordinates into the active tile so pick /
|
||||
/// pan / ViewCube work per-pane in a tiled layout.
|
||||
/// Canvas bounds + camera for every Model tile whose grid display is on.
|
||||
/// Each pane renders its own grid independently of which tile is active or
|
||||
/// hovered, so the grid never flickers as the cursor crosses panes. The
|
||||
/// active tile uses the live camera (mid-orbit/pan); others use their
|
||||
/// stored camera. (#121)
|
||||
pub fn model_tile_grid_views(&self, vw: f32, vh: f32) -> Vec<(iced::Rectangle, Camera)> {
|
||||
if self.current_layout != "Model" {
|
||||
return Vec::new();
|
||||
}
|
||||
let tiles = self.model_tiles.borrow();
|
||||
let active = self.active_model_tile.get().min(tiles.len().saturating_sub(1));
|
||||
let live = self.camera.borrow().clone();
|
||||
tiles
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter(|(_, t)| t.grid_on)
|
||||
.map(|(idx, t)| {
|
||||
let bounds = iced::Rectangle {
|
||||
x: t.rect.x * vw,
|
||||
y: t.rect.y * vh,
|
||||
width: (t.rect.width * vw).max(1.0),
|
||||
height: (t.rect.height * vh).max(1.0),
|
||||
};
|
||||
let cam = if idx == active { live.clone() } else { t.camera.clone() };
|
||||
(bounds, cam)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn active_model_tile_bounds(&self, vw: f32, vh: f32) -> iced::Rectangle {
|
||||
if self.current_layout != "Model" {
|
||||
return iced::Rectangle { x: 0.0, y: 0.0, width: vw, height: vh };
|
||||
|
||||
Reference in new issue
Block a user