diff --git a/locales/ar-SA/opencadstudio.ftl b/locales/ar-SA/opencadstudio.ftl index c6a75500f..38692ca6c 100644 --- a/locales/ar-SA/opencadstudio.ftl +++ b/locales/ar-SA/opencadstudio.ftl @@ -1449,6 +1449,7 @@ common = .user-preferences = تفضيلات المستخدم .zoom = التكبير .reverse-mouse-wheel-zoom-zoomwheel = عكس التكبير بعجلة الفأرة (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = لوحة اللمس: التمرير يحرك العرض، Ctrl+تمرير أو القرص يكبّر .zoom-factor = معامل التكبير .how-far-one-wheel-notch-zooms-zoomfactor = مقدار التكبير لكل درجة من العجلة (ZOOMFACTOR). .text-and-dimensions = النص والأبعاد diff --git a/locales/bg-BG/opencadstudio.ftl b/locales/bg-BG/opencadstudio.ftl index 83f0c2d02..4bca196d0 100644 --- a/locales/bg-BG/opencadstudio.ftl +++ b/locales/bg-BG/opencadstudio.ftl @@ -1436,6 +1436,7 @@ common = .user-preferences = Потребителски предпочитания .zoom = Мащабиране .reverse-mouse-wheel-zoom-zoomwheel = Обръщане на мащабирането с колелцето (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Тъчпад: превъртането мести изгледа, Ctrl+превъртане или щипване мащабира .zoom-factor = Коефициент на мащабиране .how-far-one-wheel-notch-zooms-zoomfactor = Колко мащабира едно щракване на колелцето (ZOOMFACTOR). .text-and-dimensions = Текст и размери diff --git a/locales/cs-CZ/opencadstudio.ftl b/locales/cs-CZ/opencadstudio.ftl index 7aec030d7..90580a13b 100644 --- a/locales/cs-CZ/opencadstudio.ftl +++ b/locales/cs-CZ/opencadstudio.ftl @@ -1436,6 +1436,7 @@ common = .user-preferences = Předvolby uživatele .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Obrátit zoom kolečkem myši (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: posun posouvá pohled, Ctrl+posun nebo sevření zvětšuje .zoom-factor = Faktor zoomu .how-far-one-wheel-notch-zooms-zoomfactor = O kolik přiblíží jeden zub kolečka (ZOOMFACTOR). .text-and-dimensions = Text a kóty diff --git a/locales/de-DE/opencadstudio.ftl b/locales/de-DE/opencadstudio.ftl index d22c55b6c..fb2d0db43 100644 --- a/locales/de-DE/opencadstudio.ftl +++ b/locales/de-DE/opencadstudio.ftl @@ -1437,6 +1437,7 @@ common = .user-preferences = Benutzereinstellungen .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Mausradzoom umkehren (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: Scrollen verschiebt, Strg+Scrollen oder Zusammenziehen zoomt .zoom-factor = Zoomfaktor .how-far-one-wheel-notch-zooms-zoomfactor = Wie weit eine Radrastung zoomt (ZOOMFACTOR). .text-and-dimensions = Text und Bemaßung diff --git a/locales/el-GR/opencadstudio.ftl b/locales/el-GR/opencadstudio.ftl index a085923a0..8ccf5d5e6 100644 --- a/locales/el-GR/opencadstudio.ftl +++ b/locales/el-GR/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .user-preferences = Προτιμήσεις χρήστη .zoom = Ζουμ .reverse-mouse-wheel-zoom-zoomwheel = Αντιστροφή ζουμ με τον τροχό (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Επιφάνεια αφής: η κύλιση μετακινεί, Ctrl+κύλιση ή τσίμπημα κάνει ζουμ .zoom-factor = Συντελεστής ζουμ .how-far-one-wheel-notch-zooms-zoomfactor = Πόσο ζουμάρει ένα σκαλί του τροχού (ZOOMFACTOR). .text-and-dimensions = Κείμενο και διαστάσεις diff --git a/locales/en-US/opencadstudio.ftl b/locales/en-US/opencadstudio.ftl index 2f8ced110..6f54fb7c3 100644 --- a/locales/en-US/opencadstudio.ftl +++ b/locales/en-US/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .user-preferences = User Preferences .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Reverse mouse wheel zoom (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: scroll pans, Ctrl+scroll or pinch zooms .zoom-factor = Zoom factor .how-far-one-wheel-notch-zooms-zoomfactor = How far one wheel notch zooms (ZOOMFACTOR). .text-and-dimensions = Text and Dimensions diff --git a/locales/es-ES/opencadstudio.ftl b/locales/es-ES/opencadstudio.ftl index a61b1c8b4..1f8a7230c 100644 --- a/locales/es-ES/opencadstudio.ftl +++ b/locales/es-ES/opencadstudio.ftl @@ -1437,6 +1437,7 @@ common = .user-preferences = Preferencias de usuario .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Invertir el zoom de la rueda del ratón (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Panel táctil: el desplazamiento encuadra, Ctrl+desplazamiento o pellizco hace zoom .zoom-factor = Factor de zoom .how-far-one-wheel-notch-zooms-zoomfactor = Cuánto amplía un paso de la rueda (ZOOMFACTOR). .text-and-dimensions = Texto y acotación diff --git a/locales/fi-FI/opencadstudio.ftl b/locales/fi-FI/opencadstudio.ftl index 82cf03e99..e3c39530c 100644 --- a/locales/fi-FI/opencadstudio.ftl +++ b/locales/fi-FI/opencadstudio.ftl @@ -1436,6 +1436,7 @@ common = .user-preferences = Käyttäjäasetukset .zoom = Zoomaus .reverse-mouse-wheel-zoom-zoomwheel = Käännä hiiren rullan zoomaus (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Kosketuslevy: vieritys panoroi, Ctrl+vieritys tai nipistys zoomaa .zoom-factor = Zoomauskerroin .how-far-one-wheel-notch-zooms-zoomfactor = Kuinka paljon yksi rullan pykälä zoomaa (ZOOMFACTOR). .text-and-dimensions = Teksti ja mitoitus diff --git a/locales/fr-FR/opencadstudio.ftl b/locales/fr-FR/opencadstudio.ftl index afb43870f..20bab6472 100644 --- a/locales/fr-FR/opencadstudio.ftl +++ b/locales/fr-FR/opencadstudio.ftl @@ -1437,6 +1437,7 @@ common = .user-preferences = Préférences utilisateur .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Inverser le zoom à la molette (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Pavé tactile : le défilement déplace, Ctrl+défilement ou pincement zoome .zoom-factor = Facteur de zoom .how-far-one-wheel-notch-zooms-zoomfactor = De combien zoome un cran de molette (ZOOMFACTOR). .text-and-dimensions = Texte et cotation diff --git a/locales/hi-IN/opencadstudio.ftl b/locales/hi-IN/opencadstudio.ftl index 2c4c06cee..d5b5f0002 100644 --- a/locales/hi-IN/opencadstudio.ftl +++ b/locales/hi-IN/opencadstudio.ftl @@ -1425,6 +1425,7 @@ common = .user-preferences = उपयोगकर्ता प्राथमिकताएँ .zoom = ज़ूम .reverse-mouse-wheel-zoom-zoomwheel = माउस व्हील ज़ूम उलटें (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = टचपैड: स्क्रॉल पैन करता है, Ctrl+स्क्रॉल या पिंच ज़ूम करता है .zoom-factor = ज़ूम गुणक .how-far-one-wheel-notch-zooms-zoomfactor = व्हील का एक पायदान कितना ज़ूम करता है (ZOOMFACTOR)। .text-and-dimensions = पाठ और आयाम diff --git a/locales/hu-HU/opencadstudio.ftl b/locales/hu-HU/opencadstudio.ftl index 7393d69a1..d54b72999 100644 --- a/locales/hu-HU/opencadstudio.ftl +++ b/locales/hu-HU/opencadstudio.ftl @@ -1436,6 +1436,7 @@ common = .user-preferences = Felhasználói beállítások .zoom = Nagyítás .reverse-mouse-wheel-zoom-zoomwheel = Egérgörgős nagyítás megfordítása (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Érintőpad: a görgetés mozgat, a Ctrl+görgetés vagy csippentés nagyít .zoom-factor = Nagyítási tényező .how-far-one-wheel-notch-zooms-zoomfactor = Mennyit nagyít egy görgőkattanás (ZOOMFACTOR). .text-and-dimensions = Szöveg és méretezés diff --git a/locales/it-IT/opencadstudio.ftl b/locales/it-IT/opencadstudio.ftl index 212e19a64..dbceb272e 100644 --- a/locales/it-IT/opencadstudio.ftl +++ b/locales/it-IT/opencadstudio.ftl @@ -1436,6 +1436,7 @@ common = .user-preferences = Preferenze utente .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Inverti lo zoom con la rotellina (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: lo scorrimento sposta la vista, Ctrl+scorrimento o pizzico esegue lo zoom .zoom-factor = Fattore di zoom .how-far-one-wheel-notch-zooms-zoomfactor = Di quanto ingrandisce uno scatto della rotellina (ZOOMFACTOR). .text-and-dimensions = Testo e quote diff --git a/locales/ja-JP/opencadstudio.ftl b/locales/ja-JP/opencadstudio.ftl index cf930fc9b..34d074732 100644 --- a/locales/ja-JP/opencadstudio.ftl +++ b/locales/ja-JP/opencadstudio.ftl @@ -1427,6 +1427,7 @@ common = .user-preferences = ユーザー設定 .zoom = ズーム .reverse-mouse-wheel-zoom-zoomwheel = マウス ホイールのズーム方向を反転 (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = タッチパッド: スクロールで画面移動、Ctrl+スクロールまたはピンチでズーム .zoom-factor = ズーム倍率 .how-far-one-wheel-notch-zooms-zoomfactor = ホイール 1 ノッチのズーム量 (ZOOMFACTOR)。 .text-and-dimensions = 文字と寸法 diff --git a/locales/ko-KR/opencadstudio.ftl b/locales/ko-KR/opencadstudio.ftl index 1cbff7eaf..a352051ad 100644 --- a/locales/ko-KR/opencadstudio.ftl +++ b/locales/ko-KR/opencadstudio.ftl @@ -1436,6 +1436,7 @@ common = .user-preferences = 사용자 환경설정 .zoom = 줌 .reverse-mouse-wheel-zoom-zoomwheel = 마우스 휠 줌 방향 반전 (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 터치패드: 스크롤은 화면 이동, Ctrl+스크롤 또는 핀치는 확대/축소 .zoom-factor = 줌 배율 .how-far-one-wheel-notch-zooms-zoomfactor = 휠 한 칸이 확대하는 정도 (ZOOMFACTOR). .text-and-dimensions = 문자 및 치수 diff --git a/locales/nl-NL/opencadstudio.ftl b/locales/nl-NL/opencadstudio.ftl index 496c8f95d..9fe5ce079 100644 --- a/locales/nl-NL/opencadstudio.ftl +++ b/locales/nl-NL/opencadstudio.ftl @@ -1435,6 +1435,7 @@ common = .user-preferences = Gebruikersvoorkeuren .zoom = Zoomen .reverse-mouse-wheel-zoom-zoomwheel = Muiswielzoom omkeren (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: scrollen verschuift, Ctrl+scrollen of knijpen zoomt .zoom-factor = Zoomfactor .how-far-one-wheel-notch-zooms-zoomfactor = Hoeveel één wielklik zoomt (ZOOMFACTOR). .text-and-dimensions = Tekst en maatvoering diff --git a/locales/pl-PL/opencadstudio.ftl b/locales/pl-PL/opencadstudio.ftl index 380533d4a..ac7b09cfd 100644 --- a/locales/pl-PL/opencadstudio.ftl +++ b/locales/pl-PL/opencadstudio.ftl @@ -1436,6 +1436,7 @@ common = .user-preferences = Preferencje użytkownika .zoom = Powiększenie .reverse-mouse-wheel-zoom-zoomwheel = Odwróć powiększanie kółkiem myszy (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: przewijanie przesuwa widok, Ctrl+przewijanie lub szczypanie powiększa .zoom-factor = Współczynnik powiększenia .how-far-one-wheel-notch-zooms-zoomfactor = O ile powiększa jedno kliknięcie kółka (ZOOMFACTOR). .text-and-dimensions = Tekst i wymiary diff --git a/locales/pt-BR/opencadstudio.ftl b/locales/pt-BR/opencadstudio.ftl index 4f32592b7..045ed08a9 100644 --- a/locales/pt-BR/opencadstudio.ftl +++ b/locales/pt-BR/opencadstudio.ftl @@ -1437,6 +1437,7 @@ common = .user-preferences = Preferências do usuário .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Inverter o zoom da roda do mouse (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: rolar move a vista, Ctrl+rolar ou pinçar aplica zoom .zoom-factor = Fator de zoom .how-far-one-wheel-notch-zooms-zoomfactor = Quanto um passo da roda amplia (ZOOMFACTOR). .text-and-dimensions = Texto e cotas diff --git a/locales/ru-RU/opencadstudio.ftl b/locales/ru-RU/opencadstudio.ftl index 8d980fc7f..570551c2c 100644 --- a/locales/ru-RU/opencadstudio.ftl +++ b/locales/ru-RU/opencadstudio.ftl @@ -1440,6 +1440,7 @@ common = .user-preferences = Пользовательские настройки .zoom = Зумирование .reverse-mouse-wheel-zoom-zoomwheel = Обратить зумирование колесом мыши (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Тачпад: прокрутка панорамирует, Ctrl+прокрутка или щипок масштабирует .zoom-factor = Коэффициент зумирования .how-far-one-wheel-notch-zooms-zoomfactor = Насколько приближает один щелчок колеса (ZOOMFACTOR). .text-and-dimensions = Текст и размеры diff --git a/locales/tr-TR/opencadstudio.ftl b/locales/tr-TR/opencadstudio.ftl index e7a2d568d..2b8b575a3 100644 --- a/locales/tr-TR/opencadstudio.ftl +++ b/locales/tr-TR/opencadstudio.ftl @@ -1423,6 +1423,7 @@ common = .user-preferences = Kullanıcı tercihleri .zoom = Yakınlaştırma .reverse-mouse-wheel-zoom-zoomwheel = Fare tekerleği yakınlaştırmasını ters çevir (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Dokunmatik yüzey: kaydırma kaydırır, Ctrl+kaydırma veya sıkıştırma yakınlaştırır .zoom-factor = Yakınlaştırma çarpanı .how-far-one-wheel-notch-zooms-zoomfactor = Bir tekerlek adımının ne kadar yakınlaştıracağı (ZOOMFACTOR). .text-and-dimensions = Metin ve ölçülendirme diff --git a/locales/zh-CN/opencadstudio.ftl b/locales/zh-CN/opencadstudio.ftl index 6d36da043..6d8f38afc 100644 --- a/locales/zh-CN/opencadstudio.ftl +++ b/locales/zh-CN/opencadstudio.ftl @@ -1424,6 +1424,7 @@ common = .user-preferences = 用户首选项 .zoom = 缩放 .reverse-mouse-wheel-zoom-zoomwheel = 反转鼠标滚轮缩放方向 (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 触控板:滚动平移,Ctrl+滚动或捏合缩放 .zoom-factor = 缩放系数 .how-far-one-wheel-notch-zooms-zoomfactor = 滚轮每格的缩放幅度 (ZOOMFACTOR)。 .text-and-dimensions = 文字和标注 diff --git a/locales/zh-TW/opencadstudio.ftl b/locales/zh-TW/opencadstudio.ftl index cd3e2a1f1..3eaedeb4f 100644 --- a/locales/zh-TW/opencadstudio.ftl +++ b/locales/zh-TW/opencadstudio.ftl @@ -1436,6 +1436,7 @@ common = .user-preferences = 使用者偏好設定 .zoom = 縮放 .reverse-mouse-wheel-zoom-zoomwheel = 反轉滑鼠滾輪縮放方向 (ZOOMWHEEL) + .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 觸控板:捲動平移,Ctrl+捲動或捏合縮放 .zoom-factor = 縮放係數 .how-far-one-wheel-notch-zooms-zoomfactor = 滾輪每一格的縮放幅度 (ZOOMFACTOR)。 .text-and-dimensions = 文字與標註 diff --git a/src/app/mod.rs b/src/app/mod.rs index 8faf02008..2532acacb 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -559,6 +559,8 @@ pub(super) struct OpenCADStudio { polar_increment_deg: f32, /// Reverse the mouse-wheel zoom direction when true (ZOOMWHEEL = 1). zoom_wheel_reversed: bool, + /// Scroll pans and Ctrl+scroll zooms (touchpads); see `scroll_intent`. + touchpad_pan: bool, /// Mouse-wheel zoom sensitivity (ZOOMFACTOR), held inside /// `settings::ZOOM_FACTOR_MIN..=settings::ZOOM_FACTOR_MAX`. `SETVAR` /// only sets the range the system variable itself has; the Options @@ -2375,6 +2377,7 @@ pub enum Message { CommandLineFadeChanged(i32), /// Toggle reversing the mouse-wheel zoom direction (ZOOMWHEEL). ZoomWheelReversedChanged(bool), + TouchpadPanChanged(bool), /// Change how far one wheel notch zooms, from the Options slider /// (ZOOMFACTOR). ZoomFactorChanged(i32), @@ -4157,6 +4160,7 @@ impl OpenCADStudio { polar_mode: false, polar_increment_deg: 45.0, zoom_wheel_reversed: false, + touchpad_pan: false, zoom_factor: 60, zoom_factor_input: 60.to_string(), cursor_size: 5, diff --git a/src/app/settings.rs b/src/app/settings.rs index 93fa75b38..aa6b60548 100644 --- a/src/app/settings.rs +++ b/src/app/settings.rs @@ -388,6 +388,9 @@ pub struct UserSettings { pub polar: bool, pub polar_increment_deg: f32, pub zoom_wheel_reversed: bool, + /// Scrolling pans and Ctrl+scroll (a touchpad pinch) zooms, for a + /// touchpad that reports two-finger drags as wheel scrolls. + pub touchpad_pan: bool, pub zoom_factor: i32, /// CURSORSIZE: normalized crosshair reach; 5 retains the original 60 px arms. pub cursor_size: i32, @@ -807,6 +810,7 @@ impl Default for UserSettings { polar: false, polar_increment_deg: 45.0, zoom_wheel_reversed: false, + touchpad_pan: false, zoom_factor: 60, cursor_size: 5, pick_box: 3, diff --git a/src/app/update/file.rs b/src/app/update/file.rs index d5618c9dd..b9c7cc58c 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -662,6 +662,7 @@ impl OpenCADStudio { polar: self.polar_mode, polar_increment_deg: self.polar_increment_deg, zoom_wheel_reversed: self.zoom_wheel_reversed, + touchpad_pan: self.touchpad_pan, zoom_factor: self.zoom_factor, cursor_size: self.cursor_size, pick_box: self.pick_box, @@ -762,6 +763,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.touchpad_pan = s.touchpad_pan; self.zoom_factor = crate::app::settings::clamp_zoom_factor(s.zoom_factor); // Like the drafting-rotation field below, the Options field edits a // buffer rather than the value, so it is reseeded whenever the value diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index 595eaf685..ade3630bf 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -8383,6 +8383,12 @@ impl OpenCADStudio { Task::none() } + Message::TouchpadPanChanged(enabled) => { + self.touchpad_pan = enabled; + self.persist_settings_if_changed(); + Task::none() + } + Message::ZoomFactorChanged(factor) => { self.zoom_factor = crate::app::settings::clamp_zoom_factor(factor); // The field beside the slider reads the same value, so the diff --git a/src/app/update/viewport.rs b/src/app/update/viewport.rs index 6b8f15afe..d4002eaa0 100644 --- a/src/app/update/viewport.rs +++ b/src/app/update/viewport.rs @@ -42,9 +42,6 @@ enum ScrollIntent { Zoom { notches: f32 }, /// Trackpad movement to pan by, in screen pixels. /// - /// Built only where a pixel delta can only mean a trackpad, so it has no - /// constructor on the other targets. - #[cfg_attr(not(target_os = "macos"), allow(dead_code))] Pan { dx: f32, dy: f32 }, } @@ -55,11 +52,22 @@ const ZOOM_DIR_FLIP_PX: f32 = 2.0; /// A wheel notch zooms; a trackpad's two fingers pan. /// -/// A wheel reports notches, a precise-scrolling device reports pixels, and that -/// is the whole distinction — there is no modifier to check and no setting to -/// read. The pixels only mean "trackpad" on macOS: the browser build reports -/// every wheel notch as pixels too, so everywhere else they keep zooming. -fn scroll_intent(delta: mouse::ScrollDelta) -> ScrollIntent { +/// On macOS a wheel reports notches and a trackpad pixels, and that is the +/// whole distinction. Elsewhere a touchpad's two-finger drag arrives as wheel +/// notches (the browser build reports every wheel as pixels), so nothing tells +/// it from a wheel: with `touchpad_pan` on, every scroll pans and Ctrl+scroll — +/// what a pinch sends there — zooms. +fn scroll_intent(delta: mouse::ScrollDelta, touchpad_pan: bool, ctrl: bool) -> ScrollIntent { + /// Screen pixels one wheel line pans. + const LINE_PX: f32 = 40.0; + if touchpad_pan && !ctrl { + return match delta { + mouse::ScrollDelta::Pixels { x, y } => ScrollIntent::Pan { dx: x, dy: y }, + mouse::ScrollDelta::Lines { x, y } => { + ScrollIntent::Pan { dx: x * LINE_PX, dy: y * LINE_PX } + } + }; + } match delta { // Both axes go straight through: the two-finger gesture moves the // drawing the same way the middle-button drag moves it. If a pan ever @@ -5673,7 +5681,7 @@ properties={:.1}ms picked={}", /// A wheel notch zooms; a trackpad's two fingers pan. Which one a delta /// means is `scroll_intent`'s call. pub(super) fn on_viewport_scroll(&mut self, delta: mouse::ScrollDelta) -> Task { - match scroll_intent(delta) { + match scroll_intent(delta, self.touchpad_pan, self.ctrl_down) { ScrollIntent::Zoom { notches } => { let mut s = notches * crate::app::settings::zoom_notch_steps(self.zoom_factor); @@ -6701,10 +6709,24 @@ mod scroll_intent_tests { use crate::scene::view::camera::Camera; use iced::mouse::ScrollDelta; + /// With the touchpad option, a scroll pans (wheel lines as pixels) and + /// Ctrl+scroll — a pinch — still zooms. + #[test] + fn touchpad_pan_scrolls_pan_and_ctrl_zooms() { + assert_eq!( + scroll_intent(ScrollDelta::Lines { x: 0.5, y: -0.25 }, true, false), + ScrollIntent::Pan { dx: 20.0, dy: -10.0 } + ); + assert_eq!( + scroll_intent(ScrollDelta::Lines { x: 0.0, y: 1.0 }, true, true), + ScrollIntent::Zoom { notches: 1.0 } + ); + } + #[test] fn wheel_notches_zoom() { assert_eq!( - scroll_intent(ScrollDelta::Lines { x: 0.0, y: 1.0 }), + scroll_intent(ScrollDelta::Lines { x: 0.0, y: 1.0 }, false, false), ScrollIntent::Zoom { notches: 1.0 } ); } @@ -6715,7 +6737,7 @@ mod scroll_intent_tests { #[test] fn two_finger_scroll_pans() { assert_eq!( - scroll_intent(ScrollDelta::Pixels { x: 4.0, y: 6.0 }), + scroll_intent(ScrollDelta::Pixels { x: 4.0, y: 6.0 }, false, false), ScrollIntent::Pan { dx: 4.0, dy: 6.0 } ); } diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index bb2a95378..510b5edc2 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -316,6 +316,7 @@ impl OpenCADStudio { cliprompt_lines: self.cliprompt_lines, commandline_fade_ms: self.commandline_fade_ms, zoom_wheel_reversed: self.zoom_wheel_reversed, + touchpad_pan: self.touchpad_pan, zoom_factor: self.zoom_factor, texteditmode: self.texteditmode, dimension_continue_mode: self.dimension_continue_mode, diff --git a/src/locale_catalog.rs b/src/locale_catalog.rs index 8a8759359..b38ab91df 100644 --- a/src/locale_catalog.rs +++ b/src/locale_catalog.rs @@ -4797,6 +4797,7 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static "User Preferences" => Some(("common", "user-preferences")), "Zoom" => Some(("common", "zoom")), "Reverse mouse wheel zoom (ZOOMWHEEL)" => Some(("common", "reverse-mouse-wheel-zoom-zoomwheel")), + "Touchpad: scroll pans, Ctrl+scroll or pinch zooms" => Some(("common", "touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms")), "Zoom factor" => Some(("common", "zoom-factor")), "How far one wheel notch zooms (ZOOMFACTOR)." => Some(("common", "how-far-one-wheel-notch-zooms-zoomfactor")), "Text and Dimensions" => Some(("common", "text-and-dimensions")), diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index d9a4f298f..a8ebaa668 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -59,6 +59,8 @@ pub struct AppPrefs { pub commandline_fade_ms: i32, /// ZOOMWHEEL: reverse the mouse-wheel zoom direction. pub zoom_wheel_reversed: bool, + /// Scroll pans and Ctrl+scroll zooms (touchpads). + pub touchpad_pan: bool, /// ZOOMFACTOR. The slider sets the range the system variable has; the /// field beside it reaches `settings::ZOOM_FACTOR_MAX`. pub zoom_factor: i32, @@ -1254,6 +1256,15 @@ pub fn view_window<'a>( ] .spacing(8) .align_y(iced::Center), + Space::new().height(8), + row![ + iced::widget::checkbox(prefs.touchpad_pan) + .on_toggle(Message::TouchpadPanChanged) + .size(15), + text(crate::t!("Touchpad: scroll pans, Ctrl+scroll or pinch zooms")).size(12), + ] + .spacing(8) + .align_y(iced::Center), Space::new().height(12), row![ text(crate::t!("Zoom factor")).size(12).width(150),