diff --git a/src/controls/QskListViewSkinlet.cpp b/src/controls/QskListViewSkinlet.cpp index c7245306..d7534798 100644 --- a/src/controls/QskListViewSkinlet.cpp +++ b/src/controls/QskListViewSkinlet.cpp @@ -161,7 +161,9 @@ void QskListViewSkinlet::updateBackgroundNodes( if ( rowSelected >= rowMin && rowSelected <= rowMax ) { - const QskSkinStateChanger stateChanger( listView, QskListView::Selected ); + QskSkinStateChanger stateChanger( listView ); + stateChanger.addStates( QskListView::Selected ); + const QColor color = listView->color( QskListView::Cell ); if ( rowNode == nullptr ) @@ -438,7 +440,8 @@ QSGNode* QskListViewSkinlet::updateCellNode( const QskListView* listView, if ( row == listView->selectedRow() ) rowStates |= QskListView::Selected; - QskSkinStateChanger stateChanger( listView, rowStates ); + QskSkinStateChanger stateChanger( listView ); + stateChanger.addStates( rowStates ); QSGNode* newNode = nullptr; diff --git a/src/controls/QskMenuSkinlet.cpp b/src/controls/QskMenuSkinlet.cpp index 503cd389..d8dc1f92 100644 --- a/src/controls/QskMenuSkinlet.cpp +++ b/src/controls/QskMenuSkinlet.cpp @@ -14,19 +14,6 @@ #include -namespace -{ - class StateChanger : public QskSkinStateChanger - { - public: - inline StateChanger( const QskSkinnable* skinnable, bool isSelected ) - : QskSkinStateChanger( skinnable, isSelected - ? QskMenu::Selected : QskAspect::NoState ) - { - } - }; -} - template< class T > static T qskValueAt( const QskMenu* menu, int index ) { @@ -152,7 +139,9 @@ static QSGNode* qskUpdateBackgroundNode( const QskMenu* menu, QSGNode* rootNode QSGNode* newNode = nullptr; { - const StateChanger stateChanger( menu, menu->currentIndex() == i ); + QskSkinStateChanger stateChanger( menu ); + if ( menu->currentIndex() == i ) + stateChanger.addStates( QskMenu::Selected ); newNode = QskSkinlet::updateBoxNode( menu, node, menu->cellRect( i ), QskMenu::Cell ); @@ -229,7 +218,9 @@ static QSGNode* qskUpdateItemsNode( const QskMenu* menu, QSGNode* rootNode ) } { - const StateChanger stateChanger( menu, menu->currentIndex() == i ); + QskSkinStateChanger stateChanger( menu ); + if ( menu->currentIndex() == i ) + stateChanger.addStates( QskMenu::Selected ); const auto cellRect = menu->cellRect( i ); diff --git a/src/controls/QskSkinStateChanger.h b/src/controls/QskSkinStateChanger.h index 97a0eff9..454fd8f7 100644 --- a/src/controls/QskSkinStateChanger.h +++ b/src/controls/QskSkinStateChanger.h @@ -12,12 +12,17 @@ class QskSkinStateChanger { public: - QskSkinStateChanger( const QskSkinnable*, QskAspect::States ); + QskSkinStateChanger( const QskSkinnable*, + QskAspect::States = QskAspect::States() ); + ~QskSkinStateChanger(); + void addStates( QskAspect::States ); + void clearStates( QskAspect::States ); + private: QskSkinnable* m_skinnable; - QskAspect::States m_oldStates; + const QskAspect::States m_oldStates; }; inline QskSkinStateChanger::QskSkinStateChanger( @@ -25,8 +30,7 @@ inline QskSkinStateChanger::QskSkinStateChanger( : m_skinnable( const_cast< QskSkinnable* >( skinnable ) ) , m_oldStates( skinnable->skinStates() ) { - if ( states ) - m_skinnable->replaceSkinStates( m_oldStates | states ); + addStates( states ); } inline QskSkinStateChanger::~QskSkinStateChanger() @@ -35,4 +39,20 @@ inline QskSkinStateChanger::~QskSkinStateChanger() m_skinnable->replaceSkinStates( m_oldStates ); } +inline void QskSkinStateChanger::addStates( QskAspect::States states ) +{ + const auto newStates = m_oldStates | states; + + if ( newStates != m_skinnable->skinStates() ) + m_skinnable->replaceSkinStates( newStates ); +} + +inline void QskSkinStateChanger::clearStates( QskAspect::States states ) +{ + const auto newStates = m_oldStates & ~states; + + if ( newStates != m_skinnable->skinStates() ) + m_skinnable->replaceSkinStates( newStates ); +} + #endif diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index 90b69568..797d4b47 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -43,7 +43,7 @@ class QSK_EXPORT QskSkinlet const QRectF&, QskAspect::Subcontrol ) const; virtual QRectF itemRect( const QskSkinnable*, - const QRectF&, QskAspect::Subcontrol, int itemIndex ) const; + const QRectF&, QskAspect::Subcontrol, int index ) const; virtual int itemIndexAt( const QskSkinnable*, const QRectF&, QskAspect::Subcontrol, const QPointF& ) const;