couple shadow visibility to fill node's visibility

This commit is contained in:
Vogel, Rick 2023-12-18 13:15:29 +01:00
parent 2705fbec31
commit 5f17d877b3
1 changed files with 28 additions and 26 deletions

View File

@ -20,6 +20,16 @@
#include <QDebug> #include <QDebug>
#include <qmath.h> #include <qmath.h>
namespace
{
enum NodeRole
{
ShadowRole,
FillRole,
BorderRole
};
}
static inline QskGradient qskEffectiveGradient( static inline QskGradient qskEffectiveGradient(
const QskGradient& gradient, const QskArcMetrics& metrics ) const QskGradient& gradient, const QskArcMetrics& metrics )
{ {
@ -60,6 +70,14 @@ static inline QRectF qskEffectiveRect(
return qskValidOrEmptyInnerRect( rect, QskMargins( 0.5 * borderWidth ) ); return qskValidOrEmptyInnerRect( rect, QskMargins( 0.5 * borderWidth ) );
} }
static void qskUpdateChildren( QSGNode* parentNode, quint8 role, QSGNode* node )
{
static const QVector< quint8 > roles = { ShadowRole, FillRole, BorderRole };
auto oldNode = QskSGNode::findChildNode( parentNode, role );
QskSGNode::replaceChildNode( roles, role, parentNode, oldNode, node );
}
QskArcNode::QskArcNode() QskArcNode::QskArcNode()
{ {
} }
@ -77,13 +95,6 @@ void QskArcNode::setArcData( const QRectF& rect,
void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics, void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics,
const qreal borderWidth, const QColor& borderColor, const QskGradient& fillGradient, const QColor& shadowColor, const QskShadowMetrics& shadowMetrics ) const qreal borderWidth, const QColor& borderColor, const QskGradient& fillGradient, const QColor& shadowColor, const QskShadowMetrics& shadowMetrics )
{ {
enum NodeRole
{
ShadowRole,
FillRole,
BorderRole
};
const auto metrics = qskEffectiveMetrics( arcMetrics, rect ); const auto metrics = qskEffectiveMetrics( arcMetrics, rect );
const auto gradient = qskEffectiveGradient( fillGradient, metrics ); const auto gradient = qskEffectiveGradient( fillGradient, metrics );
@ -105,9 +116,13 @@ void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics
return; return;
} }
const auto isFillNodeVisible = gradient.isVisible() && !metrics.isNull();
const auto isStrokeNodeVisible = borderWidth > 0.0 && borderColor.alpha() > 0;
const auto isShadowNodeVisible = shadowColor.alpha() > 0.0 && isFillNodeVisible;
const auto path = metrics.painterPath( arcRect ); const auto path = metrics.painterPath( arcRect );
if ( shadowColor.alpha() > 0.0 ) if ( isShadowNodeVisible )
{ {
if ( shadowNode == nullptr ) if ( shadowNode == nullptr )
{ {
@ -123,7 +138,7 @@ void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics
shadowNode = nullptr; shadowNode = nullptr;
} }
if ( gradient.isVisible() && !metrics.isNull() ) if ( isFillNodeVisible )
{ {
if ( fillNode == nullptr ) if ( fillNode == nullptr )
{ {
@ -139,7 +154,7 @@ void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics
fillNode = nullptr; fillNode = nullptr;
} }
if ( borderWidth > 0.0 && borderColor.alpha() > 0 ) if ( isStrokeNodeVisible )
{ {
if ( borderNode == nullptr ) if ( borderNode == nullptr )
{ {
@ -158,20 +173,7 @@ void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics
borderNode = nullptr; borderNode = nullptr;
} }
const auto oldChildCount = this->childCount(); qskUpdateChildren(this, ShadowRole, shadowNode);
const auto newChildCount = qskUpdateChildren(this, FillRole, fillNode);
( shadowNode ? 1 : 0 ) + ( fillNode ? 1 : 0 ) + ( borderNode ? 1 : 0 ); qskUpdateChildren(this, BorderRole, borderNode);
if ( oldChildCount != newChildCount )
{
removeAllChildNodes();
for ( QSGNode* node : { ( QSGNode* ) shadowNode, ( QSGNode* ) fillNode, ( QSGNode* ) borderNode })
{
if ( node != nullptr )
{
appendChildNode( node );
}
}
}
} }