From d8dd07d305cbfaba1a17ffe833992744499986e6 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sat, 17 Feb 2024 13:24:14 +0100 Subject: [PATCH] combo box improved --- src/controls/QskComboBox.cpp | 12 +++++++----- src/controls/QskMenu.cpp | 19 +++++++++++++++++++ src/controls/QskMenu.h | 7 +++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/controls/QskComboBox.cpp b/src/controls/QskComboBox.cpp index 9e39f602..47721c8a 100644 --- a/src/controls/QskComboBox.cpp +++ b/src/controls/QskComboBox.cpp @@ -236,14 +236,16 @@ void QskComboBox::openPopup() auto menu = new QskMenu(); - menu->setParent( this ); - menu->setParentItem( window()->contentItem() ); - menu->setPopupFlag( QskPopup::DeleteOnClose, true ); - - menu->setOrigin( mapToScene( cr.bottomLeft() ) ); + menu->setWrapping( false ); + menu->setOrigin( mapToScene( cr.topLeft() ) ); menu->setFixedWidth( cr.width() ); menu->setOptions( m_data->options ); + menu->setCurrentIndex( currentIndex() ); + + menu->setParent( this ); + menu->setParentItem( window()->contentItem() ); + menu->setPopupFlag( QskPopup::DeleteOnClose, true ); connect( menu, &QskMenu::currentIndexChanged, this, &QskComboBox::indexInPopupChanged ); diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index e690332b..9acf9219 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -53,6 +53,8 @@ class QskMenu::PrivateData int triggeredIndex = -1; int currentIndex = -1; + + bool wrapping = true; bool isPressed = false; }; @@ -105,6 +107,20 @@ QRectF QskMenu::clipRect() const return Inherited::clipRect(); } +bool QskMenu::isWrapping() const +{ + return m_data->wrapping; +} + +void QskMenu::setWrapping( bool on ) +{ + if ( m_data->wrapping != on ) + { + m_data->wrapping = on; + Q_EMIT wrappingChanged( on ); + } +} + #if 1 // has no effect as we do not offer submenus yet. TODO ... @@ -422,6 +438,9 @@ void QskMenu::traverse( int steps ) int action1 = qskActionIndex( actions, m_data->currentIndex ); int action2 = action1 + steps; + if ( !m_data->wrapping ) + action2 = qBound( 0, action2, count - 1 ); + // when cycling we want to slide in int index1; diff --git a/src/controls/QskMenu.h b/src/controls/QskMenu.h index 88670ec6..cd6f3dc6 100644 --- a/src/controls/QskMenu.h +++ b/src/controls/QskMenu.h @@ -23,6 +23,9 @@ class QSK_EXPORT QskMenu : public QskPopup Q_PROPERTY( bool cascading READ isCascading WRITE setCascading RESET resetCascading NOTIFY cascadingChanged ) + Q_PROPERTY( bool wrapping READ isWrapping + WRITE setWrapping NOTIFY wrappingChanged ) + Q_PROPERTY( QVector< QskLabelData > options READ options WRITE setOptions NOTIFY optionsChanged ) @@ -47,6 +50,9 @@ class QSK_EXPORT QskMenu : public QskPopup void setCascading( bool ); void resetCascading(); + bool isWrapping() const; + void setWrapping( bool ); + void setOrigin( const QPointF& ); QPointF origin() const; @@ -87,6 +93,7 @@ class QSK_EXPORT QskMenu : public QskPopup Q_INVOKABLE int exec(); Q_SIGNALS: + void wrappingChanged( bool ); void cascadingChanged( bool ); void originChanged( const QPointF& );