segmented bar: Improve splash

This commit is contained in:
Peter Hartmann 2023-04-12 16:31:35 +02:00 committed by uwerat
parent 824802a1dc
commit bfa8df85d5
2 changed files with 37 additions and 18 deletions

View File

@ -525,7 +525,7 @@ void Editor::setupSegmentedBar()
}
{
// Segment
// Segment / Splash
setStrutSize( Q::Segment | A::Horizontal, segmentStrutSize );
setStrutSize( Q::Segment | A::Vertical, segmentStrutSize.transposed() );
@ -561,22 +561,23 @@ 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 );
setBoxShape( Q::Segment | Q::Minimum | A::Horizontal,
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( Q::Segment | Q::Maximum | A::Horizontal,
setBoxShape( subcontrol | Q::Maximum | A::Horizontal,
{ 0, 100, 0, 100, Qt::RelativeSize },
{ QskStateCombination::CombinationNoState, Q::Disabled } );
setBoxShape( Q::Segment | Q::Minimum | A::Vertical,
setBoxShape( subcontrol | Q::Minimum | A::Vertical,
{ 100, 100, 0, 0, Qt::RelativeSize },
{ QskStateCombination::CombinationNoState, Q::Disabled } );
setBoxShape( Q::Segment | Q::Maximum | A::Vertical,
setBoxShape( subcontrol | Q::Maximum | A::Vertical,
{ 0, 0, 100, 100, Qt::RelativeSize },
{ QskStateCombination::CombinationNoState, Q::Disabled } );
}
}
{
// Separator
@ -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 );
}

View File

@ -12,7 +12,7 @@
#include "QskFunctions.h"
#include "QskSGNode.h"
#include "QskSkin.h"
#include "QskStandardSymbol.h"
#include "QskSkinStateChanger.h"
#include "QskSubcontrolLayoutEngine.h"
#include <qfontmetrics.h>
@ -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;