// ZOOM WINDOW command — pick two corners to define the zoom area. use glam::Vec3; use crate::command::{CadCommand, CmdResult}; use crate::scene::wire_model::WireModel; pub struct ZoomWindowCommand { first: Option, } impl ZoomWindowCommand { pub fn new() -> Self { Self { first: None } } } impl CadCommand for ZoomWindowCommand { fn name(&self) -> &'static str { "ZOOM WINDOW" } fn prompt(&self) -> String { if self.first.is_none() { "ZOOM WINDOW Specify first corner:".into() } else { "ZOOM WINDOW Specify opposite corner:".into() } } fn on_point(&mut self, pt: Vec3) -> CmdResult { if let Some(p1) = self.first { CmdResult::ZoomToWindow { p1, p2: pt } } else { self.first = Some(pt); CmdResult::NeedPoint } } fn on_enter(&mut self) -> CmdResult { CmdResult::Cancel } fn on_escape(&mut self) -> CmdResult { CmdResult::Cancel } fn on_mouse_move(&mut self, pt: Vec3) -> Option { let p1 = self.first?; let min = p1.min(pt); let max = p1.max(pt); // Draw a rectangle preview Some(WireModel { name: "zoom_window_preview".into(), points: vec![ [min.x, min.y, 0.0], [max.x, min.y, 0.0], [max.x, max.y, 0.0], [min.x, max.y, 0.0], [min.x, min.y, 0.0], ], color: WireModel::CYAN, selected: false, pattern_length: 0.0, pattern: [0.0; 8], line_weight_px: 1.0, snap_pts: vec![], tangent_geoms: vec![], key_vertices: vec![], }) } }