From 340104bf1bfe497c6f98c14308177e9d7c748f84 Mon Sep 17 00:00:00 2001 From: Hakan Seven Date: Thu, 8 Oct 2026 14:41:46 +0300 Subject: [PATCH] feat(options): interface scale for the whole window MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On a non-Retina screen macOS draws the interface at 1x, which reads small on a Full HD monitor, and there was no way to enlarge it. Options > Display now offers an interface scale of 75–200 % in 25 % steps, applied through the window's scale factor on top of the display's own and kept with the user settings. It is a list rather than a slider because the dialog rescales under the pointer as the value changes. Fixes #1655 Co-Authored-By: Claude Opus 5.5 --- locales/ar-SA/opencadstudio.ftl | 1 + locales/bg-BG/opencadstudio.ftl | 1 + locales/cs-CZ/opencadstudio.ftl | 1 + locales/de-DE/opencadstudio.ftl | 1 + locales/el-GR/opencadstudio.ftl | 1 + locales/en-US/opencadstudio.ftl | 1 + locales/es-ES/opencadstudio.ftl | 1 + locales/fi-FI/opencadstudio.ftl | 1 + locales/fr-FR/opencadstudio.ftl | 1 + locales/hi-IN/opencadstudio.ftl | 1 + locales/hu-HU/opencadstudio.ftl | 1 + locales/it-IT/opencadstudio.ftl | 1 + locales/ja-JP/opencadstudio.ftl | 1 + locales/ko-KR/opencadstudio.ftl | 1 + locales/lo-LA/opencadstudio.ftl | 1 + locales/nl-NL/opencadstudio.ftl | 1 + locales/pl-PL/opencadstudio.ftl | 1 + locales/pt-BR/opencadstudio.ftl | 1 + locales/ru-RU/opencadstudio.ftl | 1 + locales/tr-TR/opencadstudio.ftl | 1 + locales/zh-CN/opencadstudio.ftl | 1 + locales/zh-TW/opencadstudio.ftl | 1 + src/app/mod.rs | 6 ++++++ src/app/settings.rs | 8 ++++++++ src/app/update/file.rs | 2 ++ src/app/update/mod.rs | 6 ++++++ src/app/view/modal.rs | 1 + src/locale_catalog.rs | 1 + src/ui/window/options.rs | 19 +++++++++++++++++++ 29 files changed, 65 insertions(+) diff --git a/locales/ar-SA/opencadstudio.ftl b/locales/ar-SA/opencadstudio.ftl index 9e7adf385..3fa33ea45 100644 --- a/locales/ar-SA/opencadstudio.ftl +++ b/locales/ar-SA/opencadstudio.ftl @@ -1451,6 +1451,7 @@ common = .zoom = التكبير .reverse-mouse-wheel-zoom-zoomwheel = عكس التكبير بعجلة الفأرة (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = لوحة اللمس: التمرير يحرك العرض، Ctrl+تمرير أو القرص يكبّر + .interface-scale = مقياس الواجهة .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 d4ca54bf4..d186cba66 100644 --- a/locales/bg-BG/opencadstudio.ftl +++ b/locales/bg-BG/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .zoom = Мащабиране .reverse-mouse-wheel-zoom-zoomwheel = Обръщане на мащабирането с колелцето (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Тъчпад: превъртането мести изгледа, Ctrl+превъртане или щипване мащабира + .interface-scale = Мащаб на интерфейса .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 1d3710279..07669d6b8 100644 --- a/locales/cs-CZ/opencadstudio.ftl +++ b/locales/cs-CZ/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .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 + .interface-scale = Měřítko rozhraní .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 68af4c46f..ea5b01467 100644 --- a/locales/de-DE/opencadstudio.ftl +++ b/locales/de-DE/opencadstudio.ftl @@ -1439,6 +1439,7 @@ common = .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 + .interface-scale = Oberflächenskalierung .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 c3e4f2c83..743e2bb7c 100644 --- a/locales/el-GR/opencadstudio.ftl +++ b/locales/el-GR/opencadstudio.ftl @@ -1440,6 +1440,7 @@ common = .zoom = Ζουμ .reverse-mouse-wheel-zoom-zoomwheel = Αντιστροφή ζουμ με τον τροχό (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Επιφάνεια αφής: η κύλιση μετακινεί, Ctrl+κύλιση ή τσίμπημα κάνει ζουμ + .interface-scale = Κλίμακα διεπαφής .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 39581bfde..7c22d658b 100644 --- a/locales/en-US/opencadstudio.ftl +++ b/locales/en-US/opencadstudio.ftl @@ -1440,6 +1440,7 @@ common = .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 + .interface-scale = Interface scale .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 3e23e63e2..66d5e31d7 100644 --- a/locales/es-ES/opencadstudio.ftl +++ b/locales/es-ES/opencadstudio.ftl @@ -1439,6 +1439,7 @@ common = .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 + .interface-scale = Escala de la interfaz .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 f5332f224..fb4ce630b 100644 --- a/locales/fi-FI/opencadstudio.ftl +++ b/locales/fi-FI/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .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 + .interface-scale = Käyttöliittymän skaalaus .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 4b1c9c4f6..85bf5e706 100644 --- a/locales/fr-FR/opencadstudio.ftl +++ b/locales/fr-FR/opencadstudio.ftl @@ -1439,6 +1439,7 @@ common = .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 + .interface-scale = Échelle de l'interface .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 1374059b8..46e2c5f75 100644 --- a/locales/hi-IN/opencadstudio.ftl +++ b/locales/hi-IN/opencadstudio.ftl @@ -1427,6 +1427,7 @@ common = .zoom = ज़ूम .reverse-mouse-wheel-zoom-zoomwheel = माउस व्हील ज़ूम उलटें (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = टचपैड: स्क्रॉल पैन करता है, Ctrl+स्क्रॉल या पिंच ज़ूम करता है + .interface-scale = इंटरफ़ेस स्केल .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 e61e6db3f..59b432544 100644 --- a/locales/hu-HU/opencadstudio.ftl +++ b/locales/hu-HU/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .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 + .interface-scale = Felület mérete .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 db0ca1b45..d2bfc1ae1 100644 --- a/locales/it-IT/opencadstudio.ftl +++ b/locales/it-IT/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .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 + .interface-scale = Scala dell'interfaccia .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 b3da26db1..72c9b13e0 100644 --- a/locales/ja-JP/opencadstudio.ftl +++ b/locales/ja-JP/opencadstudio.ftl @@ -1429,6 +1429,7 @@ common = .zoom = ズーム .reverse-mouse-wheel-zoom-zoomwheel = マウス ホイールのズーム方向を反転 (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = タッチパッド: スクロールで画面移動、Ctrl+スクロールまたはピンチでズーム + .interface-scale = インターフェースの拡大率 .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 07b8733d4..403135aa8 100644 --- a/locales/ko-KR/opencadstudio.ftl +++ b/locales/ko-KR/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .zoom = 줌 .reverse-mouse-wheel-zoom-zoomwheel = 마우스 휠 줌 방향 반전 (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 터치패드: 스크롤은 화면 이동, Ctrl+스크롤 또는 핀치는 확대/축소 + .interface-scale = 인터페이스 배율 .zoom-factor = 줌 배율 .how-far-one-wheel-notch-zooms-zoomfactor = 휠 한 칸이 확대하는 정도 (ZOOMFACTOR). .text-and-dimensions = 문자 및 치수 diff --git a/locales/lo-LA/opencadstudio.ftl b/locales/lo-LA/opencadstudio.ftl index 0c633a84e..8b75a109a 100644 --- a/locales/lo-LA/opencadstudio.ftl +++ b/locales/lo-LA/opencadstudio.ftl @@ -1440,6 +1440,7 @@ common = .zoom = ຊູມ .reverse-mouse-wheel-zoom-zoomwheel = ສະຫຼັບທິດທາງການໝຸນລໍ້ເມົາສ໌ຊູມ (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = ທັດແພດ: ເລື່ອນເພື່ອຍ້າຍມຸມມອງ, Ctrl+ເລື່ອນ ຫຼື ບີບເພື່ອຊູມ + .interface-scale = ຂະໜາດສ່ວນຕິດຕໍ່ .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 b80c45c52..112069a59 100644 --- a/locales/nl-NL/opencadstudio.ftl +++ b/locales/nl-NL/opencadstudio.ftl @@ -1437,6 +1437,7 @@ common = .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 + .interface-scale = Interfaceschaal .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 4bda1bd8b..16cec2da3 100644 --- a/locales/pl-PL/opencadstudio.ftl +++ b/locales/pl-PL/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .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 + .interface-scale = Skala interfejsu .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 f16e194c4..e32d1d614 100644 --- a/locales/pt-BR/opencadstudio.ftl +++ b/locales/pt-BR/opencadstudio.ftl @@ -1439,6 +1439,7 @@ common = .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 + .interface-scale = Escala da interface .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 adb69ae0f..5734d26e5 100644 --- a/locales/ru-RU/opencadstudio.ftl +++ b/locales/ru-RU/opencadstudio.ftl @@ -1442,6 +1442,7 @@ common = .zoom = Зумирование .reverse-mouse-wheel-zoom-zoomwheel = Обратить зумирование колесом мыши (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = Тачпад: прокрутка панорамирует, Ctrl+прокрутка или щипок масштабирует + .interface-scale = Масштаб интерфейса .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 fb9d7010f..87e53c2af 100644 --- a/locales/tr-TR/opencadstudio.ftl +++ b/locales/tr-TR/opencadstudio.ftl @@ -1425,6 +1425,7 @@ common = .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 + .interface-scale = Arayüz ölçeği .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 da267f304..ac1e10a16 100644 --- a/locales/zh-CN/opencadstudio.ftl +++ b/locales/zh-CN/opencadstudio.ftl @@ -1426,6 +1426,7 @@ common = .zoom = 缩放 .reverse-mouse-wheel-zoom-zoomwheel = 反转鼠标滚轮缩放方向 (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 触控板:滚动平移,Ctrl+滚动或捏合缩放 + .interface-scale = 界面缩放 .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 07312b40e..122cf89e5 100644 --- a/locales/zh-TW/opencadstudio.ftl +++ b/locales/zh-TW/opencadstudio.ftl @@ -1438,6 +1438,7 @@ common = .zoom = 縮放 .reverse-mouse-wheel-zoom-zoomwheel = 反轉滑鼠滾輪縮放方向 (ZOOMWHEEL) .touchpad-scroll-pans-ctrl-scroll-or-pinch-zooms = 觸控板:捲動平移,Ctrl+捲動或捏合縮放 + .interface-scale = 介面縮放 .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 2532acacb..50dc08597 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -561,6 +561,8 @@ pub(super) struct OpenCADStudio { zoom_wheel_reversed: bool, /// Scroll pans and Ctrl+scroll zooms (touchpads); see `scroll_intent`. touchpad_pan: bool, + /// Interface scale in percent, applied through the window scale factor. + ui_scale_percent: u16, /// 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 @@ -2378,6 +2380,8 @@ pub enum Message { /// Toggle reversing the mouse-wheel zoom direction (ZOOMWHEEL). ZoomWheelReversedChanged(bool), TouchpadPanChanged(bool), + /// Interface scale in percent (Options > Display). + UiScaleChanged(u16), /// Change how far one wheel notch zooms, from the Options slider /// (ZOOMFACTOR). ZoomFactorChanged(i32), @@ -4161,6 +4165,7 @@ impl OpenCADStudio { polar_increment_deg: 45.0, zoom_wheel_reversed: false, touchpad_pan: false, + ui_scale_percent: 100, zoom_factor: 60, zoom_factor_input: 60.to_string(), cursor_size: 5, @@ -4904,6 +4909,7 @@ pub fn run() -> iced::Result { ..iced::Settings::default() }) .subscription(OpenCADStudio::subscription) + .scale_factor(|state: &OpenCADStudio, _| f32::from(state.ui_scale_percent) / 100.0) .title(|state: &OpenCADStudio, window_id: window::Id| { let _ = window_id; // all dialogs are in-canvas modals now if let Some(tab) = state.tabs.get(state.active_tab) { diff --git a/src/app/settings.rs b/src/app/settings.rs index aa6b60548..2395c610d 100644 --- a/src/app/settings.rs +++ b/src/app/settings.rs @@ -183,6 +183,11 @@ pub const ZOOM_FACTOR_MAX: i32 = 500; /// Hold a ZOOMFACTOR inside the range the application can store, wherever it /// arrives from — the slider, the Options field, or a configuration file /// written by hand or by an older build. +/// Interface scale in percent, kept to the range the Options slider offers. +pub fn clamp_ui_scale(percent: u16) -> u16 { + percent.clamp(75, 200) +} + pub fn clamp_zoom_factor(v: i32) -> i32 { v.clamp(ZOOM_FACTOR_MIN, ZOOM_FACTOR_MAX) } @@ -391,6 +396,8 @@ pub struct UserSettings { /// Scrolling pans and Ctrl+scroll (a touchpad pinch) zooms, for a /// touchpad that reports two-finger drags as wheel scrolls. pub touchpad_pan: bool, + /// Interface scale in percent, on top of the display's own scale. + pub ui_scale_percent: u16, pub zoom_factor: i32, /// CURSORSIZE: normalized crosshair reach; 5 retains the original 60 px arms. pub cursor_size: i32, @@ -811,6 +818,7 @@ impl Default for UserSettings { polar_increment_deg: 45.0, zoom_wheel_reversed: false, touchpad_pan: false, + ui_scale_percent: 100, zoom_factor: 60, cursor_size: 5, pick_box: 3, diff --git a/src/app/update/file.rs b/src/app/update/file.rs index b9c7cc58c..cf5533296 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -663,6 +663,7 @@ impl OpenCADStudio { polar_increment_deg: self.polar_increment_deg, zoom_wheel_reversed: self.zoom_wheel_reversed, touchpad_pan: self.touchpad_pan, + ui_scale_percent: self.ui_scale_percent, zoom_factor: self.zoom_factor, cursor_size: self.cursor_size, pick_box: self.pick_box, @@ -764,6 +765,7 @@ impl OpenCADStudio { self.polar_increment_deg = s.polar_increment_deg; self.zoom_wheel_reversed = s.zoom_wheel_reversed; 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); // 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 61a3dffaf..b4bac5d8b 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -8391,6 +8391,12 @@ impl OpenCADStudio { Task::none() } + Message::UiScaleChanged(percent) => { + self.ui_scale_percent = crate::app::settings::clamp_ui_scale(percent); + 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/view/modal.rs b/src/app/view/modal.rs index 510b5edc2..83a6d3bfb 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -317,6 +317,7 @@ impl OpenCADStudio { commandline_fade_ms: self.commandline_fade_ms, zoom_wheel_reversed: self.zoom_wheel_reversed, touchpad_pan: self.touchpad_pan, + ui_scale_percent: self.ui_scale_percent, 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 b38ab91df..19b4ed554 100644 --- a/src/locale_catalog.rs +++ b/src/locale_catalog.rs @@ -4798,6 +4798,7 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static "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")), + "Interface scale" => Some(("common", "interface-scale")), "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 a8ebaa668..427cbc742 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -61,6 +61,8 @@ pub struct AppPrefs { pub zoom_wheel_reversed: bool, /// Scroll pans and Ctrl+scroll zooms (touchpads). pub touchpad_pan: bool, + /// Interface scale in percent. + pub ui_scale_percent: u16, /// ZOOMFACTOR. The slider sets the range the system variable has; the /// field beside it reaches `settings::ZOOM_FACTOR_MAX`. pub zoom_factor: i32, @@ -679,6 +681,23 @@ pub fn view_window<'a>( .width(sizing.width), Space::new().height(12), color_controls, + Space::new().height(16), + // A list, not a slider: the dialog rescales under the cursor as the + // value changes, which would drag a slider along with it. + row![ + text(crate::t!("Interface scale")).size(12).width(150), + iced::widget::pick_list( + Some(format!("{}%", prefs.ui_scale_percent)), + [75u16, 100, 125, 150, 175, 200].map(|p| format!("{p}%")).to_vec(), + |label: &String| label.clone(), + ) + .on_select(|label: String| { + Message::UiScaleChanged(label.trim_end_matches('%').parse().unwrap_or(100)) + }) + .width(sizing.width), + ] + .spacing(12) + .align_y(iced::Center), Space::new().height(24), row![ text(crate::t!("Model Space Appearance")).size(15),