From 50172b66bc1ee5c6bbd15196886bd0cbdcf57516 Mon Sep 17 00:00:00 2001 From: Laurent Montel Date: Tue, 15 Sep 2026 10:59:50 +0200 Subject: [PATCH] Spinbox missed to add font-family and font-bold property. --- .../std-widgets/basic-widgets/spinbox.mdx | 10 ++++++ internal/backends/qt/qt_widgets/spinbox.rs | 24 +++++++++++++- internal/compiler/builtin_elements.rs | 2 ++ .../widgets/common/spinbox-base.slint | 10 +++--- .../compiler/widgets/cosmic/spinbox.slint | 2 ++ .../compiler/widgets/cupertino/spinbox.slint | 2 ++ .../compiler/widgets/fluent/spinbox.slint | 2 ++ .../compiler/widgets/material/spinbox.slint | 2 ++ tests/cases/widgets/spinbox_font.slint | 31 +++++++++++++++++++ 9 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 tests/cases/widgets/spinbox_font.slint diff --git a/docs/astro/src/content/docs/reference/std-widgets/basic-widgets/spinbox.mdx b/docs/astro/src/content/docs/reference/std-widgets/basic-widgets/spinbox.mdx index 8dfe526ead6..89b95642b8e 100644 --- a/docs/astro/src/content/docs/reference/std-widgets/basic-widgets/spinbox.mdx +++ b/docs/astro/src/content/docs/reference/std-widgets/basic-widgets/spinbox.mdx @@ -83,6 +83,16 @@ The size that is used on increment or decrement of `value`. The horizontal alignment of the text. +### font-family + +The font family of the input text + + +### font-italic + +The italic state of the font of the input text + + ## Callbacks ### edited(int) diff --git a/internal/backends/qt/qt_widgets/spinbox.rs b/internal/backends/qt/qt_widgets/spinbox.rs index e9a3d6e642c..825454b225b 100644 --- a/internal/backends/qt/qt_widgets/spinbox.rs +++ b/internal/backends/qt/qt_widgets/spinbox.rs @@ -32,6 +32,8 @@ pub struct NativeSpinBox { pub maximum: Property, pub step_size: Property, pub horizontal_alignment: Property, + pub font_family: Property, + pub font_italic: Property, pub cached_rendering_data: CachedRenderingData, pub edited: Callback, data: Property, @@ -63,6 +65,14 @@ if (pressed) { option.stepEnabled = QAbstractSpinBox::StepDownEnabled | QAbstractSpinBox::StepUpEnabled; option.frame = true; } + +QFont spinBoxFont(const QWidget *widget, const QString &family, bool italic) { +QFont font = widget->font(); +if (!family.isEmpty()) + font.setFamily(family); +font.setItalic(italic); +return font; +} }} impl Item for NativeSpinBox { @@ -89,6 +99,8 @@ impl Item for NativeSpinBox { let pressed = data.pressed; let enabled = self.enabled(); let read_only = self.read_only(); + let font_family: qttypes::QString = self.font_family().as_str().into(); + let font_italic = self.font_italic(); let widget: NonNull<()> = SlintTypeErasedWidgetPtr::qwidget_ptr(&self.widget_ptr); let size = cpp!(unsafe [ @@ -97,12 +109,15 @@ impl Item for NativeSpinBox { pressed as "bool", enabled as "bool", read_only as "bool", + font_family as "QString", + font_italic as "bool", widget as "QWidget*" ] -> qttypes::QSize as "QSize" { ensure_initialized(); auto style = qApp->style(); QStyleOptionSpinBox option; + option.fontMetrics = QFontMetrics(spinBoxFont(widget, font_family, font_italic)); initQSpinBoxOptions(option, pressed, enabled, read_only, active_controls); QStyleOptionFrame frame; @@ -327,6 +342,8 @@ impl Item for NativeSpinBox { let active_controls = data.active_controls; let pressed = data.pressed; let read_only = this.read_only(); + let font_family: qttypes::QString = this.font_family().as_str().into(); + let font_italic = this.font_italic(); let horizontal_alignment = match this.horizontal_alignment() { TextHorizontalAlignment::Left => key_generated::Qt_AlignmentFlag_AlignLeft, @@ -347,10 +364,14 @@ impl Item for NativeSpinBox { pressed as "bool", dpr as "float", initial_state as "int", - horizontal_alignment as "int" + horizontal_alignment as "int", + font_family as "QString", + font_italic as "bool" ] { auto style = qApp->style(); + QFont font = spinBoxFont(widget, font_family, font_italic); QStyleOptionSpinBox option; + option.fontMetrics = QFontMetrics(font); option.styleObject = widget; option.state |= QStyle::State(initial_state); if (enabled && has_focus) { @@ -372,6 +393,7 @@ impl Item for NativeSpinBox { QRect text_rect = qApp->style()->subElementRect(QStyle::SE_LineEditContents, &frame, widget); text_rect.adjust(1, 2, 1, 2); (*painter)->setPen(option.palette.color(QPalette::Text)); + (*painter)->setFont(font); (*painter)->drawText(text_rect, QString::number(value), QTextOption(static_cast(horizontal_alignment))); }); } diff --git a/internal/compiler/builtin_elements.rs b/internal/compiler/builtin_elements.rs index 7704b98a320..529b73acc8b 100644 --- a/internal/compiler/builtin_elements.rs +++ b/internal/compiler/builtin_elements.rs @@ -3748,6 +3748,8 @@ fn build(l: &mut Loader) { in property step-size: 1; in property horizontal-alignment; in property read-only; + in property font-family; + in property font-italic; callback edited(value: int); } } diff --git a/internal/compiler/widgets/common/spinbox-base.slint b/internal/compiler/widgets/common/spinbox-base.slint index 6e23192529f..9c96488c677 100644 --- a/internal/compiler/widgets/common/spinbox-base.slint +++ b/internal/compiler/widgets/common/spinbox-base.slint @@ -8,6 +8,8 @@ export component SpinBoxBase { in property color <=> text-input.color; in property font-size <=> text-input.font-size; in property font-weight <=> text-input.font-weight; + in property font-family <=> text-input.font-family; + in property font-italic <=> text-input.font-italic; in property selection-background-color <=> text-input.selection-background-color; in property selection-foreground-color <=> text-input.selection-foreground-color; in property horizontal-alignment <=> text-input.horizontal-alignment; @@ -31,15 +33,15 @@ export component SpinBoxBase { public function increment() { if !root.read-only { - root.update-value(root.value + root.step-size); - root.update-text-and-cursor(); + root.update-value(root.value + root.step-size); + root.update-text-and-cursor(); } } public function decrement() { if !root.read-only { - root.update-value(root.value - root.step-size); - root.update-text-and-cursor(); + root.update-value(root.value - root.step-size); + root.update-text-and-cursor(); } } diff --git a/internal/compiler/widgets/cosmic/spinbox.slint b/internal/compiler/widgets/cosmic/spinbox.slint index 26a2cc6eb68..df3ef37b9ee 100644 --- a/internal/compiler/widgets/cosmic/spinbox.slint +++ b/internal/compiler/widgets/cosmic/spinbox.slint @@ -41,6 +41,8 @@ export component SpinBox { in property enabled <=> base.enabled; in property read-only <=> base.read-only; in property step-size <=> base.step-size; + in property font-family <=> base.font-family; + in property font-italic <=> base.font-italic; in property horizontal-alignment <=> base.horizontal-alignment; out property has-focus <=> base.has-focus; in-out property value <=> base.value; diff --git a/internal/compiler/widgets/cupertino/spinbox.slint b/internal/compiler/widgets/cupertino/spinbox.slint index befc1af555c..9c0b3982cea 100644 --- a/internal/compiler/widgets/cupertino/spinbox.slint +++ b/internal/compiler/widgets/cupertino/spinbox.slint @@ -66,6 +66,8 @@ export component SpinBox { in property enabled <=> base.enabled; in property read-only <=> base.read-only; in property step-size <=> base.step-size; + in property font-family <=> base.font-family; + in property font-italic <=> base.font-italic; in property horizontal-alignment <=> base.horizontal-alignment; out property has-focus <=> base.has-focus; in-out property value <=> base.value; diff --git a/internal/compiler/widgets/fluent/spinbox.slint b/internal/compiler/widgets/fluent/spinbox.slint index 37a22977f50..6d29c213407 100644 --- a/internal/compiler/widgets/fluent/spinbox.slint +++ b/internal/compiler/widgets/fluent/spinbox.slint @@ -41,6 +41,8 @@ export component SpinBox { in property step-size <=> base.step-size; in property read-only <=> base.read-only; in property horizontal-alignment <=> base.horizontal-alignment; + in property font-family <=> base.font-family; + in property font-italic <=> base.font-italic; out property has-focus <=> base.has-focus; in-out property value <=> base.value; diff --git a/internal/compiler/widgets/material/spinbox.slint b/internal/compiler/widgets/material/spinbox.slint index be00d951fcd..224864d805c 100644 --- a/internal/compiler/widgets/material/spinbox.slint +++ b/internal/compiler/widgets/material/spinbox.slint @@ -63,6 +63,8 @@ export component SpinBox { in property enabled <=> base.enabled; in property step-size <=> base.step-size; in property read-only <=> base.read-only; + in property font-family <=> base.font-family; + in property font-italic <=> base.font-italic; in property horizontal-alignment <=> base.horizontal-alignment; out property has-focus <=> base.has-focus; in-out property value <=> base.value; diff --git a/tests/cases/widgets/spinbox_font.slint b/tests/cases/widgets/spinbox_font.slint new file mode 100644 index 00000000000..409591f4879 --- /dev/null +++ b/tests/cases/widgets/spinbox_font.slint @@ -0,0 +1,31 @@ +// Copyright © SixtyFPS GmbH +// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0 + +import { SpinBox } from "std-widgets.slint"; + +export component TestCase inherits Window { + width: 100px; + height: 100px; + + box := SpinBox { + font-family: "DejaVu Serif"; + font-italic: true; + } + + out property test: box.font-family == "DejaVu Serif" && box.font-italic; +} + +/* + +```rust +let instance = TestCase::new().unwrap(); +assert!(instance.get_test()); +``` + +```cpp +auto handle = TestCase::create(); +const TestCase &instance = *handle; +assert(instance.get_test()); +``` + +*/