QskArcNode supports borders now

This commit is contained in:
Uwe Rathmann 2023-04-17 10:54:44 +02:00
parent 328e6a9e6f
commit 785cb33739
6 changed files with 51 additions and 87 deletions

View File

@ -287,9 +287,9 @@ void Skin::initHints( const Palette& palette )
ed.setColor( QskTextLabel::Text, palette.text );
ed.setColor( UsageDiagramBox::DayText, palette.text );
auto grooveGradient = palette.circularProgressBarGroove;
grooveGradient.setDirection( QskGradient::Linear );
ed.setGradient( CircularProgressBar::Groove, grooveGradient );
ed.setMetric( CircularProgressBar::Groove | QskAspect::Border, 2 );
ed.setColor( CircularProgressBar::Groove | QskAspect::Border,
palette.circularProgressBarGroove );
// storage bar
{
@ -326,8 +326,8 @@ Skin::Palette DaytimeSkin::palette() const
0xffc4c4c4,
{ { { 0.0, 0xffff3122 }, { 0.2, 0xfffeeeb7 }, { 0.3, 0xffa7b0ff }, { 0.5, 0xff6776ff },
{ 1.0, Qt::black } } },
{ { { 0.0, 0xffe0e0e0 }, { 0.5, 0xfff8f8f8 }, { 1.0, 0xffe0e0e0 } } },
0xffdddddd,
0x10000000,
0xffdddddd
};
}
@ -344,7 +344,7 @@ Skin::Palette NighttimeSkin::palette() const
0xff4a4a4a,
0xff555555,
{ { { 0.0, 0xff991100 }, { 0.2, 0xff9a7a57 }, { 0.5, 0xff3726af }, { 1.0, Qt::black } } },
{ { { 0.0, 0xff666666 }, { 0.5, 0xff222222 }, { 1.0, 0xff333333 } } },
0xff222222,
0x10ffffff,
0xff222222
};
}

View File

@ -23,7 +23,7 @@ class Skin : public QskSkin
QColor shadow;
QColor lightDisplayKnobBorder;
QskGradient lightDisplayColdAndWarmArc;
QskGradient circularProgressBarGroove;
QRgb circularProgressBarGroove;
QRgb deviceGraphic;
};

View File

@ -144,9 +144,15 @@ static inline bool qskIsBoxVisible( const QskBoxBorderMetrics& borderMetrics,
}
static inline bool qskIsArcVisible( const QskArcMetrics& arcMetrics,
const QskGradient& gradient )
qreal borderWidth, const QColor borderColor, const QskGradient& gradient )
{
return !arcMetrics.isNull() && gradient.isVisible();
if ( arcMetrics.isNull() )
return false;
if ( borderWidth > 0.0 && borderColor.isValid() && borderColor.alpha() > 0 )
return true;
return gradient.isVisible();
}
static inline QskTextColors qskTextColors(
@ -205,16 +211,20 @@ static inline QSGNode* qskUpdateBoxNode(
static inline QSGNode* qskUpdateArcNode(
const QskSkinnable*, QSGNode* node, const QRectF& rect,
qreal borderWidth, const QColor borderColor,
const QskGradient& gradient, const QskArcMetrics& metrics )
{
if ( rect.isEmpty() || !qskIsArcVisible( metrics, gradient ) )
if ( rect.isEmpty() )
return nullptr;
if ( !qskIsArcVisible( metrics, borderWidth, borderColor, gradient ) )
return nullptr;
auto arcNode = static_cast< QskArcNode* >( node );
if ( arcNode == nullptr )
arcNode = new QskArcNode();
arcNode->setArcData( rect, metrics, gradient );
arcNode->setArcData( rect, metrics, borderWidth, borderColor, gradient );
return arcNode;
}
@ -502,14 +512,23 @@ QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
const auto metrics = skinnable->arcMetricsHint( subControl );
const auto r = rect.marginsRemoved( skinnable->marginHint( subControl ) );
return qskUpdateArcNode( skinnable, node, r, fillGradient, metrics );
const qreal borderWidth = skinnable->metric( subControl | QskAspect::Border );
QColor borderColor;
if ( borderWidth > 0.0 )
borderColor = skinnable->color( subControl | QskAspect::Border );
return qskUpdateArcNode( skinnable, node,
r, borderWidth, borderColor, fillGradient, metrics );
}
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
QSGNode* node, const QRectF& rect, const QskGradient& fillGradient,
const QskArcMetrics& metrics )
QSGNode* QskSkinlet::updateArcNode(
const QskSkinnable* skinnable, QSGNode* node, const QRectF& rect,
qreal borderWidth, const QColor& borderColor,
const QskGradient& fillGradient, const QskArcMetrics& metrics )
{
return qskUpdateArcNode( skinnable, node, rect, fillGradient, metrics );
return qskUpdateArcNode( skinnable, node, rect,
borderWidth, borderColor, fillGradient, metrics );
}
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
@ -517,8 +536,9 @@ QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
QskAspect::Subcontrol subControl ) const
{
const auto rect = qskSubControlRect( this, skinnable, subControl );
return updateArcNode( skinnable, node, rect, startAngle, spanAngle,
subControl );
return updateArcNode( skinnable, node,
rect, startAngle, spanAngle, subControl );
}
QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
@ -538,8 +558,15 @@ QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable,
arcMetrics.setStartAngle( startAngle );
arcMetrics.setSpanAngle( spanAngle );
const qreal borderWidth = skinnable->metric( subControl | QskAspect::Border );
QColor borderColor;
if ( borderWidth > 0.0 )
borderColor = skinnable->color( subControl | QskAspect::Border );
const auto r = rect.marginsRemoved( skinnable->marginHint( subControl ) );
return updateArcNode( skinnable, node, r, fillGradient, arcMetrics );
return updateArcNode( skinnable, node, r,
borderWidth, borderColor, fillGradient, arcMetrics );
}
QSGNode* QskSkinlet::updateBoxClipNode( const QskSkinnable* skinnable,

View File

@ -101,7 +101,8 @@ class QSK_EXPORT QskSkinlet
const QRectF&, const QskGradient&, QskAspect::Subcontrol );
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
const QRectF&, const QskGradient&, const QskArcMetrics& );
const QRectF&, qreal borderWidth, const QColor& borderColor,
const QskGradient&, const QskArcMetrics& );
static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*,
const QRectF&, qreal startAngle, qreal spanAngle, QskAspect::Subcontrol );

View File

@ -16,58 +16,6 @@
#include <qpen.h>
#include <qpainterpath.h>
#define LINEAR_GRADIENT_HACK 1
#if LINEAR_GRADIENT_HACK
static inline QskGradient qskBuildGradient( QskGradient::Type type,
const QRectF& rect, const QskArcMetrics& metrics,
const QskGradientStops& stops )
{
const auto center = rect.center();
QskGradient gradient;
gradient.setStretchMode( QskGradient::NoStretch );
if ( type == QskGradient::Conic )
{
gradient.setConicDirection(
center.x(), center.y(), metrics.startAngle() );
gradient.setStops( stops );
}
else
{
gradient.setRadialDirection( center.x(), center.y(),
rect.width(), rect.height() );
{
/*
Trying to do what QGradient::LogicalMode does in
the previous QPainter based implementation
*/
const auto radius = 0.5 * qMin( rect.width(), rect.height() );
const auto t = metrics.thickness() / radius;
QskGradientStops scaledStops;
scaledStops.reserve( stops.size() );
for ( const auto& stop : stops )
{
const auto pos = 0.5 - t * ( 0.75 - stop.position() );
scaledStops += QskGradientStop( pos, stop.color() );
}
gradient.setStops( scaledStops );
}
}
return gradient;
}
#endif
static inline QskGradient qskEffectiveGradient(
const QskGradient& gradient, const QRectF& rect,
const QskArcMetrics& metrics )
@ -88,18 +36,6 @@ static inline QskGradient qskEffectiveGradient(
return g;
}
#if LINEAR_GRADIENT_HACK
if ( gradient.type() == QskGradient::Linear )
{
// to keep the iotdashboard working: to be removed
const auto type = gradient.linearDirection().isHorizontal()
? QskGradient::Conic : QskGradient::Radial;
return qskBuildGradient( type, rect, metrics, gradient.stops() );
}
#endif
}
return gradient;
@ -143,7 +79,7 @@ void QskArcNode::setArcData( const QRectF& rect,
}
void QskArcNode::setArcData( const QRectF& rect, const QskArcMetrics& arcMetrics,
qreal borderWidth, const QColor borderColor, const QskGradient& fillGradient )
qreal borderWidth, const QColor& borderColor, const QskGradient& fillGradient )
{
enum NodeRole
{

View File

@ -24,7 +24,7 @@ class QSK_EXPORT QskArcNode : public QskShapeNode
void setArcData( const QRectF&, const QskArcMetrics&, const QskGradient& );
void setArcData( const QRectF&, const QskArcMetrics&,
qreal borderWidth, const QColor borderColor, const QskGradient& );
qreal borderWidth, const QColor& borderColor, const QskGradient& );
};
#endif