diff --git a/src/controls/QskRadioBox.cpp b/src/controls/QskRadioBox.cpp index 81790b2c..63b352ab 100644 --- a/src/controls/QskRadioBox.cpp +++ b/src/controls/QskRadioBox.cpp @@ -24,6 +24,7 @@ class QskRadioBox::PrivateData QStringList options; int selectedIndex = -1; + int hoveredIndex = -1; int focusedIndex = -1; int pressedIndex = -1; }; @@ -38,6 +39,8 @@ QskRadioBox::QskRadioBox( QQuickItem* parent ) setAcceptedMouseButtons( Qt::LeftButton ); setPositionHint( Ripple, -1 ); + + setAcceptHoverEvents( true ); } QskRadioBox::QskRadioBox( const QStringList& options, QQuickItem* parent ) @@ -223,6 +226,23 @@ void QskRadioBox::mouseReleaseEvent( QMouseEvent* event ) update(); } +void QskRadioBox::hoverEnterEvent( QHoverEvent* event ) +{ + const auto index = indexAt( qskHoverPosition( event ) ); + setHoveredIndex( index ); +} + +void QskRadioBox::hoverMoveEvent( QHoverEvent* event ) +{ + const auto index = indexAt( qskHoverPosition( event ) ); + setHoveredIndex( index ); +} + +void QskRadioBox::hoverLeaveEvent( QHoverEvent* ) +{ + setHoveredIndex( -1 ); +} + void QskRadioBox::focusInEvent( QFocusEvent* event ) { if( event->reason() == Qt::TabFocusReason ) @@ -252,6 +272,17 @@ int QskRadioBox::indexAt( const QPointF& pos ) const contentsRect(), QskRadioBox::Button, pos ); } +void QskRadioBox::setHoveredIndex( int index ) +{ + if ( m_data->hoveredIndex == index ) + return; + + m_data->hoveredIndex = index; + setPositionHint( Ripple | Hovered, index ); + + update(); +} + void QskRadioBox::setFocusedIndex( int index ) { if ( m_data->focusedIndex == index ) diff --git a/src/controls/QskRadioBox.h b/src/controls/QskRadioBox.h index 93b3ffbc..973f4c48 100644 --- a/src/controls/QskRadioBox.h +++ b/src/controls/QskRadioBox.h @@ -55,12 +55,17 @@ class QSK_EXPORT QskRadioBox : public QskControl void mouseReleaseEvent( QMouseEvent* ) override; void mouseUngrabEvent() override; + void hoverEnterEvent( QHoverEvent* ) override; + void hoverMoveEvent( QHoverEvent* ) override; + void hoverLeaveEvent( QHoverEvent* ) override; + void focusInEvent( QFocusEvent* ) override; void focusOutEvent( QFocusEvent* ) override; int indexAt( const QPointF& ) const; private: + void setHoveredIndex( int index ); void setFocusedIndex( int index ); class PrivateData; diff --git a/src/controls/QskRadioBoxSkinlet.cpp b/src/controls/QskRadioBoxSkinlet.cpp index 70067b11..5accb744 100644 --- a/src/controls/QskRadioBoxSkinlet.cpp +++ b/src/controls/QskRadioBoxSkinlet.cpp @@ -219,6 +219,11 @@ QskAspect::States QskRadioBoxSkinlet::sampleStates( states |= Q::Pressed; #if 1 + if( radioBox->positionHint( Q::Ripple | Q::Hovered ) == index ) + states |= Q::Hovered; + else + states &= ~Q::Hovered; + if( radioBox->positionHint( Q::Ripple ) == index ) states |= Q::Focused; else