From f6dd067d58b10fe05b333467f02fb5c4c2a46033 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Mon, 12 Jun 2023 10:03:56 +0200 Subject: [PATCH] segmented bar: Allow for subclasses to override segment size ... e.g. when adding another text label to a segment, e.g. a unit size. --- src/controls/QskSegmentedBarSkinlet.cpp | 38 ++++++++++++++++--------- src/controls/QskSegmentedBarSkinlet.h | 3 ++ src/controls/QskSkinlet.cpp | 6 ++++ src/controls/QskSkinlet.h | 3 ++ 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/controls/QskSegmentedBarSkinlet.cpp b/src/controls/QskSegmentedBarSkinlet.cpp index 8581dbcf..c7eb4661 100644 --- a/src/controls/QskSegmentedBarSkinlet.cpp +++ b/src/controls/QskSegmentedBarSkinlet.cpp @@ -212,23 +212,11 @@ QSizeF QskSegmentedBarSkinlet::segmentSizeHint( { using Q = QskSegmentedBar; - const QSizeF sizeSymbol = - bar->symbolHint( Q::Icon | Q::Selected ).defaultSize(); - QSizeF segmentSize; for ( int i = 0; i < bar->count(); i++ ) { - const auto option = bar->optionAt( i ); - - auto iconSize = option.icon().graphic().defaultSize(); - iconSize = iconSize.expandedTo( sizeSymbol ); - - LayoutEngine layoutEngine( bar, i ); - layoutEngine.setGraphicTextElements( bar, - Q::Text, option.text(), Q::Icon, iconSize ); - - const auto size = layoutEngine.sizeHint( which, QSizeF() ); + const auto size = sampleSizeHint( bar, which, QSizeF(), Q::Segment, i ); segmentSize = segmentSize.expandedTo( size ); } @@ -338,6 +326,30 @@ QskAspect::States QskSegmentedBarSkinlet::sampleStates( return states; } +QSizeF QskSegmentedBarSkinlet::sampleSizeHint( const QskSkinnable* skinnable, + Qt::SizeHint which, const QSizeF& constraint, QskAspect::Subcontrol, int index ) const +{ + if ( which != Qt::PreferredSize ) + return QSizeF(); + + using Q = QskSegmentedBar; + auto bar = static_cast< const QskSegmentedBar* >( skinnable ); + const auto option = bar->optionAt( index ); + + const QSizeF sizeSymbol = + bar->symbolHint( Q::Icon | Q::Selected ).defaultSize(); + + auto iconSize = option.icon().graphic().defaultSize(); + iconSize = iconSize.expandedTo( sizeSymbol ); + + LayoutEngine layoutEngine( bar, index ); + layoutEngine.setGraphicTextElements( bar, + Q::Text, option.text(), Q::Icon, iconSize ); + + const auto size = layoutEngine.sizeHint( which, constraint ); + return size; +} + QSGNode* QskSegmentedBarSkinlet::updateSampleNode( const QskSkinnable* skinnable, QskAspect::Subcontrol subControl, int index, QSGNode* node ) const { diff --git a/src/controls/QskSegmentedBarSkinlet.h b/src/controls/QskSegmentedBarSkinlet.h index a2a0a055..f03892cf 100644 --- a/src/controls/QskSegmentedBarSkinlet.h +++ b/src/controls/QskSegmentedBarSkinlet.h @@ -47,6 +47,9 @@ class QSK_EXPORT QskSegmentedBarSkinlet : public QskSkinlet QskAspect::States sampleStates( const QskSkinnable*, QskAspect::Subcontrol, int index ) const override; + QSizeF sampleSizeHint( const QskSkinnable*, Qt::SizeHint, const QSizeF&, + QskAspect::Subcontrol, int ) const override; + protected: QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* ) const override; diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index b1e73ace..23ef0019 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -867,6 +867,12 @@ QVariant QskSkinlet::sampleAt( const QskSkinnable*, return QVariant(); } +QSizeF QskSkinlet::sampleSizeHint( const QskSkinnable*, + Qt::SizeHint, const QSizeF&, QskAspect::Subcontrol, int ) const +{ + return QSizeF(); +} + QSizeF QskSkinlet::hintWithoutConstraint( const QSizeF& hint, const QSizeF& constraint ) const { diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index 44291712..c640438e 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -66,6 +66,9 @@ class QSK_EXPORT QskSkinlet virtual QVariant sampleAt( const QskSkinnable*, QskAspect::Subcontrol, int index ) const; + virtual QSizeF sampleSizeHint( const QskSkinnable*, + Qt::SizeHint, const QSizeF&, QskAspect::Subcontrol, int ) const; + const QVector< quint8 >& nodeRoles() const; void setOwnedBySkinnable( bool on );