2017-07-21 18:21:34 +02:00
|
|
|
/******************************************************************************
|
|
|
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
|
|
* This file may be used under the terms of the QSkinny License, Version 1.0
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
#include "QskBoxNode.h"
|
2022-12-05 12:34:08 +01:00
|
|
|
#include "QskBoxFillNode.h"
|
|
|
|
#include "QskBoxShadowNode.h"
|
|
|
|
#include "QskBoxRectangleNode.h"
|
2022-12-05 17:08:32 +01:00
|
|
|
#include "QskBoxRenderer.h"
|
2022-12-05 12:34:08 +01:00
|
|
|
#include "QskSGNode.h"
|
|
|
|
|
2017-10-20 13:09:30 +02:00
|
|
|
#include "QskGradient.h"
|
2022-11-13 17:22:09 +01:00
|
|
|
#include "QskGradientDirection.h"
|
2022-12-05 12:34:08 +01:00
|
|
|
#include "QskShadowMetrics.h"
|
|
|
|
#include "QskBoxBorderMetrics.h"
|
|
|
|
#include "QskBoxBorderColors.h"
|
2017-10-20 13:09:30 +02:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
namespace
|
|
|
|
{
|
|
|
|
enum Role
|
|
|
|
{
|
|
|
|
ShadowRole,
|
|
|
|
BoxRole,
|
|
|
|
FillRole
|
|
|
|
};
|
|
|
|
}
|
2017-08-28 17:42:11 +02:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
void qskUpdateChildren( QSGNode* parentNode, quint8 role, QSGNode* node )
|
2017-10-17 17:34:00 +02:00
|
|
|
{
|
2022-12-05 12:34:08 +01:00
|
|
|
static const QVector< quint8 > roles = { ShadowRole, BoxRole, FillRole };
|
2017-09-03 14:55:21 +02:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
auto oldNode = QskSGNode::findChildNode( parentNode, role );
|
|
|
|
QskSGNode::replaceChildNode( roles, role, parentNode, oldNode, node );
|
2017-08-28 17:42:11 +02:00
|
|
|
}
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
template< typename Node >
|
|
|
|
inline Node* qskNode( QSGNode* parentNode, quint8 role )
|
2017-08-28 17:42:11 +02:00
|
|
|
{
|
2022-12-05 12:34:08 +01:00
|
|
|
using namespace QskSGNode;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
auto node = static_cast< Node* > ( findChildNode( parentNode, role ) );
|
2022-10-31 14:42:08 +01:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
if ( node == nullptr )
|
|
|
|
{
|
|
|
|
node = new Node();
|
|
|
|
setNodeRole( node, role );
|
|
|
|
}
|
|
|
|
|
|
|
|
return node;
|
|
|
|
}
|
2022-10-31 14:42:08 +01:00
|
|
|
|
2018-08-03 08:15:28 +02:00
|
|
|
QskBoxNode::QskBoxNode()
|
2017-07-21 18:21:34 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
QskBoxNode::~QskBoxNode()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
void QskBoxNode::updateNode( const QRectF& rect,
|
2017-10-20 13:09:30 +02:00
|
|
|
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics,
|
2022-12-05 12:34:08 +01:00
|
|
|
const QskBoxBorderColors& borderColors, const QskGradient& gradient,
|
|
|
|
const QskShadowMetrics& shadowMetrics, const QColor& shadowColor )
|
2017-07-21 18:21:34 +02:00
|
|
|
{
|
2022-12-05 12:34:08 +01:00
|
|
|
using namespace QskSGNode;
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
QskBoxShadowNode* shadowNode = nullptr;
|
|
|
|
QskBoxRectangleNode* rectNode = nullptr;
|
|
|
|
QskBoxFillNode* fillNode = nullptr;
|
2017-10-17 17:34:00 +02:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
if ( !shadowMetrics.isNull()
|
|
|
|
&& shadowColor.isValid() && shadowColor.alpha() != 0 )
|
2017-07-21 18:21:34 +02:00
|
|
|
{
|
2022-12-05 12:34:08 +01:00
|
|
|
shadowNode = qskNode< QskBoxShadowNode >( this, ShadowRole );
|
|
|
|
shadowNode->setShadowData( shadowMetrics.shadowRect( rect ),
|
|
|
|
shape, shadowMetrics.blurRadius(), shadowColor );
|
2017-10-17 17:34:00 +02:00
|
|
|
}
|
2017-08-28 17:42:11 +02:00
|
|
|
|
2017-10-17 17:34:00 +02:00
|
|
|
/*
|
2023-01-23 10:59:34 +01:00
|
|
|
QskBoxRectangleNode supports vertical/horizontal and many tilted
|
|
|
|
linear gradients. If our gradient doesn't fall into this category
|
|
|
|
we use a QskBoxFillNode.
|
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
However the border is always done with a QskBoxRectangleNode
|
2017-10-17 17:34:00 +02:00
|
|
|
*/
|
2017-07-21 18:21:34 +02:00
|
|
|
|
2022-12-06 16:37:18 +01:00
|
|
|
if ( QskBoxRenderer::isGradientSupported( shape, gradient ) )
|
2017-10-17 17:34:00 +02:00
|
|
|
{
|
2022-12-05 12:34:08 +01:00
|
|
|
rectNode = qskNode< QskBoxRectangleNode >( this, BoxRole );
|
|
|
|
rectNode->updateNode( rect, shape, borderMetrics, borderColors, gradient );
|
2017-10-17 17:34:00 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-12-05 12:34:08 +01:00
|
|
|
if ( !borderMetrics.isNull() && borderColors.isVisible() )
|
2017-10-17 17:34:00 +02:00
|
|
|
{
|
2022-12-05 12:34:08 +01:00
|
|
|
rectNode = qskNode< QskBoxRectangleNode >( this, BoxRole );
|
|
|
|
rectNode->updateNode( rect, shape, borderMetrics, borderColors, QskGradient() );
|
2017-10-17 17:34:00 +02:00
|
|
|
}
|
2022-12-05 12:34:08 +01:00
|
|
|
|
|
|
|
if ( gradient.isVisible() )
|
2017-10-17 17:34:00 +02:00
|
|
|
{
|
2022-12-05 12:34:08 +01:00
|
|
|
fillNode = qskNode< QskBoxFillNode >( this, FillRole );
|
|
|
|
fillNode->updateNode( rect, shape, borderMetrics, gradient );
|
2017-10-17 17:34:00 +02:00
|
|
|
}
|
2017-07-21 18:21:34 +02:00
|
|
|
}
|
2017-10-17 17:34:00 +02:00
|
|
|
|
2022-12-05 12:34:08 +01:00
|
|
|
qskUpdateChildren( this, ShadowRole, shadowNode );
|
|
|
|
qskUpdateChildren( this, BoxRole, rectNode );
|
|
|
|
qskUpdateChildren( this, FillRole, fillNode );
|
2017-07-21 18:21:34 +02:00
|
|
|
}
|