segmented bar: Add separator subcontrol

This commit is contained in:
Peter Hartmann 2022-06-17 10:01:10 +02:00
parent 8036d8ee69
commit c465676642
4 changed files with 56 additions and 3 deletions

View File

@ -18,6 +18,7 @@
QSK_SUBCONTROL( QskSegmentedBar, Panel )
QSK_SUBCONTROL( QskSegmentedBar, Segment )
QSK_SUBCONTROL( QskSegmentedBar, Separator )
QSK_SUBCONTROL( QskSegmentedBar, Cursor )
QSK_SUBCONTROL( QskSegmentedBar, Text )
QSK_SUBCONTROL( QskSegmentedBar, Graphic )

View File

@ -32,7 +32,7 @@ class QSK_EXPORT QskSegmentedBar : public QskControl
using Inherited = QskControl;
public:
QSK_SUBCONTROLS( Panel, Segment, Cursor, Text, Graphic )
QSK_SUBCONTROLS( Panel, Segment, Separator, Cursor, Text, Graphic )
QSK_STATES( Selected, Minimum, Maximum )
QskSegmentedBar( QQuickItem* parent = nullptr );

View File

@ -18,7 +18,7 @@
QskSegmentedBarSkinlet::QskSegmentedBarSkinlet( QskSkin* skin )
: Inherited( skin )
{
setNodeRoles( { PanelRole, SegmentRole, CursorRole, TextRole, GraphicRole } );
setNodeRoles( { PanelRole, SegmentRole, SeparatorRole, CursorRole, TextRole, GraphicRole } );
}
QskSegmentedBarSkinlet::~QskSegmentedBarSkinlet() = default;
@ -99,6 +99,34 @@ QRectF QskSegmentedBarSkinlet::segmentRect(
return rect;
}
QRectF QskSegmentedBarSkinlet::separatorRect(
const QskSegmentedBar* bar, const QRectF& contentsRect, int index ) const
{
using Q = QskSegmentedBar;
auto rect = segmentRect( bar, contentsRect, index );
auto sh = bar->sizeHint();
const QSizeF strutSize = bar->strutSizeHint( Q::Separator );
if( bar->orientation() == Qt::Horizontal )
{
rect.setLeft( rect.right() );
rect.setSize( { strutSize.width(), sh.height() } );
}
else
{
rect.setTop( rect.bottom() );
rect.setSize( { sh.width(), strutSize.height() } );
}
const auto padding = bar->paddingHint( Q::Separator );
rect = rect.marginsRemoved( padding );
return rect;
}
QSGNode* QskSegmentedBarSkinlet::updateSubNode(
const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const
{
@ -115,6 +143,9 @@ QSGNode* QskSegmentedBarSkinlet::updateSubNode(
case SegmentRole:
return updateSeriesNode( skinnable, Q::Segment, node );
case SeparatorRole:
return updateSeriesNode( skinnable, Q::Separator, node );
case TextRole:
return updateSeriesNode( skinnable, Q::Text, node );
@ -226,13 +257,18 @@ QRectF QskSegmentedBarSkinlet::sampleRect( const QskSkinnable* skinnable,
const QRectF& contentsRect, QskAspect::Subcontrol subControl, int index ) const
{
using Q = QskSegmentedBar;
const auto bar = static_cast< const QskSegmentedBar* >( skinnable );
if ( subControl == Q::Segment )
{
const auto bar = static_cast< const QskSegmentedBar* >( skinnable );
return segmentRect( bar, contentsRect, index );
}
if ( subControl == Q::Separator )
{
return separatorRect( bar, contentsRect, index );
}
if ( subControl == Q::Text || subControl == Q::Graphic )
{
const auto rect = sampleRect( skinnable, contentsRect, Q::Segment, index );
@ -281,6 +317,20 @@ QSGNode* QskSegmentedBarSkinlet::updateSampleNode( const QskSkinnable* skinnable
return updateBoxNode( skinnable, node, rect, subControl );
}
if( subControl == Q::Separator )
{
if( index == bar->count() - 1 )
{
return nullptr;
}
else
{
const auto rect = sampleRect( bar, bar->contentsRect(), subControl, index );
return updateBoxNode( skinnable, node, rect, subControl );
}
}
const auto alignment = bar->alignmentHint( subControl, Qt::AlignCenter );
if ( subControl == Q::Text )

View File

@ -21,6 +21,7 @@ class QSK_EXPORT QskSegmentedBarSkinlet : public QskSkinlet
{
PanelRole,
SegmentRole,
SeparatorRole,
CursorRole,
TextRole,
@ -57,6 +58,7 @@ class QSK_EXPORT QskSegmentedBarSkinlet : public QskSkinlet
QSizeF segmentSizeHint( const QskSegmentedBar* ) const;
QRectF segmentRect( const QskSegmentedBar*, const QRectF&, int index ) const;
QRectF separatorRect( const QskSegmentedBar*, const QRectF&, int index ) const;
QRectF cursorRect( const QskSegmentedBar*, const QRectF& ) const;
};