diff --git a/examples/iotdashboard/Skin.cpp b/examples/iotdashboard/Skin.cpp index 370eb36d..56fb9135 100644 --- a/examples/iotdashboard/Skin.cpp +++ b/examples/iotdashboard/Skin.cpp @@ -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 }; } diff --git a/examples/iotdashboard/Skin.h b/examples/iotdashboard/Skin.h index 8761fd68..b692f2e0 100644 --- a/examples/iotdashboard/Skin.h +++ b/examples/iotdashboard/Skin.h @@ -23,7 +23,7 @@ class Skin : public QskSkin QColor shadow; QColor lightDisplayKnobBorder; QskGradient lightDisplayColdAndWarmArc; - QskGradient circularProgressBarGroove; + QRgb circularProgressBarGroove; QRgb deviceGraphic; }; diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index ad371f2b..02c7e339 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -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, diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index 238728ce..d6476363 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -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 ); diff --git a/src/nodes/QskArcNode.cpp b/src/nodes/QskArcNode.cpp index 914760e4..ecc2484f 100644 --- a/src/nodes/QskArcNode.cpp +++ b/src/nodes/QskArcNode.cpp @@ -16,58 +16,6 @@ #include #include -#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 { diff --git a/src/nodes/QskArcNode.h b/src/nodes/QskArcNode.h index 00a42d93..1e3e44d1 100644 --- a/src/nodes/QskArcNode.h +++ b/src/nodes/QskArcNode.h @@ -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