From eea001f831aa5b80da618c42d7878397d314e669 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 31 Aug 2021 17:59:00 +0200 Subject: [PATCH] methods for setting hints for state combinations added --- src/controls/QskSkinHintTable.cpp | 14 ++++ src/controls/QskSkinHintTableEditor.cpp | 101 ++++++++++++++++++++++++ src/controls/QskSkinHintTableEditor.h | 10 +++ 3 files changed, 125 insertions(+) diff --git a/src/controls/QskSkinHintTable.cpp b/src/controls/QskSkinHintTable.cpp index 2b2a826c..c9e4f92b 100644 --- a/src/controls/QskSkinHintTable.cpp +++ b/src/controls/QskSkinHintTable.cpp @@ -27,11 +27,25 @@ inline const QVariant* qskResolvedHint( QskAspect aspect, return &it->second; } +#if 1 + /* + We intend to remove the obscure mechanism of resolving a hint + by dropping the state bits ony by one in the future. Instead we + will have methods in QskSkinHintTableEditor, that allow + to set combinations of states in one call. + */ if ( const auto topState = aspect.topState() ) { aspect.clearState( topState ); continue; } +#else + if ( aspect.hasState() ) + { + aspect.clearStates(); + continue; + } +#endif if ( aspect.placement() ) { diff --git a/src/controls/QskSkinHintTableEditor.cpp b/src/controls/QskSkinHintTableEditor.cpp index 56f77dd8..18530cca 100644 --- a/src/controls/QskSkinHintTableEditor.cpp +++ b/src/controls/QskSkinHintTableEditor.cpp @@ -14,6 +14,50 @@ namespace { + inline void setHintForAllCombinations( + QskSkinHintTable* table, QskAspect aspect, const QVariant& hint, + QskAspect::State state, QskAspect::State mask ) + { + if ( mask == 0 ) + { + if ( state != 0 ) + table->setHint( aspect | state, hint ); + + return; + } + + const auto stateBit = static_cast< QskAspect::State >( + 1 << qCountTrailingZeroBits( mask ) ); + + mask &= ~stateBit; + + setHintForAllCombinations( table, aspect, hint, state, mask ); + setHintForAllCombinations( table, aspect, hint, state | stateBit, mask ); + } + + inline bool removeHintForAllCombinations( + QskSkinHintTable* table, QskAspect aspect, + QskAspect::State state, QskAspect::State mask ) + { + if ( mask == 0 ) + { + if ( state != 0 ) + return table->removeHint( aspect | state ); + + return false; + } + + const auto stateBit = static_cast< QskAspect::State >( + 1 << qCountTrailingZeroBits( mask ) ); + + mask &= ~stateBit; + + bool ret = removeHintForAllCombinations( table, aspect, state, mask ); + ret |= removeHintForAllCombinations( table, aspect, state | stateBit, mask ); + + return ret; + } + inline QskAspect aspectStrutSize( QskAspect aspect ) { return aspect | QskAspect::StrutSize; @@ -75,6 +119,36 @@ QskSkinHintTable* QskSkinHintTableEditor::table() const return m_table; } +void QskSkinHintTableEditor::setHintForCombinations( + QskAspect aspect, const QVariant& hint, QskAspect::State stateMask ) +{ + ::setHintForAllCombinations( m_table, aspect, hint, QskAspect::NoState, stateMask ); +} + +bool QskSkinHintTableEditor::removeHintForCombinations( + QskAspect aspect, QskAspect::State stateMask ) +{ + return ::removeHintForAllCombinations( m_table, aspect, QskAspect::NoState, stateMask ); +} + +void QskSkinHintTableEditor::setFlagHintForCombinations( + QskAspect aspect, const QVariant& hint, QskAspect::State stateMask ) +{ + setHintForCombinations( aspect | QskAspect::Flag, hint, stateMask ); +} + +void QskSkinHintTableEditor::setMetricHintForCombinations( + QskAspect aspect, const QVariant& hint, QskAspect::State stateMask ) +{ + setHintForCombinations( aspect | QskAspect::Metric, hint, stateMask ); +} + +void QskSkinHintTableEditor::setColorHintForCombinations( + QskAspect aspect, const QVariant& hint, QskAspect::State stateMask ) +{ + setHintForCombinations( aspect | QskAspect::Color, hint, stateMask ); +} + void QskSkinHintTableEditor::setFlag( QskAspect aspect, int flag ) { setFlagHint( aspect, flag ); @@ -132,6 +206,12 @@ void QskSkinHintTableEditor::setGradient( QskAspect aspect, const QskGradient& g setColorHint( aspect, gradient ); } +void QskSkinHintTableEditor::setGradientForCombinations( + QskAspect aspect, const QskGradient& gradient, QskAspect::State stateMask ) +{ + setColorHintForCombinations( aspect, QVariant::fromValue( gradient ), stateMask ); +} + QskGradient QskSkinHintTableEditor::gradient( QskAspect aspect ) const { return colorHint< QskGradient >( aspect ); @@ -279,6 +359,13 @@ void QskSkinHintTableEditor::setBoxShape( setMetricHint( aspectShape( aspect ), shape ); } +void QskSkinHintTableEditor::setBoxShapeForCombinations( + QskAspect aspect, const QskBoxShapeMetrics& shape, QskAspect::State stateMask ) +{ + setMetricHintForCombinations( + aspectShape( aspect ), QVariant::fromValue( shape ), stateMask ); +} + void QskSkinHintTableEditor::removeBoxShape( QskAspect aspect ) { return removeMetricHint( aspectShape( aspect ) ); @@ -309,6 +396,13 @@ void QskSkinHintTableEditor::setBoxBorderMetrics( setMetricHint( aspectBorder( aspect ), borderMetrics ); } +void QskSkinHintTableEditor::setBoxBorderMetricsForCombinations( + QskAspect aspect, const QskBoxBorderMetrics& borderMetrics, QskAspect::State stateMask ) +{ + setMetricHintForCombinations( aspectBorder( aspect ), + QVariant::fromValue( borderMetrics ), stateMask ); +} + void QskSkinHintTableEditor::removeBoxBorderMetric( QskAspect aspect ) { return removeMetricHint( aspectBorder( aspect ) ); @@ -325,6 +419,13 @@ void QskSkinHintTableEditor::setBoxBorderColors( setColorHint( aspectBorder( aspect ), borderColors ); } +void QskSkinHintTableEditor::setBoxBorderColorsForCombinations( + QskAspect aspect, const QskBoxBorderColors& borderColors, QskAspect::State stateMask ) +{ + setColorHintForCombinations( aspectBorder( aspect ), + QVariant::fromValue( borderColors ), stateMask ); +} + void QskSkinHintTableEditor::setBoxBorderColors( QskAspect aspect, const QColor& left, const QColor& top, const QColor& right, const QColor& bottom ) { diff --git a/src/controls/QskSkinHintTableEditor.h b/src/controls/QskSkinHintTableEditor.h index 175b410a..c424d987 100644 --- a/src/controls/QskSkinHintTableEditor.h +++ b/src/controls/QskSkinHintTableEditor.h @@ -31,8 +31,11 @@ class QSK_EXPORT QskSkinHintTableEditor void setHint( QskAspect, const QVariant& ); const QVariant& hint( QskAspect ) const; + void setHintForCombinations( QskAspect, const QVariant&, QskAspect::State ); bool removeHint( QskAspect ); + bool removeHintForCombinations( QskAspect, QskAspect::State ); + QVariant takeHint( QskAspect ); bool hasHint( QskAspect ) const; @@ -48,6 +51,7 @@ class QSK_EXPORT QskSkinHintTableEditor // flag/metric/color void setFlagHint( QskAspect, const QVariant& ); + void setFlagHintForCombinations( QskAspect, const QVariant&, QskAspect::State ); void removeFlagHint( QskAspect ); QVariant flagHint( QskAspect ) const; @@ -55,6 +59,7 @@ class QSK_EXPORT QskSkinHintTableEditor template< typename T > T flagHint( QskAspect ) const; void setMetricHint( QskAspect, const QVariant& ); + void setMetricHintForCombinations( QskAspect, const QVariant&, QskAspect::State ); void removeMetricHint( QskAspect ); QVariant metricHint( QskAspect ) const; @@ -62,6 +67,7 @@ class QSK_EXPORT QskSkinHintTableEditor template< typename T > T metricHint( QskAspect ) const; void setColorHint( QskAspect, const QVariant& ); + void setColorHintForCombinations( QskAspect, const QVariant&, QskAspect::State ); void removeColorHint( QskAspect ); QVariant colorHint( QskAspect ) const; @@ -84,6 +90,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setHGradient( QskAspect, const QColor&, const QColor& ); void setVGradient( QskAspect, const QColor&, const QColor& ); void setGradient( QskAspect, const QskGradient& ); + void setGradientForCombinations( QskAspect, const QskGradient&, QskAspect::State ); QskGradient gradient( QskAspect ) const; void setStrutSize( QskAspect, const QSizeF& ); @@ -123,6 +130,7 @@ class QSK_EXPORT QskSkinHintTableEditor void setBoxShape( QskAspect, qreal topLeft, qreal topRight, qreal bottomLeft, qreal bottomRight, Qt::SizeMode = Qt::AbsoluteSize ); void setBoxShape( QskAspect, const QskBoxShapeMetrics& ); + void setBoxShapeForCombinations( QskAspect, const QskBoxShapeMetrics&, QskAspect::State ); void removeBoxShape( QskAspect ); QskBoxShapeMetrics boxShape( QskAspect ) const; @@ -131,10 +139,12 @@ class QSK_EXPORT QskSkinHintTableEditor void setBoxBorderMetrics( QskAspect, qreal left, qreal top, qreal right, qreal bottom, Qt::SizeMode = Qt::AbsoluteSize ); void setBoxBorderMetrics( QskAspect, const QskBoxBorderMetrics& ); + void setBoxBorderMetricsForCombinations( QskAspect, const QskBoxBorderMetrics&, QskAspect::State ); void removeBoxBorderMetric( QskAspect ); QskBoxBorderMetrics boxBorderMetrics( QskAspect ) const; void setBoxBorderColors( QskAspect, const QskBoxBorderColors& ); + void setBoxBorderColorsForCombinations( QskAspect, const QskBoxBorderColors&, QskAspect::State ); void setBoxBorderColors( QskAspect, const QColor& left, const QColor& top, const QColor& right, const QColor& bottom ); void removeBoxBorderColors( QskAspect );