add overloads for updateArcNode() when the angles are set dynamically

The angles don't always come from the style, so we need overloads
in QskSkinlet to set them dynamically.
This commit is contained in:
Peter Hartmann 2021-10-19 10:11:24 +02:00
parent a83df8c6f7
commit 8dd429c74f
4 changed files with 63 additions and 11 deletions

View File

@ -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();

View File

@ -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 );
}
}

View File

@ -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
{

View File

@ -13,6 +13,7 @@
#include <memory>
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;