From e1318438262b674e5ac269f481b145065cab5ea8 Mon Sep 17 00:00:00 2001 From: F4brizi Date: Thu, 1 Oct 2026 18:41:12 -0300 Subject: [PATCH] feat(viewport): expand ZOOMFACTOR range to 500 --- src/app/commands/styleprops.rs | 4 ++-- src/app/mod.rs | 4 ++-- src/app/options_session.rs | 11 +++++++++++ src/app/update/file.rs | 2 +- src/app/update/mod.rs | 2 +- src/scene/view/camera.rs | 2 +- src/ui/window/options.rs | 6 +++--- 7 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/app/commands/styleprops.rs b/src/app/commands/styleprops.rs index 8479f551a..88a11e939 100644 --- a/src/app/commands/styleprops.rs +++ b/src/app/commands/styleprops.rs @@ -1688,11 +1688,11 @@ impl OpenCADStudio { }, "ZOOMFACTOR" => match &value { Some(v) => match v.parse::() { - Ok(factor) if (3..=100).contains(&factor) => { + Ok(factor) if (3..=500).contains(&factor) => { self.zoom_factor = factor; Ok((format!("ZOOMFACTOR = {factor}"), true)) } - _ => Err("SETVAR: integer from 3 to 100 required.".into()), + _ => Err("SETVAR: integer from 3 to 500 required.".into()), }, None => { Ok((format!("ZOOMFACTOR = {}", self.zoom_factor), false)) diff --git a/src/app/mod.rs b/src/app/mod.rs index 65df40ec0..41a36151e 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -554,7 +554,7 @@ pub(super) struct OpenCADStudio { polar_increment_deg: f32, /// Reverse the mouse-wheel zoom direction when true (ZOOMWHEEL = 1). zoom_wheel_reversed: bool, - /// Mouse-wheel zoom sensitivity, clamped to 3..=100 (ZOOMFACTOR). + /// Mouse-wheel zoom sensitivity, clamped to 3..=500 (ZOOMFACTOR). zoom_factor: i32, /// Crosshair size setting (CURSORSIZE, 1..=100). cursor_size: i32, @@ -2308,7 +2308,7 @@ pub enum Message { CommandLineFadeChanged(i32), /// Toggle reversing the mouse-wheel zoom direction (ZOOMWHEEL). ZoomWheelReversedChanged(bool), - /// Change how far one wheel notch zooms (ZOOMFACTOR, 3..=100). + /// Change how far one wheel notch zooms (ZOOMFACTOR, 3..=500). ZoomFactorChanged(i32), /// Options → User Preferences: right-click behaviour (SHORTCUTMENU). RightClickModeChanged(settings::RightClickMode), diff --git a/src/app/options_session.rs b/src/app/options_session.rs index b6f8d0378..d0245f64b 100644 --- a/src/app/options_session.rs +++ b/src/app/options_session.rs @@ -222,4 +222,15 @@ mod tests { assert_eq!(h.display_silhouette, silhouette); assert!(!app.tabs[i].dirty, "the drawing is as unmodified as it was"); } + + #[test] + fn zoom_factor_supports_values_above_100() { + let mut app = app(); + let _ = app.update(Message::ZoomFactorChanged(250)); + assert_eq!(app.zoom_factor, 250); + let _ = app.update(Message::ZoomFactorChanged(500)); + assert_eq!(app.zoom_factor, 500); + let _ = app.update(Message::ZoomFactorChanged(600)); + assert_eq!(app.zoom_factor, 500, "clamped to new upper limit of 500"); + } } diff --git a/src/app/update/file.rs b/src/app/update/file.rs index bf54ca175..9421b6631 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -743,7 +743,7 @@ impl OpenCADStudio { self.polar_mode = s.polar; self.polar_increment_deg = s.polar_increment_deg; self.zoom_wheel_reversed = s.zoom_wheel_reversed; - self.zoom_factor = s.zoom_factor.clamp(3, 100); + self.zoom_factor = s.zoom_factor.clamp(3, 500); self.cursor_size = s.cursor_size.clamp(1, 100); self.pick_box = s.pick_box.clamp(0, 50); self.options_tab = s.options_tab; diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index ce1d7ccd3..b1c44f23d 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -8239,7 +8239,7 @@ impl OpenCADStudio { } Message::ZoomFactorChanged(factor) => { - self.zoom_factor = factor.clamp(3, 100); + self.zoom_factor = factor.clamp(3, 500); self.persist_settings_if_changed(); Task::none() } diff --git a/src/scene/view/camera.rs b/src/scene/view/camera.rs index 4f9974491..8384732c1 100644 --- a/src/scene/view/camera.rs +++ b/src/scene/view/camera.rs @@ -492,7 +492,7 @@ impl Camera { } pub fn zoom(&mut self, delta: f32) { - self.distance = (self.distance * (1.0 - delta * 0.1)).max(0.001); + self.distance = (self.distance * 0.9f32.powf(delta)).max(0.001); } /// World-space offset from `target` to the point under `screen` on the diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index 0e6d109f5..81b16fcbe 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -55,7 +55,7 @@ pub struct AppPrefs { pub commandline_fade_ms: i32, /// ZOOMWHEEL: reverse the mouse-wheel zoom direction. pub zoom_wheel_reversed: bool, - /// ZOOMFACTOR, 3..=100. + /// ZOOMFACTOR, 3..=500. pub zoom_factor: i32, /// TEXTEDITMODE: TEXTEDIT keeps prompting for the next object. pub texteditmode: bool, @@ -1181,10 +1181,10 @@ pub fn view_window<'a>( Space::new().height(12), row![ text(crate::t!("Zoom factor")).size(12).width(150), - slider(3..=100, prefs.zoom_factor.clamp(3, 100), Message::ZoomFactorChanged) + slider(3..=500, prefs.zoom_factor.clamp(3, 500), Message::ZoomFactorChanged) .step(1) .width(Fill), - text(prefs.zoom_factor.clamp(3, 100).to_string()).size(11).width(44), + text(prefs.zoom_factor.clamp(3, 500).to_string()).size(11).width(44), ] .spacing(10) .align_y(iced::Center),