segmented bar: Allow for subclasses to override segment size

... e.g. when adding another text label to a segment, e.g. a unit size.
This commit is contained in:
Peter Hartmann 2023-06-12 10:03:56 +02:00
parent 0421066dee
commit f6dd067d58
4 changed files with 37 additions and 13 deletions

View File

@ -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
{

View File

@ -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;

View File

@ -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
{

View File

@ -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 );