diff --git a/examples/iotdashboard/CircularProgressBar.cpp b/examples/iotdashboard/CircularProgressBar.cpp index 7b10bb73..91578197 100644 --- a/examples/iotdashboard/CircularProgressBar.cpp +++ b/examples/iotdashboard/CircularProgressBar.cpp @@ -181,13 +181,6 @@ void CircularProgressBar::setValueInternal( qreal 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 bb48bf99..643a9ad1 100644 --- a/examples/iotdashboard/CircularProgressBarSkinlet.cpp +++ b/examples/iotdashboard/CircularProgressBarSkinlet.cpp @@ -38,7 +38,11 @@ QSGNode* CircularProgressBarSkinlet::updateSubNode( } case BarRole: { - return updateArcNode( skinnable, node, CircularProgressBar::Bar ); + const qreal startAngle = 90 * 16; + const auto bar = static_cast< const CircularProgressBar* >( skinnable ); + const qreal spanAngle = bar->valueAsRatio() * -5760; + return updateArcNode( skinnable, node, startAngle, spanAngle, + CircularProgressBar::Bar ); } } diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index db350941..2a1e1471 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -337,6 +337,15 @@ QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, QSGNode* node, const QRectF& rect, const QskGradient& fillGradient, QskAspect::Subcontrol subControl ) +{ + auto arcMetrics = skinnable->arcMetricsHint( subControl ); + return updateArcNode( skinnable, node ,rect, fillGradient, arcMetrics, + subControl ); +} + +QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, + QSGNode* node, const QRectF& rect, const QskGradient& fillGradient, + const QskArcMetrics& arcMetrics, QskAspect::Subcontrol subControl ) { const auto control = skinnable->owningControl(); if ( control == nullptr ) @@ -349,8 +358,7 @@ QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, if ( arcRect.isEmpty() ) return nullptr; - auto arcMetrics = skinnable->arcMetricsHint( subControl ); - arcMetrics = arcMetrics.toAbsolute( arcRect.size() ); + auto absoluteArcMetrics = arcMetrics.toAbsolute( arcRect.size() ); if ( !qskIsArcVisible( arcMetrics, fillGradient ) ) return nullptr; @@ -360,11 +368,42 @@ QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, if ( arcNode == nullptr ) arcNode = new QskArcNode(); - arcNode->setArcData( rect, arcMetrics, fillGradient, control->window() ); + arcNode->setArcData( rect, absoluteArcMetrics, fillGradient, + control->window() ); return arcNode; } +QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, + QSGNode* node, int startAngle, int spanAngle, + QskAspect::Subcontrol subControl ) const +{ + const auto rect = qskSubControlRect( this, skinnable, subControl ); + return updateArcNode( skinnable, node, rect, startAngle, spanAngle, + subControl ); +} + +QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, + QSGNode* node, const QRectF& rect, int startAngle, int spanAngle, + QskAspect::Subcontrol subControl ) +{ + const auto fillGradient = skinnable->gradientHint( subControl ); + return updateArcNode( skinnable, node, rect, fillGradient, startAngle, + spanAngle, subControl ); +} + +QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, + QSGNode* node, const QRectF& rect, const QskGradient& fillGradient, + int startAngle, int spanAngle, QskAspect::Subcontrol subControl ) +{ + auto arcMetrics = skinnable->arcMetricsHint( subControl ); + arcMetrics.setStartAngle( startAngle ); + arcMetrics.setSpanAngle( spanAngle ); + + return updateArcNode( skinnable, node ,rect, fillGradient, arcMetrics, + subControl ); +} + QSGNode* QskSkinlet::updateBoxClipNode( const QskSkinnable* skinnable, QSGNode* node, QskAspect::Subcontrol subControl ) const { diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index a8fece6a..625b9cab 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -13,6 +13,7 @@ #include +class QskArcMetrics; class QskSkin; class QskControl; class QskSkinnable; @@ -58,6 +59,17 @@ class QSK_EXPORT QskSkinlet static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*, const QRectF&, const QskGradient&, QskAspect::Subcontrol ); + static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*, + const QRectF&, const QskGradient&, const QskArcMetrics&, + QskAspect::Subcontrol ); + + static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*, + const QRectF&, int startAngle, int spanAngle, QskAspect::Subcontrol ); + + static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*, + const QRectF&, const QskGradient&, int startAngle, int spanAngle, + QskAspect::Subcontrol ); + static QSGNode* updateTextNode( const QskSkinnable*, QSGNode*, const QRectF&, Qt::Alignment, const QString&, const QskTextOptions&, QskAspect::Subcontrol ); @@ -94,6 +106,10 @@ class QSK_EXPORT QskSkinlet QSGNode* updateArcNode( const QskSkinnable*, QSGNode*, QskAspect::Subcontrol ) const; + QSGNode* updateArcNode( const QskSkinnable*, QSGNode*, + int startAngle, int spanAngle, + QskAspect::Subcontrol ) const; + QSGNode* updateBoxClipNode( const QskSkinnable*, QSGNode*, QskAspect::Subcontrol ) const;