segmented bar: support hovered state

This commit is contained in:
Peter Hartmann 2023-02-10 14:14:57 +01:00 committed by uwerat
parent 636f548fed
commit acb225bb82
4 changed files with 83 additions and 3 deletions

View File

@ -530,8 +530,25 @@ void Editor::setupSegmentedBar()
setStrutSize( Q::Segment | A::Horizontal, segmentStrutSize );
setStrutSize( Q::Segment | A::Vertical, segmentStrutSize.transposed() );
setGradient( Q::Segment, Qt::transparent );
setGradient( Q::Segment | Q::Hovered, m_pal.onSurface12,
{ QskStateCombination::CombinationNoState, Q::Minimum | Q::Maximum | Q::Selected } );
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,
{ 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 } );
}
{

View File

@ -56,6 +56,8 @@ QskSegmentedBar::QskSegmentedBar( Qt::Orientation orientation, QQuickItem* paren
: Inherited( parent )
, m_data( new PrivateData( orientation ) )
{
setAcceptHoverEvents( true );
if( orientation == Qt::Horizontal )
initSizePolicy( QskSizePolicy::MinimumExpanding, QskSizePolicy::Fixed );
else
@ -273,6 +275,30 @@ void QskSegmentedBar::keyReleaseEvent( QKeyEvent* event )
Inherited::keyReleaseEvent( event );
}
void QskSegmentedBar::hoverEnterEvent( QHoverEvent* event )
{
using A = QskAspect;
setSkinHint( Segment | A::Metric | A::Position, qskHoverPosition( event ) );
update();
}
void QskSegmentedBar::hoverMoveEvent( QHoverEvent* event )
{
using A = QskAspect;
setSkinHint( Segment | A::Metric | A::Position, qskHoverPosition( event ) );
update();
}
void QskSegmentedBar::hoverLeaveEvent( QHoverEvent* event )
{
using A = QskAspect;
setSkinHint( Segment | A::Metric | A::Position, QPointF() );
update();
}
void QskSegmentedBar::focusInEvent( QFocusEvent* event )
{
int index = m_data->currentIndex;

View File

@ -94,6 +94,10 @@ class QSK_EXPORT QskSegmentedBar : public QskControl
void keyPressEvent( QKeyEvent* ) override;
void keyReleaseEvent( QKeyEvent* ) override;
void hoverEnterEvent( QHoverEvent* ) override;
void hoverMoveEvent( QHoverEvent* ) override;
void hoverLeaveEvent( QHoverEvent* ) override;
void focusInEvent( QFocusEvent* ) override;
private:

View File

@ -355,13 +355,46 @@ QskAspect::States QskSegmentedBarSkinlet::sampleStates(
const QskSkinnable* skinnable, QskAspect::Subcontrol subControl, int index ) const
{
using Q = QskSegmentedBar;
using A = QskAspect;
auto states = Inherited::sampleStates( skinnable, subControl, index );
if ( subControl == Q::Segment || subControl == Q::Icon || subControl == Q::Text )
{
const auto bar = static_cast< const QskSegmentedBar* >( skinnable );
const auto* bar = static_cast< const QskSegmentedBar* >( skinnable );
if ( subControl == Q::Segment )
{
const auto cursorPos = bar->effectiveSkinHint( Q::Segment | A::Metric | A::Position ).toPointF();
if( !cursorPos.isNull() && bar->indexAtPosition( cursorPos ) == index )
{
states |= Q::Hovered;
}
else
{
states &= ~Q::Hovered;
}
if( bar->count() > 0 )
{
if( index == 0 )
{
states &= ~Q::Maximum;
states |= Q::Minimum;
}
else if( index == bar->count() - 1 )
{
states &= ~Q::Minimum;
states |= Q::Maximum;
}
else
{
states &= ~Q::Minimum;
states &= ~Q::Maximum;
}
}
}
else if( subControl == Q::Icon || subControl == Q::Text || subControl == Q::Cursor )
{
if ( bar->isSegmentEnabled( index ) )
{
if ( bar->selectedIndex() == index )