From 8ee9e8ed22d3ea6ca178d431f0f6faefbcf8de64 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Fri, 17 Jun 2022 10:01:10 +0200 Subject: [PATCH] segmented bar: Add separator subcontrol --- src/controls/QskSegmentedBar.cpp | 1 + src/controls/QskSegmentedBar.h | 2 +- src/controls/QskSegmentedBarSkinlet.cpp | 54 ++++++++++++++++++++++++- src/controls/QskSegmentedBarSkinlet.h | 2 + 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/controls/QskSegmentedBar.cpp b/src/controls/QskSegmentedBar.cpp index 6f5dd5e1..2129a48a 100644 --- a/src/controls/QskSegmentedBar.cpp +++ b/src/controls/QskSegmentedBar.cpp @@ -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 ) diff --git a/src/controls/QskSegmentedBar.h b/src/controls/QskSegmentedBar.h index 3777432d..e2afa911 100644 --- a/src/controls/QskSegmentedBar.h +++ b/src/controls/QskSegmentedBar.h @@ -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 ); diff --git a/src/controls/QskSegmentedBarSkinlet.cpp b/src/controls/QskSegmentedBarSkinlet.cpp index 1e1168a4..b6f54789 100644 --- a/src/controls/QskSegmentedBarSkinlet.cpp +++ b/src/controls/QskSegmentedBarSkinlet.cpp @@ -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 ) diff --git a/src/controls/QskSegmentedBarSkinlet.h b/src/controls/QskSegmentedBarSkinlet.h index 5c878255..8bb8faa8 100644 --- a/src/controls/QskSegmentedBarSkinlet.h +++ b/src/controls/QskSegmentedBarSkinlet.h @@ -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; };