diff --git a/src/common/QskBoxHints.cpp b/src/common/QskBoxHints.cpp new file mode 100644 index 00000000..a2f4db05 --- /dev/null +++ b/src/common/QskBoxHints.cpp @@ -0,0 +1,52 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + +#include "QskBoxHints.h" + +QskBoxHints::QskBoxHints() +{ +} + +QskBoxHints::QskBoxHints( + const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics, + const QskBoxBorderColors& borderColors, const QskGradient& gradient ) + : shape( shape ) + , borderMetrics( borderMetrics ) + , borderColors( borderColors ) + , gradient( gradient ) +{ +} + +QskBoxHints QskBoxHints::toAbsolute( const QSizeF& size ) const noexcept +{ + return QskBoxHints( shape.toAbsolute( size ), + borderMetrics.toAbsolute( size ), borderColors, gradient ); +} + +QskBoxHints QskBoxHints::interpolated( + const QskBoxHints& to, qreal value ) const noexcept +{ + return QskBoxHints( + shape.interpolated( to.shape, value ), + borderMetrics.interpolated( to.borderMetrics, value ), + borderColors.interpolated( to.borderColors, value ), + gradient.interpolated( to.gradient, value ) ); +} + +#ifndef QT_NO_DEBUG_STREAM + +#include + +QDebug operator<<( QDebug debug, const QskBoxHints& hints ) +{ + debug << hints.shape << hints.borderMetrics + << hints.borderColors << hints.gradient; + + return debug; +} + +#endif + +#include "moc_QskBoxHints.cpp" diff --git a/src/common/QskBoxHints.h b/src/common/QskBoxHints.h new file mode 100644 index 00000000..839b5b62 --- /dev/null +++ b/src/common/QskBoxHints.h @@ -0,0 +1,46 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the QSkinny License, Version 1.0 + *****************************************************************************/ + +#ifndef QSK_BOX_HINTS_H +#define QSK_BOX_HINTS_H + +#include "QskBoxBorderMetrics.h" +#include "QskBoxBorderColors.h" +#include "QskBoxShapeMetrics.h" +#include "QskGradient.h" + +class QSK_EXPORT QskBoxHints +{ + Q_GADGET + + Q_PROPERTY( QskBoxShapeMetrics shape MEMBER shape ) + Q_PROPERTY( QskBoxBorderMetrics borderMetrics MEMBER borderMetrics ) + Q_PROPERTY( QskBoxBorderColors borderColors MEMBER borderColors ) + Q_PROPERTY( QskGradient gradient MEMBER gradient ) + + public: + QskBoxHints(); + QskBoxHints( const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, + const QskBoxBorderColors&, const QskGradient& ); + + QskBoxHints toAbsolute( const QSizeF& ) const noexcept; + + QskBoxHints interpolated( + const QskBoxHints&, qreal value ) const noexcept; + + QskBoxShapeMetrics shape; + QskBoxBorderMetrics borderMetrics; + QskBoxBorderColors borderColors; + QskGradient gradient; +}; + +#ifndef QT_NO_DEBUG_STREAM + +class QDebug; +QSK_EXPORT QDebug operator<<( QDebug, const QskBoxHints& ); + +#endif + +#endif diff --git a/src/controls/QskSkinlet.cpp b/src/controls/QskSkinlet.cpp index 50e37d0e..8dda9f18 100644 --- a/src/controls/QskSkinlet.cpp +++ b/src/controls/QskSkinlet.cpp @@ -12,6 +12,7 @@ #include "QskBoxClipNode.h" #include "QskBoxNode.h" #include "QskBoxShapeMetrics.h" +#include "QskBoxHints.h" #include "QskColorFilter.h" #include "QskControl.h" #include "QskFunctions.h" @@ -368,6 +369,61 @@ QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable, boxRect, shape, borderMetrics, borderColors, fillGradient ); } +QSGNode* QskSkinlet::updateBoxNode( + const QskSkinnable* skinnable, QSGNode* node, const QRectF& rect, + const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& borderMetrics, + const QskBoxBorderColors& borderColors, const QskGradient& fillGradient ) +{ + return qskUpdateBoxNode( skinnable, node, + rect, shape, borderMetrics, borderColors, fillGradient ); +} + +QSGNode* QskSkinlet::updateBoxNode( const QskSkinnable* skinnable, + QSGNode* node, const QRectF& rect, const QskBoxHints& hints ) +{ + return qskUpdateBoxNode( skinnable, node, rect, + hints.shape, hints.borderMetrics, hints.borderColors, hints.gradient ); +} + +QSGNode* QskSkinlet::updateInterpolatedBoxNode( + const QskSkinnable* skinnable, QSGNode* node, const QRectF& rect, + QskAspect aspect1, QskAspect aspect2, qreal ratio ) +{ + QskBoxHints boxHints; + QRectF r; + + ratio = qBound( 0.0, ratio, 1.0 ); + + if ( qFuzzyIsNull( ratio ) ) + { + const auto margins = skinnable->marginHint( aspect1 ); + r = rect.marginsRemoved( margins ); + + boxHints = skinnable->boxHints( aspect1 ).toAbsolute( r.size() ); + } + else if ( qFuzzyCompare( ratio, 1.0 ) ) + { + const auto margins = skinnable->marginHint( aspect2 ); + r = rect.marginsRemoved( margins ); + + boxHints = skinnable->boxHints( aspect2 ).toAbsolute( r.size() ); + } + else + { + QskMargins margins = skinnable->marginHint( aspect1 ); + margins = margins.interpolated( skinnable->marginHint( aspect2 ), ratio ); + + r = rect.marginsRemoved( margins ); + + const auto boxHints1 = skinnable->boxHints( aspect1 ).toAbsolute( r.size() ); + const auto boxHints2 = skinnable->boxHints( aspect2 ).toAbsolute( r.size() ); + + boxHints = boxHints1.interpolated( boxHints2, ratio ); + } + + return QskSkinlet::updateBoxNode( skinnable, node, r, boxHints ); +} + QSGNode* QskSkinlet::updateArcNode( const QskSkinnable* skinnable, QSGNode* node, QskAspect::Subcontrol subControl ) const { diff --git a/src/controls/QskSkinlet.h b/src/controls/QskSkinlet.h index 4ec4f429..bf97a6ff 100644 --- a/src/controls/QskSkinlet.h +++ b/src/controls/QskSkinlet.h @@ -21,6 +21,10 @@ class QskGradient; class QskColorFilter; class QskGraphic; class QskTextOptions; +class QskBoxShapeMetrics; +class QskBoxBorderMetrics; +class QskBoxBorderColors; +class QskBoxHints; class QSGNode; @@ -73,6 +77,17 @@ class QSK_EXPORT QskSkinlet static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*, const QRectF&, const QskGradient&, QskAspect::Subcontrol ); + static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*, + const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, + const QskBoxBorderColors&, const QskGradient& ); + + static QSGNode* updateBoxNode( const QskSkinnable*, QSGNode*, + const QRectF&, const QskBoxHints& ); + + static QSGNode* updateInterpolatedBoxNode( + const QskSkinnable*, QSGNode*, const QRectF&, + QskAspect aspect1, QskAspect aspect2, qreal ratio ); + static QSGNode* updateArcNode( const QskSkinnable*, QSGNode*, const QRectF&, QskAspect::Subcontrol ); diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 6998e0ad..c17b7d29 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -22,6 +22,7 @@ #include "QskBoxShapeMetrics.h" #include "QskBoxBorderMetrics.h" #include "QskBoxBorderColors.h" +#include "QskBoxHints.h" #include "QskGradient.h" #include @@ -595,6 +596,13 @@ QskBoxBorderColors QskSkinnable::boxBorderColorsHint( this, aspect | QskAspect::Border, status ); } +QskBoxHints QskSkinnable::boxHints( QskAspect aspect ) const +{ + return QskBoxHints( + boxShapeHint( aspect ), boxBorderMetricsHint( aspect ), + boxBorderColorsHint( aspect ), gradientHint( aspect ) ); +} + bool QskSkinnable::setArcMetricsHint( const QskAspect aspect, const QskArcMetrics& arc ) { diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index d0b9a490..21f71e7f 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -28,6 +28,7 @@ class QskColorFilter; class QskBoxShapeMetrics; class QskBoxBorderMetrics; class QskBoxBorderColors; +class QskBoxHints; class QskGradient; class QskSkin; @@ -207,6 +208,8 @@ class QSK_EXPORT QskSkinnable bool resetBoxBorderColorsHint( QskAspect ); QskBoxBorderColors boxBorderColorsHint( QskAspect, QskSkinHintStatus* = nullptr ) const; + QskBoxHints boxHints( QskAspect ) const; + bool setArcMetricsHint( QskAspect, const QskArcMetrics& ); bool resetArcMetricsHint( QskAspect ); QskArcMetrics arcMetricsHint( QskAspect, QskSkinHintStatus* = nullptr ) const; diff --git a/src/src.pro b/src/src.pro index 3ed81c02..0cd2722b 100644 --- a/src/src.pro +++ b/src/src.pro @@ -17,6 +17,7 @@ HEADERS += \ common/QskBoxBorderColors.h \ common/QskBoxBorderMetrics.h \ common/QskBoxShapeMetrics.h \ + common/QskBoxHints.h \ common/QskFunctions.h \ common/QskGlobal.h \ common/QskGradient.h \ @@ -45,6 +46,7 @@ SOURCES += \ common/QskBoxBorderColors.cpp \ common/QskBoxBorderMetrics.cpp \ common/QskBoxShapeMetrics.cpp \ + common/QskBoxHints.cpp \ common/QskFunctions.cpp \ common/QskGradient.cpp \ common/QskGradientStop.cpp \