diff --git a/api/cpp/cbindgen.rs b/api/cpp/cbindgen.rs index f80f268c0..7a05dee04 100644 --- a/api/cpp/cbindgen.rs +++ b/api/cpp/cbindgen.rs @@ -563,7 +563,7 @@ fn gen_corelib( "slint_windowrc_supports_native_menu_bar", "slint_windowrc_setup_native_menu_bar", "slint_windowrc_show_native_popup_menu", - "slint_windowrc_default_font_size", + "slint_windowrc_resolved_default_font_size", "slint_windowrc_dispatch_pointer_event", "slint_windowrc_dispatch_key_event", "slint_windowrc_dispatch_event", diff --git a/api/cpp/include/slint_window.h b/api/cpp/include/slint_window.h index 64d70cffa..890d1fcda 100644 --- a/api/cpp/include/slint_window.h +++ b/api/cpp/include/slint_window.h @@ -230,9 +230,9 @@ public: cbindgen_private::slint_register_bitmap_font(&inner, &font); } - inline float default_font_size() const + inline float resolved_default_font_size() const { - return cbindgen_private::slint_windowrc_default_font_size(&inner); + return cbindgen_private::slint_windowrc_resolved_default_font_size(&inner); } /// \private diff --git a/internal/backends/qt/qt_window.rs b/internal/backends/qt/qt_window.rs index c723876a6..6c69d8f52 100644 --- a/internal/backends/qt/qt_window.rs +++ b/internal/backends/qt/qt_window.rs @@ -2400,6 +2400,16 @@ impl i_slint_core::renderer::RendererSealed for QtWindow { Ok(()) } + fn default_font_size(&self) -> LogicalLength { + let default_font_size = cpp!(unsafe[] -> i32 as "int" { + return QFontInfo(qApp->font()).pixelSize(); + }); + // Ideally this would return the value from another property with a binding that's updated + // as a FontChange event is received. This is relevant for the case of using the Qt backend + // with a non-native style. + LogicalLength::new(default_font_size as f32) + } + fn free_graphics_resources( &self, component: ItemTreeRef, diff --git a/internal/backends/testing/testing_backend.rs b/internal/backends/testing/testing_backend.rs index e8cdcc407..85bbdcce4 100644 --- a/internal/backends/testing/testing_backend.rs +++ b/internal/backends/testing/testing_backend.rs @@ -235,6 +235,10 @@ impl RendererSealed for TestingWindow { Ok(()) } + fn default_font_size(&self) -> LogicalLength { + LogicalLength::new(10.) + } + fn set_window_adapter(&self, _window_adapter: &Rc) { // No-op since TestingWindow is also the WindowAdapter } diff --git a/internal/compiler/generator/cpp.rs b/internal/compiler/generator/cpp.rs index 01d2502f1..a97ede07b 100644 --- a/internal/compiler/generator/cpp.rs +++ b/internal/compiler/generator/cpp.rs @@ -3560,7 +3560,7 @@ fn compile_builtin_function_call( format!("{}.scale_factor()", access_window_field(ctx)) } BuiltinFunction::GetWindowDefaultFontSize => { - format!("{}.default_font_size()", access_window_field(ctx)) + format!("{}.resolved_default_font_size()", access_window_field(ctx)) } BuiltinFunction::AnimationTick => "slint::cbindgen_private::slint_animation_tick()".into(), BuiltinFunction::Debug => { diff --git a/internal/compiler/generator/rust.rs b/internal/compiler/generator/rust.rs index b58cc02c9..b1b382c69 100644 --- a/internal/compiler/generator/rust.rs +++ b/internal/compiler/generator/rust.rs @@ -3022,7 +3022,7 @@ fn compile_builtin_function_call( } BuiltinFunction::GetWindowDefaultFontSize => { let window_adapter_tokens = access_window_adapter_field(ctx); - quote!(sp::WindowInner::from_pub(#window_adapter_tokens.window()).window_item().unwrap().as_pin_ref().default_font_size().get()) + quote!(sp::WindowItem::resolved_default_font_size(&sp::WindowInner::from_pub(#window_adapter_tokens.window()).window_item_rc().unwrap()).get()) } BuiltinFunction::AnimationTick => { quote!(sp::animation_tick()) diff --git a/internal/core/items.rs b/internal/core/items.rs index 161384be1..e671baf94 100644 --- a/internal/core/items.rs +++ b/internal/core/items.rs @@ -1325,6 +1325,11 @@ impl WindowItem { } } + pub fn resolved_default_font_size(self_rc: &ItemRc) -> LogicalLength { + Self::resolve_font_property(&self_rc, Self::font_size) + .unwrap_or_else(|| self_rc.window_adapter().unwrap().renderer().default_font_size()) + } + fn resolve_font_property( self_rc: &ItemRc, property_fn: impl Fn(Pin<&Self>) -> Option, diff --git a/internal/core/renderer.rs b/internal/core/renderer.rs index bd82fb0c4..8924fee0d 100644 --- a/internal/core/renderer.rs +++ b/internal/core/renderer.rs @@ -118,6 +118,8 @@ pub trait RendererSealed { fn set_window_adapter(&self, _window_adapter: &Rc); + fn default_font_size(&self) -> LogicalLength; + fn resize(&self, _size: crate::api::PhysicalSize) -> Result<(), PlatformError> { Ok(()) } diff --git a/internal/core/software_renderer.rs b/internal/core/software_renderer.rs index 735270a62..50be18c18 100644 --- a/internal/core/software_renderer.rs +++ b/internal/core/software_renderer.rs @@ -883,6 +883,10 @@ impl RendererSealed for SoftwareRenderer { self::fonts::systemfonts::register_font_from_path(path) } + fn default_font_size(&self) -> LogicalLength { + self::fonts::DEFAULT_FONT_SIZE + } + fn set_window_adapter(&self, window_adapter: &Rc) { *self.maybe_window_adapter.borrow_mut() = Some(Rc::downgrade(window_adapter)); self.partial_rendering_state.clear_cache(); diff --git a/internal/core/window.rs b/internal/core/window.rs index cb43a5d92..643e4c8e3 100644 --- a/internal/core/window.rs +++ b/internal/core/window.rs @@ -1521,6 +1521,7 @@ pub mod ffi { use crate::api::{RenderingNotifier, RenderingState, SetRenderingNotifierError}; use crate::graphics::Size; use crate::graphics::{IntSize, Rgba8Pixel}; + use crate::items::WindowItem; use crate::SharedVector; /// This enum describes a low-level access to specific graphics APIs used @@ -1900,11 +1901,12 @@ pub mod ffi { /// Return the default-font-size property of the WindowItem #[unsafe(no_mangle)] - pub unsafe extern "C" fn slint_windowrc_default_font_size( + pub unsafe extern "C" fn slint_windowrc_resolved_default_font_size( handle: *const WindowAdapterRcOpaque, ) -> f32 { let window_adapter = &*(handle as *const Rc); - window_adapter.window().0.window_item().unwrap().as_pin_ref().default_font_size().get() + WindowItem::resolved_default_font_size(&window_adapter.window().0.window_item_rc().unwrap()) + .get() } /// Dispatch a key pressed or release event diff --git a/internal/interpreter/eval.rs b/internal/interpreter/eval.rs index 043430218..b3fe7085b 100644 --- a/internal/interpreter/eval.rs +++ b/internal/interpreter/eval.rs @@ -22,7 +22,7 @@ use i_slint_compiler::namedreference::NamedReference; use i_slint_compiler::object_tree::ElementRc; use i_slint_core as corelib; use i_slint_core::input::FocusReason; -use i_slint_core::items::ItemRc; +use i_slint_core::items::{ItemRc, WindowItem}; use smol_str::SmolStr; use std::collections::HashMap; use std::rc::Rc; @@ -432,7 +432,7 @@ fn call_builtin_function( ), BuiltinFunction::GetWindowDefaultFontSize => { Value::Number(local_context.component_instance.access_window(|window| { - window.window_item().unwrap().as_pin_ref().default_font_size().get() + WindowItem::resolved_default_font_size(&window.window_item_rc().unwrap()).get() }) as _) } BuiltinFunction::AnimationTick => { diff --git a/internal/renderers/femtovg/lib.rs b/internal/renderers/femtovg/lib.rs index 59b318ebb..fc57c05e0 100644 --- a/internal/renderers/femtovg/lib.rs +++ b/internal/renderers/femtovg/lib.rs @@ -428,6 +428,10 @@ impl RendererSealed for FemtoVGRenderer { sharedfontdb::register_font_from_path(path) } + fn default_font_size(&self) -> LogicalLength { + self::fonts::DEFAULT_FONT_SIZE + } + fn set_rendering_notifier( &self, callback: Box, diff --git a/internal/renderers/skia/lib.rs b/internal/renderers/skia/lib.rs index 245410672..d2f57ecb7 100644 --- a/internal/renderers/skia/lib.rs +++ b/internal/renderers/skia/lib.rs @@ -899,6 +899,10 @@ impl i_slint_core::renderer::RendererSealed for SkiaRenderer { } } + fn default_font_size(&self) -> LogicalLength { + self::textlayout::DEFAULT_FONT_SIZE + } + fn free_graphics_resources( &self, component: i_slint_core::item_tree::ItemTreeRef, diff --git a/tests/cases/types/rem.slint b/tests/cases/types/rem.slint index 28e148332..a6e797c1e 100644 --- a/tests/cases/types/rem.slint +++ b/tests/cases/types/rem.slint @@ -1,26 +1,25 @@ // Copyright © SixtyFPS GmbH // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0 -global SomeGlobal := { - property global_rem: 4rem; +global SomeGlobal { + out property global_rem: 4rem; } -TestCase := Window { - default-font-size: 10px; - property normal: 1rem; - property double: 2rem; - property half: 0.5rem; - property four_rem: 4rem; - property four: four_rem; +export component TestCase inherits Window { + out property normal: 1rem; + out property double: 2rem; + out property half: 0.5rem; + out property four_rem: 4rem; + out property four: four_rem; - property phys-pixel-size: 1rem; + out property phys-pixel-size: 1rem; - property px_to_rem: 20px; - property phx_to_rem: 20phx; + out property px_to_rem: 20px; + out property phx_to_rem: 20phx; - property cmp_test: normal < 1rem && double > 1rem; + out property cmp_test: normal < 1rem && double > 1rem; - property test:(normal == 10px && double == 20px && half == 5px && four_rem == 40px && SomeGlobal.global_rem == 40px && phys-pixel-size == 10phx && px_to_rem == 2rem); + out property test:(normal == 10px && double == 20px && half == 5px && four_rem == 40px && SomeGlobal.global_rem == 40px && phys-pixel-size == 10phx && px_to_rem == 2rem); } /*