From 932d34aea8eb7d4ca727fca5a57898ed22721277 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 21 Oct 2024 14:22:09 +0200 Subject: [PATCH] spin box hovering --- src/controls/QskSpinBox.cpp | 8 ++++++++ src/controls/QskSpinBox.h | 2 ++ src/controls/QskSpinBoxSkinlet.cpp | 33 +++++++++++++++++++++++++++--- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/controls/QskSpinBox.cpp b/src/controls/QskSpinBox.cpp index 6195062f..39b25c06 100644 --- a/src/controls/QskSpinBox.cpp +++ b/src/controls/QskSpinBox.cpp @@ -139,6 +139,8 @@ QskSpinBox::QskSpinBox( qreal min, qreal max, qreal stepSize, QQuickItem* parent setBoundaries( min, max ); setStepSize( stepSize ); + setAcceptHoverEvents( true ); + setAcceptedMouseButtons( Qt::LeftButton ); setFocusPolicy( Qt::StrongFocus ); @@ -302,6 +304,12 @@ void QskSpinBox::mouseUngrabEvent() m_data->setAutoRepeat( this, 0.0 ); } +void QskSpinBox::hoverMoveEvent( QHoverEvent* event ) +{ + Inherited::hoverMoveEvent( event ); + update(); // enter/leaving a subcontrol +} + void QskSpinBox::keyPressEvent( QKeyEvent* event ) { if ( !isReadOnly() && !m_data->repeatTimer.isActive() ) diff --git a/src/controls/QskSpinBox.h b/src/controls/QskSpinBox.h index 38f62c35..245f622e 100644 --- a/src/controls/QskSpinBox.h +++ b/src/controls/QskSpinBox.h @@ -75,6 +75,8 @@ class QSK_EXPORT QskSpinBox : public QskBoundedValueInput void mousePressEvent( QMouseEvent* ) override; void mouseUngrabEvent() override; + void hoverMoveEvent( QHoverEvent* ) override; + void keyPressEvent( QKeyEvent* ) override; void keyReleaseEvent( QKeyEvent* ) override; diff --git a/src/controls/QskSpinBoxSkinlet.cpp b/src/controls/QskSpinBoxSkinlet.cpp index 3af7272c..01c7ca7a 100644 --- a/src/controls/QskSpinBoxSkinlet.cpp +++ b/src/controls/QskSpinBoxSkinlet.cpp @@ -9,6 +9,27 @@ #include "QskSkinStateChanger.h" #include +#include + +static bool qskIsButtonHovered( + const QskSpinBox* spinBox, QskAspect::Subcontrol subControl ) +{ + if ( spinBox->hasSkinState( QskControl::Hovered ) ) + { + // disable Hovered to avoid recursive calls + QskSkinStateChanger stateChanger( spinBox ); + stateChanger.setStates( spinBox->skinStates() & ~QskControl::Hovered ); + + const auto r = spinBox->subControlRect( subControl ); + if ( !r.isEmpty() ) + { + const auto pos = spinBox->mapFromGlobal( QCursor::pos() ); + return r.contains( pos ); + } + } + + return false; +} static inline QskAspect::States qskButtonStates( const QskSkinnable* skinnable, QskAspect::Subcontrol subControl ) @@ -19,17 +40,23 @@ static inline QskAspect::States qskButtonStates( auto states = spinBox->skinStates(); - if ( spinBox->isEnabled() && !spinBox->isWrapping() ) + if ( spinBox->isEnabled() ) { if ( subControl == Q::DownIndicator || subControl == Q::DownPanel ) { - if ( spinBox->value() <= spinBox->minimum() ) + if ( !spinBox->isWrapping() && spinBox->value() <= spinBox->minimum() ) states |= QskControl::Disabled; + + if ( !qskIsButtonHovered( spinBox, Q::DownPanel ) ) + states &= ~Q::Hovered; } else if ( subControl == Q::UpIndicator || subControl == Q::UpPanel ) { - if ( spinBox->value() >= spinBox->maximum() ) + if ( !spinBox->isWrapping() && spinBox->value() >= spinBox->maximum() ) states |= QskControl::Disabled; + + if ( !qskIsButtonHovered( spinBox, Q::UpPanel ) ) + states &= ~Q::Hovered; } }