From bfa8df85d5c630f52538ae5fb6680e0f70a67956 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Wed, 12 Apr 2023 16:31:35 +0200 Subject: [PATCH] segmented bar: Improve splash --- skins/material3/QskMaterial3Skin.cpp | 33 +++++++++++++------------ src/controls/QskSegmentedBarSkinlet.cpp | 22 +++++++++++++++-- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/skins/material3/QskMaterial3Skin.cpp b/skins/material3/QskMaterial3Skin.cpp index 3feca7d4..f466ca41 100644 --- a/skins/material3/QskMaterial3Skin.cpp +++ b/skins/material3/QskMaterial3Skin.cpp @@ -525,7 +525,7 @@ void Editor::setupSegmentedBar() } { - // Segment + // Segment / Splash setStrutSize( Q::Segment | A::Horizontal, segmentStrutSize ); setStrutSize( Q::Segment | A::Vertical, segmentStrutSize.transposed() ); @@ -561,21 +561,22 @@ void Editor::setupSegmentedBar() setPadding( Q::Segment | A::Horizontal, 12_dp, 0, 12_dp, 0 ); setPadding( Q::Segment | A::Vertical, 0, 12_dp, 0, 12_dp ); - setBoxShape( Q::Segment, 0 ); + for( const auto subcontrol : { Q::Segment, Q::Splash } ) + { + setBoxShape( subcontrol | Q::Minimum | A::Horizontal, + { 100, 0, 100, 0, Qt::RelativeSize }, + { QskStateCombination::CombinationNoState, Q::Disabled } ); + setBoxShape( subcontrol | Q::Maximum | A::Horizontal, + { 0, 100, 0, 100, Qt::RelativeSize }, + { QskStateCombination::CombinationNoState, Q::Disabled } ); - setBoxShape( Q::Segment | Q::Minimum | A::Horizontal, - { 100, 0, 100, 0, Qt::RelativeSize }, - { QskStateCombination::CombinationNoState, Q::Disabled } ); - setBoxShape( Q::Segment | Q::Maximum | A::Horizontal, - { 0, 100, 0, 100, Qt::RelativeSize }, - { QskStateCombination::CombinationNoState, Q::Disabled } ); - - setBoxShape( Q::Segment | Q::Minimum | A::Vertical, - { 100, 100, 0, 0, Qt::RelativeSize }, - { QskStateCombination::CombinationNoState, Q::Disabled } ); - setBoxShape( Q::Segment | Q::Maximum | A::Vertical, - { 0, 0, 100, 100, Qt::RelativeSize }, - { QskStateCombination::CombinationNoState, Q::Disabled } ); + setBoxShape( subcontrol | Q::Minimum | A::Vertical, + { 100, 100, 0, 0, Qt::RelativeSize }, + { QskStateCombination::CombinationNoState, Q::Disabled } ); + setBoxShape( subcontrol | Q::Maximum | A::Vertical, + { 0, 0, 100, 100, Qt::RelativeSize }, + { QskStateCombination::CombinationNoState, Q::Disabled } ); + } } { @@ -590,7 +591,7 @@ void Editor::setupSegmentedBar() { // Splash - setBoxShape( Q::Splash, 20_dp ); + setGradient( Q::Splash, stateLayerColor( m_pal.onSecondaryContainer, m_pal.pressedOpacity ) ); setAnimation( Q::Splash | A::Color, qskDuration ); } diff --git a/src/controls/QskSegmentedBarSkinlet.cpp b/src/controls/QskSegmentedBarSkinlet.cpp index 80595f4a..fd0afff1 100644 --- a/src/controls/QskSegmentedBarSkinlet.cpp +++ b/src/controls/QskSegmentedBarSkinlet.cpp @@ -12,7 +12,7 @@ #include "QskFunctions.h" #include "QskSGNode.h" #include "QskSkin.h" -#include "QskStandardSymbol.h" +#include "QskSkinStateChanger.h" #include "QskSubcontrolLayoutEngine.h" #include @@ -144,7 +144,20 @@ QRectF QskSegmentedBarSkinlet::splashRect( { const auto sr = segmentRect( bar, contentsRect, index ); rect = sr; - rect.setSize( { 2.0 * rect.width() * ratio, rect.height() * 2.0 } ); + qreal w, h; + + if( bar->orientation() == Qt::Horizontal ) + { + w = 2.0 * rect.width() * ratio; + h = 2.0 * rect.height(); + } + else + { + w = 2.0 * rect.width(); + h = 2.0 * rect.height() * ratio; + } + + rect.setSize( { w, h } ); rect.moveCenter( pos ); rect = rect.intersected( sr ); } @@ -487,6 +500,11 @@ QSGNode* QskSegmentedBarSkinlet::updateSplashNode( { using Q = QskSegmentedBar; + // get Minimum / Maximum right: + QskSkinStateChanger stateChanger( bar ); + const auto states = sampleStates( bar, Q::Segment, bar->selectedIndex() ); + stateChanger.setStates( states ); + const auto splashRect = bar->subControlRect( Q::Splash ); if ( splashRect.isEmpty() ) return nullptr;