From b97bce236033bcd93d7a05ba46e396ce4dc9c56a Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Fri, 30 Jun 2023 17:17:48 +0200 Subject: [PATCH] combo box: Support pressed state --- skins/fluent2/QskFluent2Skin.cpp | 15 +++++++++++++-- skins/material3/QskMaterial3Skin.cpp | 4 ++++ src/controls/QskComboBox.cpp | 26 +++++++++++++++++++++++++- src/controls/QskComboBox.h | 12 +++++++++++- 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/skins/fluent2/QskFluent2Skin.cpp b/skins/fluent2/QskFluent2Skin.cpp index 725fa4c9..3ea8864d 100644 --- a/skins/fluent2/QskFluent2Skin.cpp +++ b/skins/fluent2/QskFluent2Skin.cpp @@ -514,7 +514,7 @@ void Editor::setupComboBoxColors( const auto& pal = theme.palette; - for ( const auto state : { QskAspect::NoState, Q::Hovered, Q::Focused, Q::Disabled } ) + for ( const auto state : { QskAspect::NoState, Q::Hovered, Q::Focused, Q::Pressed, Q::Disabled } ) { QRgb panelColor, borderColor1, borderColor2, textColor; @@ -535,12 +535,18 @@ void Editor::setupComboBoxColors( } else if ( state == Q::Focused ) { - panelColor = pal.fillColor.control.inputActive; borderColor1 = pal.elevation.textControl.border[0]; borderColor2 = pal.fillColor.accent.defaultColor; textColor = pal.fillColor.text.primary; } + else if ( state == Q::Pressed ) + { + panelColor = pal.fillColor.control.inputActive; + borderColor1 = pal.elevation.textControl.border[0]; + borderColor2 = pal.fillColor.accent.defaultColor; + textColor = pal.fillColor.text.secondary; + } else if ( state == Q::Disabled ) { panelColor = pal.fillColor.control.disabled; @@ -565,6 +571,11 @@ void Editor::setupComboBoxColors( setGraphicRole( icon, W::GraphicRoleFillColorTextDisabled ); setGraphicRole( indicator, W::GraphicRoleFillColorTextDisabled ); } + else if( state == Q::Pressed ) + { + setGraphicRole( icon, W::GraphicRoleFillColorTextSecondary ); + setGraphicRole( indicator, W::GraphicRoleFillColorTextSecondary ); + } else { setGraphicRole( icon, W::GraphicRoleFillColorTextPrimary ); diff --git a/skins/material3/QskMaterial3Skin.cpp b/skins/material3/QskMaterial3Skin.cpp index 4ebd9606..bcc38219 100644 --- a/skins/material3/QskMaterial3Skin.cpp +++ b/skins/material3/QskMaterial3Skin.cpp @@ -278,6 +278,10 @@ void Editor::setupComboBox() m_pal.surfaceVariant, m_pal.focusOpacity ); setGradient( Q::Panel | Q::Focused, focusColor ); + const auto pressedColor = flattenedColor( m_pal.onSurfaceVariant, + m_pal.surfaceVariant, m_pal.pressedOpacity ); + setGradient( Q::Panel | Q::Pressed, pressedColor ); + const auto activeColor = flattenedColor( m_pal.onSurfaceVariant, m_pal.surfaceVariant, m_pal.pressedOpacity ); setGradient( Q::Panel | Q::PopupOpen, activeColor ); diff --git a/src/controls/QskComboBox.cpp b/src/controls/QskComboBox.cpp index dd9e4679..ef79a486 100644 --- a/src/controls/QskComboBox.cpp +++ b/src/controls/QskComboBox.cpp @@ -18,7 +18,8 @@ QSK_SUBCONTROL( QskComboBox, Icon ) QSK_SUBCONTROL( QskComboBox, Text ) QSK_SUBCONTROL( QskComboBox, StatusIndicator ) -QSK_SYSTEM_STATE( QskComboBox, PopupOpen, QskAspect::FirstSystemState << 1 ) +QSK_SYSTEM_STATE( QskComboBox, Pressed, QskAspect::FirstSystemState << 1 ) +QSK_SYSTEM_STATE( QskComboBox, PopupOpen, QskAspect::FirstSystemState << 2 ) static inline void qskTraverseOptions( QskComboBox* comboBox, int steps ) { @@ -89,6 +90,25 @@ QskComboBox::~QskComboBox() { } +bool QskComboBox::isPressed() const +{ + return hasSkinState( Pressed ); +} + +void QskComboBox::setPressed( bool on ) +{ + if ( on == isPressed() ) + return; + + setSkinStateFlag( Pressed, on ); + Q_EMIT pressedChanged( on ); + + if ( on ) + Q_EMIT pressed(); + else + Q_EMIT released(); +} + void QskComboBox::setPopupOpen( bool on ) { if ( on == isPopupOpen() ) @@ -246,11 +266,13 @@ void QskComboBox::closePopup() void QskComboBox::mousePressEvent( QMouseEvent* ) { + setPressed( true ); setPopupOpen( true ); } void QskComboBox::mouseReleaseEvent( QMouseEvent* ) { + setPressed( false ); } void QskComboBox::keyPressEvent( QKeyEvent* event ) @@ -259,6 +281,7 @@ void QskComboBox::keyPressEvent( QKeyEvent* event ) { if ( !event->isAutoRepeat() ) { + setPressed( true ); setPopupOpen( true ); return; } @@ -270,6 +293,7 @@ void QskComboBox::keyPressEvent( QKeyEvent* event ) case Qt::Key_F4: { // QComboBox does this ??? + setPressed( true ); setPopupOpen( true ); return; } diff --git a/src/controls/QskComboBox.h b/src/controls/QskComboBox.h index 8a7e064a..83a9f1ec 100644 --- a/src/controls/QskComboBox.h +++ b/src/controls/QskComboBox.h @@ -34,16 +34,22 @@ class QSK_EXPORT QskComboBox : public QskControl Q_PROPERTY( int indexInPopup READ indexInPopup NOTIFY indexInPopupChanged ) + Q_PROPERTY( bool pressed READ isPressed + WRITE setPressed NOTIFY pressedChanged FINAL ) + using Inherited = QskControl; public: QSK_SUBCONTROLS( Panel, Icon, Text, StatusIndicator ) - QSK_STATES( PopupOpen ) + QSK_STATES( Pressed, PopupOpen ) QskComboBox( QQuickItem* parent = nullptr ); ~QskComboBox() override; + void setPressed( bool on ); + bool isPressed() const; + void setPopupOpen( bool ); bool isPopupOpen() const; @@ -78,6 +84,10 @@ class QSK_EXPORT QskComboBox : public QskControl void setCurrentIndex( int ); Q_SIGNALS: + void pressed(); + void released(); + void pressedChanged( bool ); + void currentIndexChanged( int ); void indexInPopupChanged( int );