From b55e5ee00a101b031453fe951733d595640dad61 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Fri, 10 Mar 2023 12:46:19 +0100 Subject: [PATCH] API adjustments --- src/common/QskLabelData.cpp | 11 ++++ src/common/QskLabelData.h | 3 + src/controls/QskComboBox.cpp | 5 ++ src/controls/QskComboBox.h | 4 ++ src/controls/QskMenu.cpp | 97 ++++++++++++++++---------------- src/controls/QskMenu.h | 16 ++++-- src/controls/QskSegmentedBar.cpp | 5 ++ src/controls/QskSegmentedBar.h | 6 +- 8 files changed, 92 insertions(+), 55 deletions(-) diff --git a/src/common/QskLabelData.cpp b/src/common/QskLabelData.cpp index 40bad398..ef710063 100644 --- a/src/common/QskLabelData.cpp +++ b/src/common/QskLabelData.cpp @@ -68,6 +68,17 @@ QskHashValue QskLabelData::hash( QskHashValue seed ) const return m_icon.hash( hash ); } +QVector< QskLabelData > qskCreateLabelData( const QVector< QString >& list ) +{ + QVector< QskLabelData > labelData; + labelData.reserve( list.size() ); + + for ( const auto& text : list ) + labelData += QskLabelData( text ); + + return labelData; +} + #ifndef QT_NO_DEBUG_STREAM #include diff --git a/src/common/QskLabelData.h b/src/common/QskLabelData.h index 453e1dc5..e85f58f7 100644 --- a/src/common/QskLabelData.h +++ b/src/common/QskLabelData.h @@ -10,6 +10,7 @@ #include "QskIcon.h" #include +#include #include #include @@ -69,6 +70,8 @@ inline bool QskLabelData::operator!=( const QskLabelData& other ) const noexcept return ( !( *this == other ) ); } +QSK_EXPORT QVector< QskLabelData > qskCreateLabelData( const QVector< QString >& ); + #ifndef QT_NO_DEBUG_STREAM class QDebug; diff --git a/src/controls/QskComboBox.cpp b/src/controls/QskComboBox.cpp index c542aab5..e753f662 100644 --- a/src/controls/QskComboBox.cpp +++ b/src/controls/QskComboBox.cpp @@ -140,6 +140,11 @@ int QskComboBox::addOption( const QskLabelData& option ) return count() - 1; } +void QskComboBox::setOptions( const QStringList& options ) +{ + setOptions( qskCreateLabelData( options ) ); +} + void QskComboBox::setOptions( const QVector< QskLabelData >& options ) { if ( options == m_data->options ) diff --git a/src/controls/QskComboBox.h b/src/controls/QskComboBox.h index f1576907..5aea9051 100644 --- a/src/controls/QskComboBox.h +++ b/src/controls/QskComboBox.h @@ -7,8 +7,11 @@ #define QSK_COMBO_BOX_H #include "QskControl.h" +#include +class QskTextOptions; class QskLabelData; +class QUrl; class QSK_EXPORT QskComboBox : public QskControl { @@ -52,6 +55,7 @@ class QSK_EXPORT QskComboBox : public QskControl int addOption( const QskLabelData& ); void setOptions( const QVector< QskLabelData >& ); + void setOptions( const QStringList& ); QVector< QskLabelData > options() const; QskLabelData optionAt( int ) const; diff --git a/src/controls/QskMenu.cpp b/src/controls/QskMenu.cpp index d7bceb05..9eeef8ed 100644 --- a/src/controls/QskMenu.cpp +++ b/src/controls/QskMenu.cpp @@ -37,11 +37,8 @@ class QskMenu::PrivateData // QVector< bool > enabled; QVector< int > separators; - - // current/selected are not well defined yet, TODO ... + int triggeredIndex = -1; int currentIndex = -1; - int selectedIndex = -1; - bool isPressed = false; }; @@ -62,6 +59,9 @@ QskMenu::QskMenu( QQuickItem* parent ) // we hide the focus indicator while fading connect( this, &QskMenu::fadingChanged, this, &QskControl::focusIndicatorRectChanged ); + + connect( this, &QskMenu::opened, this, + [this]() { m_data->triggeredIndex = -1; } ); } QskMenu::~QskMenu() @@ -137,10 +137,14 @@ int QskMenu::addOption( const QskLabelData& option ) return count() - 1; } +void QskMenu::setOptions( const QStringList& options ) +{ + setOptions( qskCreateLabelData( options ) ); +} + void QskMenu::setOptions( const QVector< QskLabelData >& options ) { m_data->options = options; - m_data->selectedIndex = -1; if ( m_data->currentIndex >= 0 ) { @@ -159,16 +163,8 @@ void QskMenu::setOptions( const QVector< QskLabelData >& options ) void QskMenu::clear() { - m_data->selectedIndex = m_data->currentIndex = -1; m_data->separators.clear(); - - if ( !m_data->options.isEmpty() ) - { - m_data->options.clear(); - - if ( isComponentComplete() ) - Q_EMIT optionsChanged(); - } + setOptions( QVector< QskLabelData >() ); } QVector< QskLabelData > QskMenu::options() const @@ -204,12 +200,9 @@ int QskMenu::separatorCount() const return m_data->separators.count(); } -QString QskMenu::currentText() const +int QskMenu::currentIndex() const { - if ( m_data->currentIndex >= 0 ) - return optionAt( m_data->currentIndex ).text(); - - return QString(); + return m_data->currentIndex; } void QskMenu::setCurrentIndex( int index ) @@ -229,9 +222,19 @@ void QskMenu::setCurrentIndex( int index ) } } -int QskMenu::currentIndex() const +QString QskMenu::currentText() const { - return m_data->currentIndex; + return optionAt( m_data->currentIndex ).text(); +} + +int QskMenu::triggeredIndex() const +{ + return m_data->triggeredIndex; +} + +QString QskMenu::triggeredText() const +{ + return optionAt( m_data->triggeredIndex ).text(); } void QskMenu::keyPressEvent( QKeyEvent* event ) @@ -267,18 +270,14 @@ void QskMenu::keyPressEvent( QKeyEvent* event ) case Qt::Key_Escape: case Qt::Key_Cancel: { - setSelectedIndex( -1 ); + close(); return; } default: { - const int steps = qskFocusChainIncrement( event ); - - if( steps != 0 ) - { + if ( const int steps = qskFocusChainIncrement( event ) ) traverse( steps ); - } } } } @@ -288,7 +287,12 @@ void QskMenu::keyReleaseEvent( QKeyEvent* ) if( m_data->isPressed ) { m_data->isPressed = false; - setSelectedIndex( m_data->currentIndex ); + + if ( m_data->currentIndex >= 0 ) + { + trigger( m_data->currentIndex ); + close(); + } } } @@ -359,9 +363,14 @@ void QskMenu::mouseReleaseEvent( QMouseEvent* event ) { m_data->isPressed = false; - const auto index = indexAtPosition( qskMousePosition( event ) ); - if ( index == m_data->currentIndex ) - setSelectedIndex( index ); + const auto index = m_data->currentIndex; + + if ( ( index >= 0 ) + && ( index == indexAtPosition( qskMousePosition( event ) ) ) ) + { + trigger( m_data->currentIndex ); + close(); + } } return; @@ -394,20 +403,6 @@ QRectF QskMenu::focusIndicatorRect() const return Inherited::focusIndicatorRect(); } -void QskMenu::setSelectedIndex( int index ) -{ - if ( !isOpen() ) - return; - - if ( index >= 0 ) - setCurrentIndex( index ); - - m_data->selectedIndex = index; - Q_EMIT triggered( index ); - - close(); -} - QRectF QskMenu::cellRect( int index ) const { return effectiveSkinlet()->sampleRect( @@ -420,11 +415,19 @@ int QskMenu::indexAtPosition( const QPointF& pos ) const this, contentsRect(), QskMenu::Segment, pos ); } +void QskMenu::trigger( int index ) +{ + if ( index >= 0 && index < m_data->options.count() ) + { + m_data->triggeredIndex = index; + Q_EMIT triggered( index ); + } +} + int QskMenu::exec() { - m_data->selectedIndex = -1; (void) execPopup(); - return m_data->selectedIndex; + return m_data->triggeredIndex; } #include "moc_QskMenu.cpp" diff --git a/src/controls/QskMenu.h b/src/controls/QskMenu.h index 9ca3da04..b2f9ac8f 100644 --- a/src/controls/QskMenu.h +++ b/src/controls/QskMenu.h @@ -7,12 +7,11 @@ #define QSK_MENU_H #include "QskPopup.h" - -#include -#include +#include class QskTextOptions; class QskLabelData; +class QUrl; class QSK_EXPORT QskMenu : public QskPopup { @@ -32,7 +31,10 @@ class QSK_EXPORT QskMenu : public QskPopup Q_PROPERTY( int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged ) - Q_PROPERTY( QString currentText READ currentText ) + Q_PROPERTY( int triggeredIndex READ triggeredIndex NOTIFY triggered ) + + Q_PROPERTY( QString triggeredText READ triggeredText NOTIFY triggered ) + Q_PROPERTY( QString currentText READ currentText NOTIFY currentIndexChanged ) using Inherited = QskPopup; @@ -58,6 +60,7 @@ class QSK_EXPORT QskMenu : public QskPopup int addOption( const QskLabelData& ); void setOptions( const QVector< QskLabelData >& ); + void setOptions( const QStringList& ); QVector< QskLabelData > options() const; QskLabelData optionAt( int ) const; @@ -74,6 +77,9 @@ class QSK_EXPORT QskMenu : public QskPopup int currentIndex() const; QString currentText() const; + int triggeredIndex() const; + QString triggeredText() const; + QRectF focusIndicatorRect() const override; QRectF cellRect( int index ) const; @@ -106,10 +112,10 @@ class QSK_EXPORT QskMenu : public QskPopup void mouseReleaseEvent( QMouseEvent* ) override; void aboutToShow() override; + void trigger( int ); private: void traverse( int steps ); - void setSelectedIndex( int index ); class PrivateData; std::unique_ptr< PrivateData > m_data; diff --git a/src/controls/QskSegmentedBar.cpp b/src/controls/QskSegmentedBar.cpp index 57483beb..d229bdf8 100644 --- a/src/controls/QskSegmentedBar.cpp +++ b/src/controls/QskSegmentedBar.cpp @@ -124,6 +124,11 @@ QskLabelData QskSegmentedBar::optionAt( int index ) const return m_data->options.value( index ); } +void QskSegmentedBar::setOptions( const QStringList& options ) +{ + setOptions( qskCreateLabelData( options ) ); +} + void QskSegmentedBar::setOptions( const QVector< QskLabelData >& options ) { m_data->options = options; diff --git a/src/controls/QskSegmentedBar.h b/src/controls/QskSegmentedBar.h index 15e1de23..63bc0725 100644 --- a/src/controls/QskSegmentedBar.h +++ b/src/controls/QskSegmentedBar.h @@ -7,12 +7,11 @@ #define QSK_SEGMENTED_BAR_H #include "QskControl.h" - -#include -#include +#include class QskTextOptions; class QskLabelData; +class QUrl; class QSK_EXPORT QskSegmentedBar : public QskControl { @@ -55,6 +54,7 @@ class QSK_EXPORT QskSegmentedBar : public QskControl int addOption( const QskLabelData& ); void setOptions( const QVector< QskLabelData >& ); + void setOptions( const QStringList& ); QVector< QskLabelData > options() const; QskLabelData optionAt( int ) const;