QskArcNode supports borders now
This commit is contained in:
parent
328e6a9e6f
commit
785cb33739
@ -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
|
||||
};
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ class Skin : public QskSkin
|
||||
QColor shadow;
|
||||
QColor lightDisplayKnobBorder;
|
||||
QskGradient lightDisplayColdAndWarmArc;
|
||||
QskGradient circularProgressBarGroove;
|
||||
QRgb circularProgressBarGroove;
|
||||
QRgb deviceGraphic;
|
||||
};
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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 );
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user