From 19ecf78bd9a9302f8d33f97763f6199181efee2f Mon Sep 17 00:00:00 2001 From: Hakan Seven Date: Thu, 15 Oct 2026 11:17:13 +0300 Subject: [PATCH] navigation: selectable mouse navigation style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Options → User Preferences → Navigation style picks which mouse gestures pan and orbit the model view (#1480): - CAD (default): middle button pans, Shift + middle button orbits. - Blender: middle button orbits, Shift + middle button pans. - CATIA: middle button pans; pressing the left button during it orbits, so 3D navigation needs only the mouse. An armed orbit tool always orbits. The choice is saved with the user settings. Co-Authored-By: Claude Opus 5.5 --- locales/ar-SA/opencadstudio.ftl | 4 ++++ locales/bg-BG/opencadstudio.ftl | 4 ++++ locales/cs-CZ/opencadstudio.ftl | 4 ++++ locales/de-DE/opencadstudio.ftl | 4 ++++ locales/el-GR/opencadstudio.ftl | 4 ++++ locales/en-US/opencadstudio.ftl | 4 ++++ locales/es-ES/opencadstudio.ftl | 4 ++++ locales/fi-FI/opencadstudio.ftl | 4 ++++ locales/fr-FR/opencadstudio.ftl | 4 ++++ locales/hi-IN/opencadstudio.ftl | 4 ++++ locales/hu-HU/opencadstudio.ftl | 4 ++++ locales/it-IT/opencadstudio.ftl | 4 ++++ locales/ja-JP/opencadstudio.ftl | 4 ++++ locales/ko-KR/opencadstudio.ftl | 4 ++++ locales/lo-LA/opencadstudio.ftl | 4 ++++ locales/nl-NL/opencadstudio.ftl | 4 ++++ locales/pl-PL/opencadstudio.ftl | 4 ++++ locales/pt-BR/opencadstudio.ftl | 4 ++++ locales/ru-RU/opencadstudio.ftl | 4 ++++ locales/tr-TR/opencadstudio.ftl | 4 ++++ locales/zh-CN/opencadstudio.ftl | 4 ++++ locales/zh-TW/opencadstudio.ftl | 4 ++++ src/app/mod.rs | 8 ++++++++ src/app/settings.rs | 29 +++++++++++++++++++++++++++++ src/app/update/file.rs | 2 ++ src/app/update/mod.rs | 26 ++++++++++++++++++++++++++ src/app/update/viewport.rs | 14 +++++++++++++- src/app/view/modal.rs | 1 + src/locale_catalog.rs | 4 ++++ src/ui/window/options.rs | 12 ++++++++++++ 30 files changed, 183 insertions(+), 1 deletion(-) diff --git a/locales/ar-SA/opencadstudio.ftl b/locales/ar-SA/opencadstudio.ftl index ad519831f..fb0f0f506 100644 --- a/locales/ar-SA/opencadstudio.ftl +++ b/locales/ar-SA/opencadstudio.ftl @@ -1563,6 +1563,10 @@ common = .user-preferences = تفضيلات المستخدم .zoom = التكبير .reverse-mouse-wheel-zoom-zoomwheel = عكس التكبير بعجلة الفأرة (ZOOMWHEEL) + .navigation-style = نمط التنقل + .nav-style-cad = CAD: ‏Shift + الزر الأوسط للدوران + .nav-style-blender = Blender: الزر الأوسط للدوران، Shift للتحريك + .nav-style-catia = CATIA: الزر الأوسط + الأيسر للدوران .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = لوحة اللمس: التمرير يحرك العرض، Ctrl+تمرير أو القرص يكبّر .interface-scale = مقياس الواجهة .zoom-factor = معامل التكبير diff --git a/locales/bg-BG/opencadstudio.ftl b/locales/bg-BG/opencadstudio.ftl index c19396747..59cfd1106 100644 --- a/locales/bg-BG/opencadstudio.ftl +++ b/locales/bg-BG/opencadstudio.ftl @@ -1550,6 +1550,10 @@ common = .user-preferences = Потребителски предпочитания .zoom = Мащабиране .reverse-mouse-wheel-zoom-zoomwheel = Обръщане на мащабирането с колелцето (ZOOMWHEEL) + .navigation-style = Стил на навигация + .nav-style-cad = CAD: Shift + среден бутон завърта + .nav-style-blender = Blender: среден бутон завърта, Shift премества + .nav-style-catia = CATIA: среден + ляв бутон завърта .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Тъчпад: превъртането мести изгледа, Ctrl+превъртане или щипване мащабира .interface-scale = Мащаб на интерфейса .zoom-factor = Коефициент на мащабиране diff --git a/locales/cs-CZ/opencadstudio.ftl b/locales/cs-CZ/opencadstudio.ftl index db51e792d..1c3e36f2b 100644 --- a/locales/cs-CZ/opencadstudio.ftl +++ b/locales/cs-CZ/opencadstudio.ftl @@ -1550,6 +1550,10 @@ common = .user-preferences = Předvolby uživatele .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Obrátit zoom kolečkem myši (ZOOMWHEEL) + .navigation-style = Styl navigace + .nav-style-cad = CAD: Shift + prostřední tlačítko otáčí + .nav-style-blender = Blender: prostřední tlačítko otáčí, Shift posouvá + .nav-style-catia = CATIA: prostřední + levé tlačítko otáčí .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: posun posouvá pohled, Ctrl+posun nebo sevření zvětšuje .interface-scale = Měřítko rozhraní .zoom-factor = Faktor zoomu diff --git a/locales/de-DE/opencadstudio.ftl b/locales/de-DE/opencadstudio.ftl index f17ba6aa8..3e321eea9 100644 --- a/locales/de-DE/opencadstudio.ftl +++ b/locales/de-DE/opencadstudio.ftl @@ -1551,6 +1551,10 @@ common = .user-preferences = Benutzereinstellungen .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Mausradzoom umkehren (ZOOMWHEEL) + .navigation-style = Navigationsstil + .nav-style-cad = CAD: Umschalt + mittlere Taste dreht + .nav-style-blender = Blender: mittlere Taste dreht, Umschalt verschiebt + .nav-style-catia = CATIA: mittlere + linke Taste dreht .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: Scrollen verschiebt, Strg+Scrollen oder Zusammenziehen zoomt .interface-scale = Oberflächenskalierung .zoom-factor = Zoomfaktor diff --git a/locales/el-GR/opencadstudio.ftl b/locales/el-GR/opencadstudio.ftl index 49108530f..56e99e5c4 100644 --- a/locales/el-GR/opencadstudio.ftl +++ b/locales/el-GR/opencadstudio.ftl @@ -1552,6 +1552,10 @@ common = .user-preferences = Προτιμήσεις χρήστη .zoom = Ζουμ .reverse-mouse-wheel-zoom-zoomwheel = Αντιστροφή ζουμ με τον τροχό (ZOOMWHEEL) + .navigation-style = Στυλ πλοήγησης + .nav-style-cad = CAD: Shift + μεσαίο πλήκτρο περιστρέφει + .nav-style-blender = Blender: μεσαίο πλήκτρο περιστρέφει, Shift μετακινεί + .nav-style-catia = CATIA: μεσαίο + αριστερό πλήκτρο περιστρέφει .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Επιφάνεια αφής: η κύλιση μετακινεί, Ctrl+κύλιση ή τσίμπημα κάνει ζουμ .interface-scale = Κλίμακα διεπαφής .zoom-factor = Συντελεστής ζουμ diff --git a/locales/en-US/opencadstudio.ftl b/locales/en-US/opencadstudio.ftl index 1dc652e4f..38da05fc8 100644 --- a/locales/en-US/opencadstudio.ftl +++ b/locales/en-US/opencadstudio.ftl @@ -1551,6 +1551,10 @@ common = .user-preferences = User Preferences .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Reverse mouse wheel zoom (ZOOMWHEEL) + .navigation-style = Navigation style + .nav-style-cad = CAD: Shift + middle button orbits + .nav-style-blender = Blender: middle button orbits, Shift pans + .nav-style-catia = CATIA: middle + left button orbits .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: scroll pans, Ctrl+scroll or pinch zooms .interface-scale = Interface scale .zoom-factor = Zoom factor diff --git a/locales/es-ES/opencadstudio.ftl b/locales/es-ES/opencadstudio.ftl index ad9a8b099..cd1336f55 100644 --- a/locales/es-ES/opencadstudio.ftl +++ b/locales/es-ES/opencadstudio.ftl @@ -1551,6 +1551,10 @@ common = .user-preferences = Preferencias de usuario .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Invertir el zoom de la rueda del ratón (ZOOMWHEEL) + .navigation-style = Estilo de navegación + .nav-style-cad = CAD: Mayús + botón central orbita + .nav-style-blender = Blender: botón central orbita, Mayús desplaza + .nav-style-catia = CATIA: botón central + izquierdo orbita .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Panel táctil: el desplazamiento encuadra, Ctrl+desplazamiento o pellizco hace zoom .interface-scale = Escala de la interfaz .zoom-factor = Factor de zoom diff --git a/locales/fi-FI/opencadstudio.ftl b/locales/fi-FI/opencadstudio.ftl index 683854b2f..4be36fa15 100644 --- a/locales/fi-FI/opencadstudio.ftl +++ b/locales/fi-FI/opencadstudio.ftl @@ -1550,6 +1550,10 @@ common = .user-preferences = Käyttäjäasetukset .zoom = Zoomaus .reverse-mouse-wheel-zoom-zoomwheel = Käännä hiiren rullan zoomaus (ZOOMWHEEL) + .navigation-style = Navigointityyli + .nav-style-cad = CAD: Vaihto + keskipainike kiertää + .nav-style-blender = Blender: keskipainike kiertää, Vaihto panoroi + .nav-style-catia = CATIA: keski- + vasen painike kiertää .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Kosketuslevy: vieritys panoroi, Ctrl+vieritys tai nipistys zoomaa .interface-scale = Käyttöliittymän skaalaus .zoom-factor = Zoomauskerroin diff --git a/locales/fr-FR/opencadstudio.ftl b/locales/fr-FR/opencadstudio.ftl index 4ce433eea..ff19da37c 100644 --- a/locales/fr-FR/opencadstudio.ftl +++ b/locales/fr-FR/opencadstudio.ftl @@ -1551,6 +1551,10 @@ common = .user-preferences = Préférences utilisateur .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Inverser le zoom à la molette (ZOOMWHEEL) + .navigation-style = Style de navigation + .nav-style-cad = CAO : Maj + bouton du milieu fait pivoter + .nav-style-blender = Blender : bouton du milieu fait pivoter, Maj déplace + .nav-style-catia = CATIA : boutons du milieu + gauche font pivoter .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Pavé tactile : le défilement déplace, Ctrl+défilement ou pincement zoome .interface-scale = Échelle de l'interface .zoom-factor = Facteur de zoom diff --git a/locales/hi-IN/opencadstudio.ftl b/locales/hi-IN/opencadstudio.ftl index d1b81d90a..94f157985 100644 --- a/locales/hi-IN/opencadstudio.ftl +++ b/locales/hi-IN/opencadstudio.ftl @@ -1539,6 +1539,10 @@ common = .user-preferences = उपयोगकर्ता प्राथमिकताएँ .zoom = ज़ूम .reverse-mouse-wheel-zoom-zoomwheel = माउस व्हील ज़ूम उलटें (ZOOMWHEEL) + .navigation-style = नेविगेशन शैली + .nav-style-cad = CAD: Shift + मध्य बटन घुमाता है + .nav-style-blender = Blender: मध्य बटन घुमाता है, Shift खिसकाता है + .nav-style-catia = CATIA: मध्य + बायाँ बटन घुमाता है .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = टचपैड: स्क्रॉल पैन करता है, Ctrl+स्क्रॉल या पिंच ज़ूम करता है .interface-scale = इंटरफ़ेस स्केल .zoom-factor = ज़ूम गुणक diff --git a/locales/hu-HU/opencadstudio.ftl b/locales/hu-HU/opencadstudio.ftl index 3f0cae98d..76248da27 100644 --- a/locales/hu-HU/opencadstudio.ftl +++ b/locales/hu-HU/opencadstudio.ftl @@ -1556,6 +1556,10 @@ 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) + .navigation-style = Navigációs stílus + .nav-style-cad = CAD: Shift + középső gomb forgat + .nav-style-blender = Blender: középső gomb forgat, Shift mozgat + .nav-style-catia = CATIA: középső + bal gomb forgat .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 .interface-scale = Felület mérete .zoom-factor = Nagyítási tényező diff --git a/locales/it-IT/opencadstudio.ftl b/locales/it-IT/opencadstudio.ftl index 19dd0e132..6c19f8bdb 100644 --- a/locales/it-IT/opencadstudio.ftl +++ b/locales/it-IT/opencadstudio.ftl @@ -1550,6 +1550,10 @@ common = .user-preferences = Preferenze utente .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Inverti lo zoom con la rotellina (ZOOMWHEEL) + .navigation-style = Stile di navigazione + .nav-style-cad = CAD: Maiusc + tasto centrale ruota + .nav-style-blender = Blender: tasto centrale ruota, Maiusc sposta + .nav-style-catia = CATIA: tasto centrale + sinistro ruota .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: lo scorrimento sposta la vista, Ctrl+scorrimento o pizzico esegue lo zoom .interface-scale = Scala dell'interfaccia .zoom-factor = Fattore di zoom diff --git a/locales/ja-JP/opencadstudio.ftl b/locales/ja-JP/opencadstudio.ftl index 4d62bf1af..f2a8dbf96 100644 --- a/locales/ja-JP/opencadstudio.ftl +++ b/locales/ja-JP/opencadstudio.ftl @@ -1541,6 +1541,10 @@ common = .user-preferences = ユーザー設定 .zoom = ズーム .reverse-mouse-wheel-zoom-zoomwheel = マウス ホイールのズーム方向を反転 (ZOOMWHEEL) + .navigation-style = ナビゲーション スタイル + .nav-style-cad = CAD: Shift + 中ボタンで回転 + .nav-style-blender = Blender: 中ボタンで回転、Shift で画面移動 + .nav-style-catia = CATIA: 中 + 左ボタンで回転 .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = タッチパッド: スクロールで画面移動、Ctrl+スクロールまたはピンチでズーム .interface-scale = インターフェースの拡大率 .zoom-factor = ズーム倍率 diff --git a/locales/ko-KR/opencadstudio.ftl b/locales/ko-KR/opencadstudio.ftl index e3a8d82b7..ddc8d622a 100644 --- a/locales/ko-KR/opencadstudio.ftl +++ b/locales/ko-KR/opencadstudio.ftl @@ -1550,6 +1550,10 @@ common = .user-preferences = 사용자 환경설정 .zoom = 줌 .reverse-mouse-wheel-zoom-zoomwheel = 마우스 휠 줌 방향 반전 (ZOOMWHEEL) + .navigation-style = 탐색 스타일 + .nav-style-cad = CAD: Shift + 가운데 버튼으로 회전 + .nav-style-blender = Blender: 가운데 버튼으로 회전, Shift로 이동 + .nav-style-catia = CATIA: 가운데 + 왼쪽 버튼으로 회전 .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 터치패드: 스크롤은 화면 이동, Ctrl+스크롤 또는 핀치는 확대/축소 .interface-scale = 인터페이스 배율 .zoom-factor = 줌 배율 diff --git a/locales/lo-LA/opencadstudio.ftl b/locales/lo-LA/opencadstudio.ftl index 948cb0ea3..a1af519e0 100644 --- a/locales/lo-LA/opencadstudio.ftl +++ b/locales/lo-LA/opencadstudio.ftl @@ -1556,6 +1556,10 @@ common = .user-preferences = ການຕັ້ງຄ່າສ່ວນຕົວຂອງຜູ້ໃຊ້ .zoom = ຊູມ .reverse-mouse-wheel-zoom-zoomwheel = ສະຫຼັບທິດທາງການໝຸນລໍ້ເມົາສ໌ຊູມ (ZOOMWHEEL) + .navigation-style = ຮູບແບບການນຳທາງ + .nav-style-cad = CAD: Shift + ປຸ່ມກາງ ໝຸນ + .nav-style-blender = Blender: ປຸ່ມກາງ ໝຸນ, Shift ເລື່ອນ + .nav-style-catia = CATIA: ປຸ່ມກາງ + ຊ້າຍ ໝຸນ .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = ທັດແພດ: ເລື່ອນເພື່ອຍ້າຍມຸມມອງ, Ctrl+ເລື່ອນ ຫຼື ບີບເພື່ອຊູມ .interface-scale = ຂະໜາດສ່ວນຕິດຕໍ່ .zoom-factor = ຕົວຄູນການຊູມ diff --git a/locales/nl-NL/opencadstudio.ftl b/locales/nl-NL/opencadstudio.ftl index d9e87d487..7aa044e93 100644 --- a/locales/nl-NL/opencadstudio.ftl +++ b/locales/nl-NL/opencadstudio.ftl @@ -1549,6 +1549,10 @@ common = .user-preferences = Gebruikersvoorkeuren .zoom = Zoomen .reverse-mouse-wheel-zoom-zoomwheel = Muiswielzoom omkeren (ZOOMWHEEL) + .navigation-style = Navigatiestijl + .nav-style-cad = CAD: Shift + middelste knop draait + .nav-style-blender = Blender: middelste knop draait, Shift verschuift + .nav-style-catia = CATIA: middelste + linkerknop draait .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: scrollen verschuift, Ctrl+scrollen of knijpen zoomt .interface-scale = Interfaceschaal .zoom-factor = Zoomfactor diff --git a/locales/pl-PL/opencadstudio.ftl b/locales/pl-PL/opencadstudio.ftl index ee22b4fbd..23ca1cfbd 100644 --- a/locales/pl-PL/opencadstudio.ftl +++ b/locales/pl-PL/opencadstudio.ftl @@ -1550,6 +1550,10 @@ common = .user-preferences = Preferencje użytkownika .zoom = Powiększenie .reverse-mouse-wheel-zoom-zoomwheel = Odwróć powiększanie kółkiem myszy (ZOOMWHEEL) + .navigation-style = Styl nawigacji + .nav-style-cad = CAD: Shift + środkowy przycisk obraca + .nav-style-blender = Blender: środkowy przycisk obraca, Shift przesuwa + .nav-style-catia = CATIA: środkowy + lewy przycisk obraca .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: przewijanie przesuwa widok, Ctrl+przewijanie lub szczypanie powiększa .interface-scale = Skala interfejsu .zoom-factor = Współczynnik powiększenia diff --git a/locales/pt-BR/opencadstudio.ftl b/locales/pt-BR/opencadstudio.ftl index b453aace1..00dc78403 100644 --- a/locales/pt-BR/opencadstudio.ftl +++ b/locales/pt-BR/opencadstudio.ftl @@ -1551,6 +1551,10 @@ common = .user-preferences = Preferências do usuário .zoom = Zoom .reverse-mouse-wheel-zoom-zoomwheel = Inverter o zoom da roda do mouse (ZOOMWHEEL) + .navigation-style = Estilo de navegação + .nav-style-cad = CAD: Shift + botão do meio orbita + .nav-style-blender = Blender: botão do meio orbita, Shift desloca + .nav-style-catia = CATIA: botão do meio + esquerdo orbita .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Touchpad: rolar move a vista, Ctrl+rolar ou pinçar aplica zoom .interface-scale = Escala da interface .zoom-factor = Fator de zoom diff --git a/locales/ru-RU/opencadstudio.ftl b/locales/ru-RU/opencadstudio.ftl index 2433d7d86..771dfbcb9 100644 --- a/locales/ru-RU/opencadstudio.ftl +++ b/locales/ru-RU/opencadstudio.ftl @@ -1554,6 +1554,10 @@ common = .user-preferences = Пользовательские настройки .zoom = Зумирование .reverse-mouse-wheel-zoom-zoomwheel = Обратить зумирование колесом мыши (ZOOMWHEEL) + .navigation-style = Стиль навигации + .nav-style-cad = CAD: Shift + средняя кнопка — вращение + .nav-style-blender = Blender: средняя кнопка — вращение, Shift — сдвиг + .nav-style-catia = CATIA: средняя + левая кнопка — вращение .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Тачпад: прокрутка панорамирует, Ctrl+прокрутка или щипок масштабирует .interface-scale = Масштаб интерфейса .zoom-factor = Коэффициент зумирования diff --git a/locales/tr-TR/opencadstudio.ftl b/locales/tr-TR/opencadstudio.ftl index 96070e9ff..95ab5cff8 100644 --- a/locales/tr-TR/opencadstudio.ftl +++ b/locales/tr-TR/opencadstudio.ftl @@ -1537,6 +1537,10 @@ 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) + .navigation-style = Gezinme stili + .nav-style-cad = CAD: Shift + orta tuş döndürür + .nav-style-blender = Blender: orta tuş döndürür, Shift kaydırır + .nav-style-catia = CATIA: orta + sol tuş döndürür .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 .interface-scale = Arayüz ölçeği .zoom-factor = Yakınlaştırma çarpanı diff --git a/locales/zh-CN/opencadstudio.ftl b/locales/zh-CN/opencadstudio.ftl index 0b92e850b..0f3e81c96 100644 --- a/locales/zh-CN/opencadstudio.ftl +++ b/locales/zh-CN/opencadstudio.ftl @@ -1538,6 +1538,10 @@ common = .user-preferences = 用户首选项 .zoom = 缩放 .reverse-mouse-wheel-zoom-zoomwheel = 反转鼠标滚轮缩放方向 (ZOOMWHEEL) + .navigation-style = 导航样式 + .nav-style-cad = CAD:Shift + 中键旋转 + .nav-style-blender = Blender:中键旋转,Shift 平移 + .nav-style-catia = CATIA:中键 + 左键旋转 .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 触控板:滚动平移,Ctrl+滚动或捏合缩放 .interface-scale = 界面缩放 .zoom-factor = 缩放系数 diff --git a/locales/zh-TW/opencadstudio.ftl b/locales/zh-TW/opencadstudio.ftl index 694ceeb00..14a67c52d 100644 --- a/locales/zh-TW/opencadstudio.ftl +++ b/locales/zh-TW/opencadstudio.ftl @@ -1550,6 +1550,10 @@ common = .user-preferences = 使用者偏好設定 .zoom = 縮放 .reverse-mouse-wheel-zoom-zoomwheel = 反轉滑鼠滾輪縮放方向 (ZOOMWHEEL) + .navigation-style = 導覽樣式 + .nav-style-cad = CAD:Shift + 中鍵旋轉 + .nav-style-blender = Blender:中鍵旋轉,Shift 平移 + .nav-style-catia = CATIA:中鍵 + 左鍵旋轉 .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 觸控板:捲動平移,Ctrl+捲動或捏合縮放 .interface-scale = 介面縮放 .zoom-factor = 縮放係數 diff --git a/src/app/mod.rs b/src/app/mod.rs index 453a0170a..8837df446 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -650,6 +650,11 @@ pub(super) struct OpenCADStudio { polar_increment_deg: f32, /// Reverse the mouse-wheel zoom direction when true (ZOOMWHEEL = 1). zoom_wheel_reversed: bool, + /// Which mouse gestures pan and orbit the model view. + navigation_style: crate::app::settings::NavigationStyle, + /// CATIA navigation: the left button went down while the middle one was + /// held, so the middle drag orbits until it is released. + nav_left_with_middle: bool, /// Scroll pans and Ctrl+scroll zooms (touchpads); see `scroll_intent`. touchpad_pan: bool, /// Multi-finger gestures on a touch screen. @@ -2657,6 +2662,7 @@ pub enum Message { CommandLineOpacityChanged(u8), /// Toggle reversing the mouse-wheel zoom direction (ZOOMWHEEL). ZoomWheelReversedChanged(bool), + NavigationStyleChanged(crate::app::settings::NavigationStyle), TouchpadPanChanged(bool), /// Options: show the pull-down menus (MENUBAR). MenuBarChanged(bool), @@ -4632,6 +4638,8 @@ impl OpenCADStudio { polar_mode: false, polar_increment_deg: 45.0, zoom_wheel_reversed: false, + navigation_style: Default::default(), + nav_left_with_middle: false, touchpad_pan: false, touch: Default::default(), touch_offset: None, diff --git a/src/app/settings.rs b/src/app/settings.rs index 2726411a4..a5b625c18 100644 --- a/src/app/settings.rs +++ b/src/app/settings.rs @@ -204,6 +204,33 @@ pub fn zoom_notch_percent(factor: i32) -> f32 { (1.0 - ratio) * 100.0 } +/// Which mouse gestures pan and orbit the model view. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum NavigationStyle { + /// Middle button pans; Shift + middle button orbits. + #[default] + Cad, + /// Middle button orbits; Shift + middle button pans. + Blender, + /// Middle button pans; middle and left buttons together orbit. + Catia, +} + +impl NavigationStyle { + pub const ALL: [NavigationStyle; 3] = [Self::Cad, Self::Blender, Self::Catia]; +} + +impl std::fmt::Display for NavigationStyle { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&match self { + Self::Cad => crate::t!("CAD: Shift + middle button orbits"), + Self::Blender => crate::t!("Blender: middle button orbits, Shift pans"), + Self::Catia => crate::t!("CATIA: middle + left button orbits"), + }) + } +} + /// Active pair of axes while isometric drafting is enabled. #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] pub enum IsoPlane { @@ -388,6 +415,7 @@ pub struct UserSettings { pub polar: bool, pub polar_increment_deg: f32, pub zoom_wheel_reversed: bool, + pub navigation_style: NavigationStyle, /// Scrolling pans and Ctrl+scroll (a touchpad pinch) zooms, for a /// touchpad that reports two-finger drags as wheel scrolls. pub touchpad_pan: bool, @@ -891,6 +919,7 @@ impl Default for UserSettings { polar: false, polar_increment_deg: 45.0, zoom_wheel_reversed: false, + navigation_style: NavigationStyle::Cad, touchpad_pan: false, ui_scale_percent: 100, zoom_factor: 60, diff --git a/src/app/update/file.rs b/src/app/update/file.rs index 3e7a744b7..63171f8a3 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -778,6 +778,7 @@ impl OpenCADStudio { polar: self.polar_mode, polar_increment_deg: self.polar_increment_deg, zoom_wheel_reversed: self.zoom_wheel_reversed, + navigation_style: self.navigation_style, touchpad_pan: self.touchpad_pan, ui_scale_percent: self.ui_scale_percent, zoom_factor: self.zoom_factor, @@ -913,6 +914,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.navigation_style = s.navigation_style; self.touchpad_pan = s.touchpad_pan; self.ui_scale_percent = crate::app::settings::clamp_ui_scale(s.ui_scale_percent); self.zoom_factor = crate::app::settings::clamp_zoom_factor(s.zoom_factor); diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index 1f330f0d7..8c304ff27 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -4482,6 +4482,25 @@ impl OpenCADStudio { Task::none() } + // CATIA navigation: the left button pressed during a middle drag + // turns the drag into an orbit instead of starting a pick. + Message::ViewportLeftPressAt(_) | Message::ViewportLeftPress | Message::PanePress(_) + if self.navigation_style == crate::app::settings::NavigationStyle::Catia + && self.tabs[self.active_tab] + .scene + .selection + .borrow() + .input + .middle_down => + { + self.nav_left_with_middle = true; + Task::none() + } + Message::ViewportLeftRelease | Message::PaneRelease(_) if self.nav_left_with_middle => { + self.nav_left_with_middle = false; + Task::none() + } + Message::ViewportMove(p) => self.on_viewport_move(p), Message::ViewportExit => self.on_viewport_exit(), @@ -4686,6 +4705,7 @@ impl OpenCADStudio { } Message::ViewportMiddleRelease => { + self.nav_left_with_middle = false; let i = self.active_tab; let mut sel = self.tabs[i].scene.selection.borrow_mut(); sel.input.middle_down = false; @@ -9225,6 +9245,12 @@ impl OpenCADStudio { Task::none() } + Message::NavigationStyleChanged(style) => { + self.navigation_style = style; + self.persist_settings_if_changed(); + Task::none() + } + Message::MenuBarChanged(shown) => { self.show_menu_bar = shown; self.persist_settings_if_changed(); diff --git a/src/app/update/viewport.rs b/src/app/update/viewport.rs index e2089bbe2..107bdb7c4 100644 --- a/src/app/update/viewport.rs +++ b/src/app/update/viewport.rs @@ -1416,7 +1416,7 @@ impl OpenCADStudio { // — the requested Zoom=wheel / Pan=MMB / Rotate=Shift+MMB // scheme (#229). Floating viewports and paper keep the // plain MMB pan. - if self.shift_down || self.tabs[i].orbit_mode { + if self.middle_drag_orbits(i) { if self.tabs[i].scene.active_viewport.is_some() { // Orbit the floating viewport's own model view. drop(sel); @@ -3165,6 +3165,18 @@ impl OpenCADStudio { Task::none() } + /// Whether a middle-button drag orbits rather than pans, by the + /// navigation style (an armed orbit tool always orbits). + fn middle_drag_orbits(&self, i: usize) -> bool { + use crate::app::settings::NavigationStyle; + self.tabs[i].orbit_mode + || match self.navigation_style { + NavigationStyle::Cad => self.shift_down, + NavigationStyle::Blender => !self.shift_down, + NavigationStyle::Catia => self.nav_left_with_middle, + } + } + pub(crate) fn on_viewport_exit(&mut self) -> Task { let i = self.active_tab; self.tabs[i].measurement.live_visible = false; diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index dfb36033d..cae7c00d6 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -312,6 +312,7 @@ impl OpenCADStudio { show_ribbon: !self.ribbon_closed, hatch_associative: self.hatch_associative, zoom_wheel_reversed: self.zoom_wheel_reversed, + navigation_style: self.navigation_style, touchpad_pan: self.touchpad_pan, ui_scale_percent: self.ui_scale_percent, zoom_factor: self.zoom_factor, diff --git a/src/locale_catalog.rs b/src/locale_catalog.rs index aa0cb509b..b7d956730 100644 --- a/src/locale_catalog.rs +++ b/src/locale_catalog.rs @@ -5070,6 +5070,10 @@ 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")), + "Navigation style" => Some(("common", "navigation-style")), + "CAD: Shift + middle button orbits" => Some(("common", "nav-style-cad")), + "Blender: middle button orbits, Shift pans" => Some(("common", "nav-style-blender")), + "CATIA: middle + left button orbits" => Some(("common", "nav-style-catia")), "Touchpad: scroll pans, Ctrl+scroll or pinch zooms" => Some(("common", "touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms")), "Interface scale" => Some(("common", "interface-scale")), "Zoom factor" => Some(("common", "zoom-factor")), diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index 0ec1b1fc4..87318baba 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -63,6 +63,8 @@ pub struct AppPrefs { pub hatch_associative: bool, /// ZOOMWHEEL: reverse the mouse-wheel zoom direction. pub zoom_wheel_reversed: bool, + /// Which mouse gestures pan and orbit the model view. + pub navigation_style: crate::app::settings::NavigationStyle, /// Scroll pans and Ctrl+scroll zooms (touchpads). pub touchpad_pan: bool, /// Interface scale in percent. @@ -1274,6 +1276,16 @@ pub fn view_window<'a>( Space::new().height(10), spacemouse, Space::new().height(12), + text(crate::t!("Navigation style")).size(15), + Space::new().height(10), + iced::widget::pick_list( + Some(prefs.navigation_style), + crate::app::settings::NavigationStyle::ALL, + |style| style.to_string(), + ) + .on_select(Message::NavigationStyleChanged) + .text_size(12), + Space::new().height(12), text(crate::t!("Zoom")).size(15), Space::new().height(10), row![