diff --git a/skins/material3/QskMaterial3Skin.cpp b/skins/material3/QskMaterial3Skin.cpp index 1fcb1d27..52d81277 100644 --- a/skins/material3/QskMaterial3Skin.cpp +++ b/skins/material3/QskMaterial3Skin.cpp @@ -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 } ); } { diff --git a/src/controls/QskSegmentedBar.cpp b/src/controls/QskSegmentedBar.cpp index c3b88654..493f1b4e 100644 --- a/src/controls/QskSegmentedBar.cpp +++ b/src/controls/QskSegmentedBar.cpp @@ -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; diff --git a/src/controls/QskSegmentedBar.h b/src/controls/QskSegmentedBar.h index 93ba1486..790de3c2 100644 --- a/src/controls/QskSegmentedBar.h +++ b/src/controls/QskSegmentedBar.h @@ -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: diff --git a/src/controls/QskSegmentedBarSkinlet.cpp b/src/controls/QskSegmentedBarSkinlet.cpp index 4632f746..5905263a 100644 --- a/src/controls/QskSegmentedBarSkinlet.cpp +++ b/src/controls/QskSegmentedBarSkinlet.cpp @@ -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 )