From 1544158344e2a819dbee4985eb76f4aea68b9e2c Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 26 Jul 2022 18:15:56 +0200 Subject: [PATCH] Consider label when calculating layout info for native groupboxes --- internal/backends/qt/qt_widgets/groupbox.rs | 30 +++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/internal/backends/qt/qt_widgets/groupbox.rs b/internal/backends/qt/qt_widgets/groupbox.rs index 641ce7f9d..769220f82 100644 --- a/internal/backends/qt/qt_widgets/groupbox.rs +++ b/internal/backends/qt/qt_widgets/groupbox.rs @@ -4,6 +4,7 @@ use i_slint_core::input::FocusEventResult; use super::*; + #[repr(C)] #[derive(FieldOffsets, Default, SlintElement)] #[pin] @@ -29,6 +30,27 @@ struct GroupBoxData { paddings: Property, } +fn minimum_group_box_size(title: qttypes::QString) -> qttypes::QSize { + return cpp!(unsafe [title as "QString"] -> qttypes::QSize as "QSize" { + ensure_initialized(); + + QStyleOptionGroupBox option; + option.text = title; + option.lineWidth = 1; + option.midLineWidth = 0; + option.subControls = QStyle::SC_GroupBoxFrame; + if (!title.isEmpty()) { + option.subControls |= QStyle::SC_GroupBoxLabel; + } + + QFontMetrics metrics = option.fontMetrics; + int baseWidth = metrics.horizontalAdvance(title) + metrics.horizontalAdvance(QLatin1Char(' ')); + int baseHeight = metrics.height(); + + return qApp->style()->sizeFromContents(QStyle::CT_GroupBox, &option, QSize(baseWidth, baseHeight), nullptr); + }); +} + impl Item for NativeGroupBox { fn init(self: Pin<&Self>, _window: &WindowRc) { let shared_data = Rc::pin(GroupBoxData::default()); @@ -120,10 +142,14 @@ impl Item for NativeGroupBox { } fn layout_info(self: Pin<&Self>, orientation: Orientation, _window: &WindowRc) -> LayoutInfo { + let text: qttypes::QString = self.title().as_str().into(); + + let size = minimum_group_box_size(text); + LayoutInfo { min: match orientation { - Orientation::Horizontal => self.native_padding_left() + self.native_padding_right(), - Orientation::Vertical => self.native_padding_top() + self.native_padding_bottom(), + Orientation::Horizontal => size.width as f32, + Orientation::Vertical => size.height as f32, }, stretch: 1., ..LayoutInfo::default()