diff --git a/examples/iotdashboard/CircularProgressBar.cpp b/examples/iotdashboard/CircularProgressBar.cpp index 3a839286..7b10bb73 100644 --- a/examples/iotdashboard/CircularProgressBar.cpp +++ b/examples/iotdashboard/CircularProgressBar.cpp @@ -6,6 +6,7 @@ #include "CircularProgressBar.h" #include +#include #include QSK_SUBCONTROL( CircularProgressBar, Groove ) @@ -179,6 +180,14 @@ void CircularProgressBar::setValueInternal( qreal value ) if ( !qskFuzzyCompare( value, m_data->value ) ) { m_data->value = value; + + // if we didn't change the metrics here we would have to + // add our own drawing code to the skinlet: + QskArcMetrics arcMetrics = arcMetricsHint( Bar ); + const int spanAngle = qRound( valueAsRatio() * -5760 ); + arcMetrics.setSpanAngle( spanAngle ); + setArcMetricsHint( Bar, arcMetrics ); + Q_EMIT valueChanged( value ); update(); diff --git a/examples/iotdashboard/CircularProgressBarSkinlet.cpp b/examples/iotdashboard/CircularProgressBarSkinlet.cpp index 3d6ed822..d8bdece1 100644 --- a/examples/iotdashboard/CircularProgressBarSkinlet.cpp +++ b/examples/iotdashboard/CircularProgressBarSkinlet.cpp @@ -35,47 +35,20 @@ QSGNode* CircularProgressBarSkinlet::updateSubNode( switch( nodeRole ) { - case GrooveRole: // fall through + case GrooveRole: + { + return updateArcNode( skinnable, node, CircularProgressBar::Groove, + bar->window() ); + } case BarRole: { - return updateBarNode( bar, nodeRole, node ); + const auto subControl = CircularProgressBar::Bar; + return updateArcNode( skinnable, node, CircularProgressBar::Bar, + bar->window() ); } } return Inherited::updateSubNode( skinnable, nodeRole, node ); } -QSGNode* CircularProgressBarSkinlet::updateBarNode( - const CircularProgressBar* bar, quint8 nodeRole, QSGNode* node ) const -{ - auto arcNode = static_cast< QskArcNode* >( node ); - - if( arcNode == nullptr ) - { - arcNode = new QskArcNode(); - } - - // ### for the groove case, we can just call updateArcNode directly, - // but not for the bar case, because we need to change the angles - // for the latter case, we can just set the metrics rather than having - // this method here - const auto subControl = ( nodeRole == GrooveRole ) ? - CircularProgressBar::Groove : CircularProgressBar::Bar; - - const QRectF rect = bar->contentsRect(); // ### rather call subcontrolrect - - QskArcMetrics arcMetrics = bar->arcMetricsHint( subControl ); - const int spanAngle = ( nodeRole == GrooveRole ) ? - 5760 : qRound( bar->valueAsRatio() * -5760 ); - arcMetrics.setSpanAngle( spanAngle ); - - QQuickWindow* window = bar->window(); - - const QskGradient gradient = bar->gradientHint( subControl ); - - arcNode->setArcData( rect, arcMetrics, gradient, window ); - - return arcNode; -} - #include "moc_CircularProgressBarSkinlet.cpp" diff --git a/examples/iotdashboard/CircularProgressBarSkinlet.h b/examples/iotdashboard/CircularProgressBarSkinlet.h index f7789fe8..be867d05 100644 --- a/examples/iotdashboard/CircularProgressBarSkinlet.h +++ b/examples/iotdashboard/CircularProgressBarSkinlet.h @@ -33,7 +33,4 @@ class CircularProgressBarSkinlet : public QskSkinlet protected: QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* ) const override; - - private: - QSGNode* updateBarNode( const CircularProgressBar*, quint8 nodeRole, QSGNode* ) const; };