QskGradientDirection introduced - no more classes derived from

QskGradient
This commit is contained in:
Uwe Rathmann 2022-11-13 17:22:09 +01:00
parent a658a2a4e4
commit b140d1b30a
28 changed files with 691 additions and 905 deletions

View File

@ -10,9 +10,8 @@
#include <QskBoxShapeMetrics.h>
#include <QskHctColor.h>
#include <QskRgbValue.h>
#include <QskLinearGradient.h>
static inline void setStartStop( Box::FillType type, QskLinearGradient& gradient )
static inline void setStartStop( Box::FillType type, QskGradient& gradient )
{
qreal x1 = 0.0, y1 = 0.0, x2 = 0.0, y2 = 0.0;
@ -22,8 +21,7 @@ static inline void setStartStop( Box::FillType type, QskLinearGradient& gradient
if ( type != Box::Vertical )
x2 = 1.0;
gradient.setStart( x1, y1 );
gradient.setStop( x2, y2 );
gradient.setLinearDirection( x1, y1, x2, y2 );
}
Box::Box( QQuickItem* parentItem )
@ -46,7 +44,7 @@ void Box::setWebGradient( FillType type, QGradient::Preset preset, bool inverted
return;
}
QskLinearGradient gradient( preset );
QskGradient gradient( preset );
if ( type == Solid )
{
@ -72,7 +70,7 @@ void Box::setTonalGradient( FillType type, const QRgb base, bool inverted )
return;
}
QskLinearGradient gradient;
QskGradient gradient;
const QskHctColor htcColor( base );
if ( type == Solid )
@ -101,7 +99,7 @@ void Box::setTonalPalette( FillType type, const QRgb base )
return;
}
QskLinearGradient gradient;
QskGradient gradient;
setStartStop( type, gradient );
{
@ -211,7 +209,7 @@ void Box::setGradient( Qt::GlobalColor color )
void Box::setGradient( const QColor& color )
{
setPanelGradient( QskLinearGradient( color ) );
setPanelGradient( QskGradient( color ) );
}
void Box::setGradient( FillType fillType,
@ -237,7 +235,7 @@ void Box::setGradient( FillType fillType,
void Box::setGradient( FillType fillType, const QskGradientStops& stops )
{
QskLinearGradient gradient( stops );
QskGradient gradient( stops );
setStartStop( fillType, gradient );
setPanelGradient( gradient );

View File

@ -7,7 +7,6 @@
#include <SkinnyShortcut.h>
#include <QskAspect.h>
#include <QskLinearGradient.h>
#include <QskGraphicLabel.h>
#include <QskObjectCounter.h>
#include <QskShortcutMap.h>
@ -58,9 +57,11 @@ int main( int argc, char* argv[] )
SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts );
QskGradient gradient( QskRgb::DarkSlateGray, QskRgb::LightSlateGray );
gradient.setLinearDirection( 0.0, 0.0, 1.0, 1.0 );
QskSubWindowArea* area = new QskSubWindowArea();
area->setGradientHint( QskSubWindowArea::Panel,
QskLinearGradient( 0.0, 0.0, 1.0, 1.0, QskRgb::DarkSlateGray, QskRgb::LightSlateGray ) );
area->setGradientHint( QskSubWindowArea::Panel, gradient );
QRectF windowRect( 0, 0, 250, 250 );

View File

@ -26,7 +26,6 @@
#include <QskBoxShapeMetrics.h>
#include <QskBoxBorderMetrics.h>
#include <QskBoxBorderColors.h>
#include <QskLinearGradient.h>
#include <QskFunctions.h>
#include <QskShadowMetrics.h>
#include <QskSkinHintTableEditor.h>
@ -142,8 +141,11 @@ void Skin::initHints( const Palette& palette )
{
ed.setBoxShape( subControl, 6 );
QskLinearGradient normal( Qt::Vertical, 0xff6776ff, 0xff6100ff );
QskLinearGradient bright( Qt::Vertical, 0xffff7d34, 0xffff3122 );
QskGradient normal( 0xff6776ff, 0xff6100ff );
normal.setLinearDirection( Qt::Vertical );
QskGradient bright( 0xffff7d34, 0xffff3122 );
bright.setLinearDirection( Qt::Vertical );
if ( subControl == RoundedIcon::PalePanel )
{

View File

@ -14,7 +14,6 @@
#include <QskSkin.h>
#include <QskPlatform.h>
#include <QskRgbValue.h>
#include <QskLinearGradient.h>
namespace
{
@ -57,8 +56,10 @@ namespace
ed.setBoxBorderMetrics( Q::Knob, 2 );
ed.setStrutSize( Q::Knob, 30, 30 );
ed.setBoxShape( Q::Knob, 100, Qt::RelativeSize );
ed.setGradient( Q::Knob,
QskLinearGradient( 0.0, 0.0, 1.0, 1.0, rgb2, rgb1 ) );
QskGradient gradient( rgb2, rgb1 );
gradient.setLinearDirection( 0.0, 0.0, 1.0, 1.0 );
ed.setGradient( Q::Knob, gradient );
ed.setMetric( Q::Needle | QskAspect::Size, 2 );
ed.setMetric( Q::Needle | QskAspect::Margin, 10 );

View File

@ -10,9 +10,7 @@
#include <QskRgbValue.h>
#include <QskLinearBox.h>
#include <QskTabView.h>
#include <QskLinearGradient.h>
#include <QskRadialGradient.h>
#include <QskConicGradient.h>
#include <QskGradientDirection.h>
#include <SkinnyShortcut.h>
#include <SkinnyShapeFactory.h>
@ -65,7 +63,8 @@ namespace
shapeItem->setPath( path( SkinnyShapeFactory::Hexagon ) );
shapeItem->setPen( pen( QColorConstants::Svg::indigo ) );
QskLinearGradient gradient( 0.0, 0.0, 0.2, 0.5, QGradient::PhoenixStart );
QskGradient gradient( QGradient::PhoenixStart );
gradient.setLinearDirection( 0.0, 0.0, 0.2, 0.5 );
gradient.setSpread( QGradient::ReflectSpread );
shapeItem->setGradient( gradient );
@ -78,7 +77,8 @@ namespace
const QVector< QskGradientStop > stops =
{ { 0.5, QskRgb::RoyalBlue }, { 0.5, QskRgb::LemonChiffon } };
QskLinearGradient gradient( 0.0, 0.0, 0.05, 0.1, stops );
QskGradient gradient( stops );
gradient.setLinearDirection( 0.0, 0.0, 0.05, 0.1 );
gradient.setSpread( QGradient::RepeatSpread );
shapeItem->setGradient( gradient );
@ -90,7 +90,8 @@ namespace
const QVector< QskGradientStop > stops =
{ { 0.5, QskRgb::MediumVioletRed }, { 0.5, QskRgb::Navy } };
QskLinearGradient gradient( 0.5, 0.0, 0.5, 0.5, stops );
QskGradient gradient( stops );
gradient.setLinearDirection( 0.5, 0.0, 0.5, 0.5 );
shapeItem->setGradient( gradient );
}
@ -109,8 +110,8 @@ namespace
shapeItem->setPath( path( SkinnyShapeFactory::Rectangle ) );
shapeItem->setPen( pen( QColorConstants::Svg::indigo ) );
QskRadialGradient gradient;
gradient.setStops( QskRgb::LightYellow, QskRgb::MidnightBlue );
QskGradient gradient( QskRgb::LightYellow, QskRgb::MidnightBlue );
gradient.setRadialDirection( QskRadialDirection() );
gradient.setSpread( QGradient::PadSpread );
shapeItem->setGradient( gradient );
@ -134,7 +135,8 @@ namespace
stops += QskGradientStop( 0.8, Qt::darkCyan );
stops += QskGradientStop( 1.0, Qt::darkCyan );
QskRadialGradient gradient( stops );
QskGradient gradient( stops );
gradient.setRadialDirection();
gradient.setSpread( QGradient::PadSpread );
shapeItem->setGradient( gradient );
@ -145,7 +147,8 @@ namespace
shapeItem->setPath( path( SkinnyShapeFactory::Rectangle ) );
shapeItem->setPen( pen( QskRgb::Indigo ) );
QskRadialGradient gradient( 0.5, 0.7, 0.25, QGradient::LilyMeadow );
QskGradient gradient( QGradient::LilyMeadow );
gradient.setRadialDirection( QskRadialDirection( 0.5, 0.7, 0.25 ) );
gradient.setSpread( QGradient::RepeatSpread );
shapeItem->setGradient( gradient );
@ -156,7 +159,8 @@ namespace
shapeItem->setPath( path( SkinnyShapeFactory::Rectangle ) );
shapeItem->setPen( pen( QskRgb::Indigo ) );
QskRadialGradient gradient( 0.6, 0.4, 0.1, Qt::red, Qt::blue );
QskGradient gradient( Qt::red, Qt::blue );
gradient.setRadialDirection( 0.6, 0.4, 0.1 );
gradient.setSpread( QGradient::ReflectSpread );
shapeItem->setGradient( gradient );
@ -175,9 +179,9 @@ namespace
shapeItem->setPath( path( SkinnyShapeFactory::Ellipse ) );
QskConicGradient gradient( 0.5, 0.5, 30.0, 60.0 );
QskGradient gradient( QGradient::JuicyPeach );
gradient.setConicDirection( 0.5, 0.5, 30.0, 60.0 );
gradient.setSpread( QGradient::ReflectSpread );
gradient.setStops( QGradient::JuicyPeach );
shapeItem->setGradient( gradient );
}
@ -186,9 +190,9 @@ namespace
shapeItem->setPath( path( SkinnyShapeFactory::TriangleUp ) );
QskConicGradient gradient( 0.5, 0.5, 30.0, 60.0 );
QskGradient gradient( QGradient::WinterNeva );
gradient.setConicDirection( 0.5, 0.5, 30.0, 60.0 );
gradient.setSpread( QGradient::RepeatSpread );
gradient.setStops( QGradient::WinterNeva );
shapeItem->setGradient( gradient );
}
@ -197,8 +201,8 @@ namespace
shapeItem->setPath( path( SkinnyShapeFactory::Arc ) );
QskConicGradient gradient( 0.5, 0.5, 300.0, -240.0 );
gradient.setStops( QGradient::SpikyNaga );
QskGradient gradient( QGradient::SpikyNaga );
gradient.setConicDirection( 0.5, 0.5, 300.0, -240.0 );
shapeItem->setGradient( gradient );
}
@ -207,8 +211,8 @@ namespace
shapeItem->setPath( path( SkinnyShapeFactory::Diamond ) );
QskConicGradient gradient( 0.5, 0.5, 45.0, 180.0 );
gradient.setStops( QGradient::FabledSunset );
QskGradient gradient( QGradient::FabledSunset );
gradient.setConicDirection( 0.5, 0.5, 45.0, 180.0 );
gradient.setSpread( QGradient::ReflectSpread );
shapeItem->setGradient( gradient );

View File

@ -39,7 +39,6 @@
#include <QskBoxBorderMetrics.h>
#include <QskBoxShapeMetrics.h>
#include <QskPlatform.h>
#include <QskLinearGradient.h>
#include <QskMargins.h>
#include <QskNamespace.h>
#include <QskRgbValue.h>
@ -188,7 +187,8 @@ void Editor::setButton( QskAspect aspect, PanelStyle style, qreal border )
#endif
QskBoxBorderColors borderColors;
QskLinearGradient gradient( Qt::Vertical );
QskGradient gradient;
gradient.setLinearDirection( Qt::Vertical );
switch ( style )
{

View File

@ -1,52 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskConicGradient.h"
QskConicGradient::QskConicGradient( qreal cx, qreal cy, qreal startAngle,
const QColor& color1, const QColor& color2 )
: QskConicGradient( cx, cy, startAngle )
{
setStops( color1, color2 );
}
QskConicGradient::QskConicGradient( qreal cx, qreal cy,
qreal startAngle, QGradient::Preset preset )
: QskConicGradient( cx, cy, startAngle )
{
setStops( preset );
}
QskConicGradient::QskConicGradient( qreal cx, qreal cy,
qreal startAngle, const QVector< QskGradientStop >& stops )
: QskConicGradient( cx, cy, startAngle )
{
setStops( stops );
}
inline void QskConicGradient::setCenter( const QPointF& center ) noexcept
{
m_values[0] = center.x();
m_values[1] = center.y();
}
inline void QskConicGradient::setCenter( qreal x, qreal y ) noexcept
{
m_values[0] = x;
m_values[1] = y;
}
inline void QskConicGradient::setStartAngle( qreal degrees ) noexcept
{
m_values[2] = degrees;
}
inline void QskConicGradient::setSpanAngle( qreal degrees ) noexcept
{
m_values[3] = qBound( -360.0, degrees, 360.0 );
}
#include "moc_QskConicGradient.cpp"

View File

@ -1,110 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#ifndef QSK_CONIC_GRADIENT_H
#define QSK_CONIC_GRADIENT_H
#include "QskGradient.h"
class QSK_EXPORT QskConicGradient : public QskGradient
{
Q_GADGET
Q_PROPERTY( QPointF center READ center WRITE setCenter )
Q_PROPERTY( qreal startAngle READ startAngle WRITE setStartAngle )
Q_PROPERTY( qreal spanAngle READ spanAngle WRITE setSpanAngle )
public:
// counter-clockwise
QskConicGradient() noexcept;
QskConicGradient( const QColor&, const QColor& );
QskConicGradient( QGradient::Preset );
QskConicGradient( const QVector< QskGradientStop >& );
QskConicGradient( const QPointF&,
qreal startAngle = 0.0, qreal spanAngle = 360.0 ) noexcept;
QskConicGradient( qreal cx, qreal cy,
qreal startAngle = 0.0, qreal spanAngle = 360.0 ) noexcept;
QskConicGradient( qreal cx, qreal cy, qreal startAngle,
const QColor&, const QColor& );
QskConicGradient( const QPointF&, qreal startAngle,
const QColor&, const QColor& );
QskConicGradient( qreal cx, qreal cy, qreal startAngle, QGradient::Preset );
QskConicGradient( const QPointF&, qreal startAngle, QGradient::Preset );
QskConicGradient( qreal cx, qreal cy, qreal startAngle,
const QVector< QskGradientStop >& );
QskConicGradient( const QPointF&, qreal startAngle,
const QVector< QskGradientStop >& );
QPointF center() const noexcept;
void setCenter(const QPointF& center) noexcept;
void setCenter(qreal x, qreal y) noexcept;
qreal startAngle() const noexcept;
void setStartAngle( qreal ) noexcept;
qreal spanAngle() const noexcept;
void setSpanAngle( qreal ) noexcept;
};
inline QskConicGradient::QskConicGradient() noexcept
: QskConicGradient( Conic, 0.5, 0.5, 0.0, 360.0 )
{
}
inline QskConicGradient::QskConicGradient(
const QPointF& center, qreal startAngle, qreal spanAngle ) noexcept
: QskConicGradient( center.x(), center.y(), startAngle, spanAngle )
{
}
inline QskConicGradient::QskConicGradient(
qreal cx, qreal cy, qreal startAngle, qreal spanAngle ) noexcept
: QskGradient( Conic, cx, cy, startAngle, spanAngle )
{
}
inline QskConicGradient::QskConicGradient( const QPointF& center,
qreal startAngle, const QColor& color1, const QColor& color2 )
: QskConicGradient( center.x(), center.y(), startAngle, color1, color2 )
{
}
inline QskConicGradient::QskConicGradient( const QPointF& center,
qreal startAngle, const QVector< QskGradientStop >& stops )
: QskConicGradient( center.x(), center.y(), startAngle, stops )
{
}
inline QskConicGradient::QskConicGradient( const QPointF& center,
qreal startAngle, QGradient::Preset preset )
: QskConicGradient( center.x(), center.y(), startAngle, preset )
{
}
inline QPointF QskConicGradient::center() const noexcept
{
return QPointF( m_values[0], m_values[1] );
}
inline qreal QskConicGradient::startAngle() const noexcept
{
return m_values[2];
}
inline qreal QskConicGradient::spanAngle() const noexcept
{
return m_values[3];
}
#endif

View File

@ -5,6 +5,7 @@
#include "QskGradient.h"
#include "QskRgbValue.h"
#include "QskGradientDirection.h"
#include <qvariant.h>
@ -386,7 +387,104 @@ QskHashValue QskGradient::hash( QskHashValue seed ) const
return hash;
}
void QskGradient::setLinear( const QVector< qreal >& params )
void QskGradient::setLinearDirection( Qt::Orientation orientation )
{
setLinearDirection( QskLinearDirection( orientation ) );
}
void QskGradient::setLinearDirection( qreal x1, qreal y1, qreal x2, qreal y2 )
{
setLinearDirection( QskLinearDirection( x1, y1, x2, y2 ) );
}
void QskGradient::setLinearDirection( const QskLinearDirection& direction )
{
m_type = Linear;
m_values[0] = direction.x1();
m_values[1] = direction.y1();
m_values[2] = direction.x2();
m_values[3] = direction.y2();
}
QskLinearDirection QskGradient::linearDirection() const
{
Q_ASSERT( m_type == Linear );
if ( m_type != Linear )
return QskLinearDirection();
return QskLinearDirection( m_values[0], m_values[1], m_values[2], m_values[3] );
}
void QskGradient::setRadialDirection()
{
setRadialDirection( QskRadialDirection() );
}
void QskGradient::setRadialDirection( const qreal x, qreal y, qreal radius )
{
setRadialDirection( QskRadialDirection( x, y, radius ) );
}
void QskGradient::setRadialDirection( const QskRadialDirection& direction )
{
m_type = Radial;
m_values[0] = direction.center().x();
m_values[1] = direction.center().y();
m_values[2] = direction.radius();
m_values[3] = 0.0;
}
QskRadialDirection QskGradient::radialDirection() const
{
Q_ASSERT( m_type == Radial );
if ( m_type != Radial )
return QskRadialDirection();
return QskRadialDirection( m_values[0], m_values[1], m_values[2] );
}
void QskGradient::setConicDirection( qreal x, qreal y )
{
setConicDirection( QskConicDirection( x, y ) );
}
void QskGradient::setConicDirection( qreal x, qreal y,
qreal startAngle, qreal spanAngle )
{
setConicDirection( QskConicDirection( x, y, startAngle, spanAngle ) );
}
void QskGradient::setConicDirection( const QskConicDirection& direction )
{
m_type = Conic;
m_values[0] = direction.center().x();
m_values[1] = direction.center().y();
m_values[2] = direction.startAngle();
m_values[3] = direction.spanAngle();
}
QskConicDirection QskGradient::conicDirection() const
{
Q_ASSERT( m_type == Conic );
if ( m_type != Conic )
return QskConicDirection();
return QskConicDirection( m_values[0], m_values[1], m_values[2], m_values[3] );
}
void QskGradient::resetDirection()
{
m_type = Stops;
m_values[0] = m_values[1] = m_values[2] = m_values[3] = 0.0;
}
void QskGradient::setLinearAsList( const QVector< qreal >& params )
{
Q_ASSERT( params.size() == 4 );
@ -398,13 +496,13 @@ void QskGradient::setLinear( const QVector< qreal >& params )
m_values[3] = params[3];
}
QVector< qreal > QskGradient::linear() const
QVector< qreal > QskGradient::linearAsList() const
{
Q_ASSERT( m_type == Linear );
return { m_values[0], m_values[1], m_values[2], m_values[3] };
}
void QskGradient::setRadial( const QVector< qreal >& params )
void QskGradient::setRadialAsList( const QVector< qreal >& params )
{
Q_ASSERT( params.size() == 3 );
@ -416,17 +514,17 @@ void QskGradient::setRadial( const QVector< qreal >& params )
m_values[3] = 0.0;
}
QVector< qreal > QskGradient::radial() const
QVector< qreal > QskGradient::radialAsList() const
{
Q_ASSERT( m_type == Radial );
return { m_values[0], m_values[1], m_values[2] };
}
void QskGradient::setConic( const QVector< qreal >& params )
void QskGradient::setConicAsList( const QVector< qreal >& params )
{
Q_ASSERT( params.size() >= 2 && params.size() <= 4 );
m_type = Linear;
m_type = Conic;
m_values[0] = params[0];
m_values[1] = params[1];
@ -442,52 +540,12 @@ void QskGradient::setConic( const QVector< qreal >& params )
m_values[2] = 360.0;
}
QVector< qreal > QskGradient::conic() const
QVector< qreal > QskGradient::conicAsList() const
{
Q_ASSERT( m_type == Conic );
return { m_values[0], m_values[1], m_values[2], m_values[3] };
}
#include "QskLinearGradient.h"
#include "QskRadialGradient.h"
#include "QskConicGradient.h"
QskLinearGradient& QskGradient::asLinearGradient()
{
assert( m_type == QskGradient::Linear );
return *reinterpret_cast< QskLinearGradient* >( this );
}
const QskLinearGradient& QskGradient::asLinearGradient() const
{
assert( m_type == QskGradient::Linear );
return *reinterpret_cast< const QskLinearGradient* >( this );
}
QskRadialGradient& QskGradient::asRadialGradient()
{
assert( m_type == QskGradient::Radial );
return *reinterpret_cast< QskRadialGradient* >( this );
}
const QskRadialGradient& QskGradient::asRadialGradient() const
{
assert( m_type == QskGradient::Radial );
return *reinterpret_cast< const QskRadialGradient* >( this );
}
QskConicGradient& QskGradient::asConicGradient()
{
assert( m_type == QskGradient::Conic );
return *reinterpret_cast< QskConicGradient* >( this );
}
const QskConicGradient& QskGradient::asConicGradient() const
{
assert( m_type == QskGradient::Conic );
return *reinterpret_cast< const QskConicGradient* >( this );
}
#ifndef QT_NO_DEBUG_STREAM
#include <qdebug.h>
@ -505,9 +563,9 @@ QDebug operator<<( QDebug debug, const QskGradient& gradient )
{
debug << "L(";
const auto& g = gradient.asLinearGradient();
debug << g.start().x() << "," << g.start().y()
<< "," << g.stop().x() << "," << g.stop().y() << ")";
const auto dir = gradient.linearDirection();
debug << dir.start().x() << "," << dir.start().y()
<< "," << dir.stop().x() << "," << dir.stop().y() << ")";
break;
}
@ -516,10 +574,10 @@ QDebug operator<<( QDebug debug, const QskGradient& gradient )
{
debug << "R(";
const auto& g = gradient.asRadialGradient();
const auto dir = gradient.radialDirection();
debug << g.center().x() << "," << g.center().y()
<< "," << g.radius() << ")";
debug << dir.center().x() << "," << dir.center().y()
<< "," << dir.radius() << ")";
break;
}
@ -528,10 +586,10 @@ QDebug operator<<( QDebug debug, const QskGradient& gradient )
{
debug << "C(";
const auto& g = gradient.asConicGradient();
const auto dir = gradient.conicDirection();
debug << g.center().x() << "," << g.center().y()
<< ",[" << g.startAngle() << "," << g.spanAngle() << "])";
debug << dir.center().x() << "," << dir.center().y()
<< ",[" << dir.startAngle() << "," << dir.spanAngle() << "])";
break;
}

View File

@ -11,9 +11,9 @@
#include <qbrush.h>
#include <qmetatype.h>
class QskLinearGradient;
class QskRadialGradient;
class QskConicGradient;
class QskLinearDirection;
class QskRadialDirection;
class QskConicDirection;
class QVariant;
@ -28,10 +28,6 @@ class QSK_EXPORT QskGradient
Q_PROPERTY( Type type READ type )
Q_PROPERTY( QVector< qreal > linear READ linear WRITE setLinear )
Q_PROPERTY( QVector< qreal > conic READ linear WRITE setConic )
Q_PROPERTY( QVector< qreal > radial READ radial WRITE setRadial )
Q_PROPERTY( QVector< QskGradientStop > stops READ stops WRITE setStops )
Q_PROPERTY( bool valid READ isValid )
@ -71,6 +67,24 @@ class QSK_EXPORT QskGradient
QskGradient::Type type() const noexcept;
void setLinearDirection( const QskLinearDirection& );
void setLinearDirection( qreal, qreal, qreal, qreal );
void setLinearDirection( Qt::Orientation );
QskLinearDirection linearDirection() const;
void setRadialDirection( const QskRadialDirection& );
void setRadialDirection( const qreal x, qreal y, qreal radius );
void setRadialDirection();
QskRadialDirection radialDirection() const;
void setConicDirection( qreal, qreal );
void setConicDirection( qreal, qreal, qreal, qreal = 360.0 );
void setConicDirection( const QskConicDirection& );
QskConicDirection conicDirection() const;
void resetDirection();
bool isValid() const noexcept;
bool isMonochrome() const noexcept;
bool isVisible() const noexcept;
@ -112,35 +126,32 @@ class QSK_EXPORT QskGradient
int stepCount() const noexcept;
QskLinearGradient& asLinearGradient();
const QskLinearGradient& asLinearGradient() const;
QskRadialGradient& asRadialGradient();
const QskRadialGradient& asRadialGradient() const;
QskConicGradient& asConicGradient();
const QskConicGradient& asConicGradient() const;
private:
friend class QskLinearGradient;
friend class QskRadialGradient;
friend class QskConicGradient;
QskGradient( Type ) noexcept;
QskGradient( Type, qreal, qreal, qreal, qreal ) noexcept;
void updateStatusBits() const;
private:
// for QML
QVector< qreal > linear() const;
void setLinear( const QVector< qreal >& );
QVector< qreal > radial() const;
void setRadial( const QVector< qreal >& );
#if 1
/*
Couldn't find a way how to assign a struct to another struct
that is used as proprty from QML without creating extra QObjects.
So for the moment we are using lists, that are more
error prone and less intuitive. Let's see if some day we will have
the QML system being capable of this. TODO ...
*/
Q_PROPERTY( QVector< qreal > linear READ linearAsList WRITE setLinearAsList )
Q_PROPERTY( QVector< qreal > conic READ conicAsList WRITE setConicAsList )
Q_PROPERTY( QVector< qreal > radial READ radialAsList WRITE setRadialAsList )
QVector< qreal > conic() const;
void setConic( const QVector< qreal >& );
QVector< qreal > linearAsList() const;
void setLinearAsList( const QVector< qreal >& );
QVector< qreal > radialAsList() const;
void setRadialAsList( const QVector< qreal >& );
QVector< qreal > conicAsList() const;
void setConicAsList( const QVector< qreal >& );
#endif
private:
QVector< QskGradientStop > m_stops;
@ -163,18 +174,6 @@ class QSK_EXPORT QskGradient
Q_DECLARE_METATYPE( QskGradient )
inline QskGradient::QskGradient( QskGradient::Type type ) noexcept
: m_type( type )
{
}
inline QskGradient::QskGradient( QskGradient::Type type,
qreal v1, qreal v2, qreal v3, qreal v4 ) noexcept
: m_values{ v1, v2, v3, v4 }
, m_type( type )
{
}
inline QskGradient::QskGradient( Qt::GlobalColor color )
: QskGradient( QColor( color ) )
{

View File

@ -0,0 +1,121 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskGradientDirection.h"
// -- QskLinearDirection
void QskLinearDirection::setOrientation( Qt::Orientation orientation ) noexcept
{
setStart( 0.0, 0.0 );
if ( orientation == Qt::Vertical )
setStop( 0.0, 1.0 );
else
setStop( 1.0, 0.0 );
}
void QskLinearDirection::setStart( const QPointF& pos ) noexcept
{
m_x1 = pos.x();
m_y1 = pos.y();
}
void QskLinearDirection::setStart( qreal x, qreal y ) noexcept
{
m_x1 = x;
m_y1 = y;
}
void QskLinearDirection::setStop( const QPointF& pos ) noexcept
{
m_x2 = pos.x();
m_y2 = pos.y();
}
void QskLinearDirection::setStop( qreal x, qreal y ) noexcept
{
m_x2 = x;
m_y2 = y;
}
void QskLinearDirection::setX1( qreal x ) noexcept
{
m_x1 = x;
}
void QskLinearDirection::setY1( qreal y ) noexcept
{
m_y1 = y;
}
void QskLinearDirection::setX2( qreal x ) noexcept
{
m_x2 = x;
}
void QskLinearDirection::setY2( qreal y ) noexcept
{
m_y2 = y;
}
void QskLinearDirection::setInterval( Qt::Orientation orientation, qreal from, qreal to )
{
if ( orientation == Qt::Vertical )
{
m_y1 = from;
m_y2 = to;
}
else
{
m_x1 = from;
m_x2 = to;
}
}
// -- QskConicDirection
void QskConicDirection::setCenter( const QPointF& center ) noexcept
{
m_x = center.x();
m_y = center.y();
}
void QskConicDirection::setCenter( qreal x, qreal y ) noexcept
{
m_x = x;
m_y = y;
}
void QskConicDirection::setStartAngle( qreal degrees ) noexcept
{
m_startAngle = degrees;
}
void QskConicDirection::setSpanAngle( qreal degrees ) noexcept
{
m_spanAngle = qBound( -360.0, degrees, 360.0 );
}
// -- QskRadialDirection
void QskRadialDirection::setCenter( const QPointF& center ) noexcept
{
m_x = center.x();
m_y = center.y();
}
void QskRadialDirection::setCenter( qreal x, qreal y ) noexcept
{
m_x = x;
m_y = y;
}
void QskRadialDirection::setRadius( qreal radius ) noexcept
{
m_radius = radius;
}
#include "moc_QskGradientDirection.cpp"

View File

@ -0,0 +1,269 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#ifndef QSK_GRDIENT_DIRECTION_H
#define QSK_GRDIENT_DIRECTION_H
#include "QskGlobal.h"
#include <qmetatype.h>
#include <qpoint.h>
class QSK_EXPORT QskLinearDirection
{
Q_GADGET
Q_PROPERTY( qreal x1 READ x1 WRITE setX1 )
Q_PROPERTY( qreal y1 READ y1 WRITE setY1 )
Q_PROPERTY( qreal x2 READ x2 WRITE setX2 )
Q_PROPERTY( qreal y2 READ y2 WRITE setY2 )
public:
constexpr QskLinearDirection() noexcept = default;
constexpr QskLinearDirection( Qt::Orientation ) noexcept;
constexpr QskLinearDirection( const QPointF&, const QPointF& ) noexcept;
constexpr QskLinearDirection( qreal x1, qreal y1, qreal x2, qreal y2 ) noexcept;
void setStart( const QPointF& ) noexcept;
void setStart( qreal x, qreal y ) noexcept;
void setStop(const QPointF& ) noexcept;
void setStop( qreal x, qreal y ) noexcept;
void setInterval( Qt::Orientation, qreal, qreal );
void setOrientation( Qt::Orientation ) noexcept;
constexpr bool isOriented( Qt::Orientation ) const noexcept;
constexpr bool isHorizontal() const noexcept;
constexpr bool isVertical() const noexcept;
constexpr bool isTilted() const noexcept;
constexpr QPointF start() const noexcept;
constexpr QPointF stop() const noexcept;
constexpr qreal x1() const noexcept;
void setX1( qreal ) noexcept;
constexpr qreal y1() const noexcept;
void setY1( qreal ) noexcept;
constexpr qreal x2() const noexcept;
void setX2( qreal ) noexcept;
constexpr qreal y2() const noexcept;
void setY2( qreal ) noexcept;
private:
qreal m_x1 = 0.0;
qreal m_y1 = 0.0;
qreal m_x2 = 0.0;
qreal m_y2 = 1.0;
};
class QSK_EXPORT QskConicDirection
{
Q_GADGET
Q_PROPERTY( QPointF center READ center WRITE setCenter )
Q_PROPERTY( qreal startAngle READ startAngle WRITE setStartAngle )
Q_PROPERTY( qreal spanAngle READ spanAngle WRITE setSpanAngle )
public:
// counter-clockwise
constexpr QskConicDirection() noexcept = default;
constexpr QskConicDirection( qreal x, qreal y, qreal startAngle = 0.0 ) noexcept;
constexpr QskConicDirection( qreal x, qreal y, qreal startAngle, qreal spanAngle ) noexcept;
constexpr QskConicDirection( const QPointF&, qreal startAngle = 0.0 ) noexcept;
constexpr QskConicDirection( const QPointF&, qreal startAngle, qreal spanAngle ) noexcept;
constexpr QPointF center() const noexcept;
void setCenter(const QPointF& center) noexcept;
void setCenter(qreal x, qreal y) noexcept;
constexpr qreal startAngle() const noexcept;
void setStartAngle( qreal ) noexcept;
constexpr qreal spanAngle() const noexcept;
void setSpanAngle( qreal ) noexcept;
private:
qreal m_x = 0.5;
qreal m_y = 0.5;
qreal m_startAngle = 0.0;
qreal m_spanAngle = 360.0;
};
class QSK_EXPORT QskRadialDirection
{
Q_GADGET
Q_PROPERTY( QPointF center READ center WRITE setCenter )
Q_PROPERTY( qreal radius READ radius WRITE setRadius )
public:
constexpr QskRadialDirection() noexcept = default;
constexpr QskRadialDirection( const QPointF& center, qreal radius ) noexcept;
constexpr QskRadialDirection( qreal cx, qreal cy, qreal radius ) noexcept;
constexpr QPointF center() const noexcept;
void setCenter(const QPointF& center) noexcept;
void setCenter(qreal x, qreal y) noexcept;
constexpr qreal radius() const noexcept;
void setRadius( qreal radius ) noexcept;
private:
qreal m_x = 0.5;
qreal m_y = 0.5;
qreal m_radius = 0.5;
};
inline constexpr QskLinearDirection::QskLinearDirection(
Qt::Orientation orientation ) noexcept
: m_x2( ( orientation == Qt::Vertical ) ? 0.0 : 1.0 )
, m_y2( ( orientation == Qt::Vertical ) ? 1.0 : 0.0 )
{
}
inline constexpr QskLinearDirection::QskLinearDirection(
const QPointF& start, const QPointF& stop ) noexcept
: QskLinearDirection( start.x(), start.y(), stop.x(), stop.y() )
{
}
inline constexpr QskLinearDirection::QskLinearDirection(
qreal x1, qreal y1, qreal x2, qreal y2 ) noexcept
: m_x1( x1 )
, m_y1( y1 )
, m_x2( x2 )
, m_y2( y2 )
{
}
inline constexpr qreal QskLinearDirection::x1() const noexcept
{
return m_x1;
}
inline constexpr qreal QskLinearDirection::y1() const noexcept
{
return m_y1;
}
inline constexpr qreal QskLinearDirection::x2() const noexcept
{
return m_x2;
}
inline constexpr qreal QskLinearDirection::y2() const noexcept
{
return m_y2;
}
inline constexpr QPointF QskLinearDirection::start() const noexcept
{
return QPointF( m_x1, m_y1 );
}
inline constexpr QPointF QskLinearDirection::stop() const noexcept
{
return QPointF( m_x2, m_y2 );
}
inline constexpr bool QskLinearDirection::isOriented(
Qt::Orientation orientation ) const noexcept
{
return ( orientation == Qt::Horizontal )
? isHorizontal() : isVertical();
}
inline constexpr bool QskLinearDirection::isHorizontal() const noexcept
{
return !isVertical() && ( m_y1 == m_y2 );
}
inline constexpr bool QskLinearDirection::isVertical() const noexcept
{
return m_x1 == m_x2;
}
inline constexpr bool QskLinearDirection::isTilted() const noexcept
{
return ( m_x1 != m_x2 ) && ( m_y1 != m_y2 );
}
inline constexpr QskConicDirection::QskConicDirection(
qreal x, qreal y, qreal startAngle ) noexcept
: QskConicDirection( x, y, startAngle, 360.0 )
{
}
inline constexpr QskConicDirection::QskConicDirection(
qreal x, qreal y, qreal startAngle, qreal spanAngle ) noexcept
: m_x( x )
, m_y( y )
, m_startAngle( startAngle )
, m_spanAngle( spanAngle )
{
}
inline constexpr QskConicDirection::QskConicDirection(
const QPointF& pos, qreal startAngle ) noexcept
: QskConicDirection( pos.x(), pos.y(), startAngle )
{
}
inline constexpr QskConicDirection::QskConicDirection(
const QPointF& pos, qreal startAngle, qreal spanAngle ) noexcept
: QskConicDirection( pos.x(), pos.y(), startAngle, spanAngle )
{
}
inline constexpr QPointF QskConicDirection::center() const noexcept
{
return QPointF( m_x, m_y );
}
inline constexpr qreal QskConicDirection::startAngle() const noexcept
{
return m_startAngle;
}
inline constexpr qreal QskConicDirection::spanAngle() const noexcept
{
return m_spanAngle;
}
inline constexpr QskRadialDirection::QskRadialDirection(
qreal x, qreal y, qreal radius ) noexcept
: m_x( x )
, m_y( y )
, m_radius( radius )
{
}
inline constexpr QskRadialDirection::QskRadialDirection(
const QPointF& center, qreal radius ) noexcept
: QskRadialDirection( center.x(), center.y(), radius )
{
}
inline constexpr QPointF QskRadialDirection::center() const noexcept
{
return QPointF( m_x, m_y );
}
inline constexpr qreal QskRadialDirection::radius() const noexcept
{
return m_radius;
}
#endif

View File

@ -1,155 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskLinearGradient.h"
QskLinearGradient::QskLinearGradient( Qt::Orientation orientation ) noexcept
: QskGradient( QskGradient::Linear )
{
setOrientation( orientation );
}
QskLinearGradient::QskLinearGradient( const QColor& color )
: QskLinearGradient( Qt::Vertical )
{
setStops( color );
}
QskLinearGradient::QskLinearGradient(
const QColor& startColor, const QColor& stopColor )
: QskLinearGradient( Qt::Vertical )
{
setStops( startColor, stopColor );
}
QskLinearGradient::QskLinearGradient( QGradient::Preset preset )
: QskLinearGradient( Qt::Vertical )
{
setStops( preset );
}
QskLinearGradient::QskLinearGradient( const QVector< QskGradientStop >& stops )
: QskLinearGradient( Qt::Vertical )
{
setStops( stops );
}
QskLinearGradient::QskLinearGradient( Qt::Orientation orientation, const QColor& color )
: QskLinearGradient( orientation )
{
setStops( color );
}
QskLinearGradient::QskLinearGradient( Qt::Orientation orientation,
const QColor& startColor, const QColor& stopColor )
: QskLinearGradient( orientation )
{
setStops( startColor, stopColor );
}
QskLinearGradient::QskLinearGradient(
Qt::Orientation orientation, QGradient::Preset preset )
: QskLinearGradient( orientation )
{
setStops( preset );
}
QskLinearGradient::QskLinearGradient(
Qt::Orientation orientation, const QVector< QskGradientStop >& stops )
: QskLinearGradient( orientation )
{
setStops( stops );
}
void QskLinearGradient::setOrientation( Qt::Orientation orientation ) noexcept
{
setStart( 0.0, 0.0 );
if ( orientation == Qt::Vertical )
setStop( 0.0, 1.0 );
else
setStop( 1.0, 0.0 );
}
QskLinearGradient::QskLinearGradient( qreal x1, qreal y1,
qreal x2, qreal y2, const QColor& color1, const QColor& color2 )
: QskLinearGradient( x1, y1, x2, y2 )
{
setStops( color1, color2 );
}
QskLinearGradient::QskLinearGradient( qreal x1, qreal y1,
qreal x2, qreal y2, QGradient::Preset preset )
: QskLinearGradient( x1, y1, x2, y2 )
{
setStops( preset );
}
QskLinearGradient::QskLinearGradient( qreal x1, qreal y1,
qreal x2, qreal y2, const QVector< QskGradientStop >& stops )
: QskLinearGradient( x1, y1, x2, y2 )
{
setStops( stops );
}
void QskLinearGradient::setStart( const QPointF& pos ) noexcept
{
m_values[0] = pos.x();
m_values[1] = pos.y();
}
void QskLinearGradient::setStart( qreal x, qreal y ) noexcept
{
m_values[0] = x;
m_values[1] = y;
}
void QskLinearGradient::setStop( const QPointF& pos ) noexcept
{
m_values[2] = pos.x();
m_values[3] = pos.y();
}
void QskLinearGradient::setStop( qreal x, qreal y ) noexcept
{
m_values[2] = x;
m_values[3] = y;
}
void QskLinearGradient::setX1( qreal x ) noexcept
{
m_values[0] = x;
}
void QskLinearGradient::setY1( qreal y ) noexcept
{
m_values[1] = y;
}
void QskLinearGradient::setX2( qreal x ) noexcept
{
m_values[2] = x;
}
void QskLinearGradient::setY2( qreal y ) noexcept
{
m_values[3] = y;
}
void QskLinearGradient::setInterval( Qt::Orientation orientation, qreal from, qreal to )
{
if ( orientation == Qt::Vertical )
{
m_values[1] = from;
m_values[3] = to;
}
else
{
m_values[0] = from;
m_values[2] = to;
}
}
#include "moc_QskLinearGradient.cpp"

View File

@ -1,200 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#ifndef QSK_LINEAR_GRADIENT_H
#define QSK_LINEAR_GRADIENT_H
#include "QskGradient.h"
class QSK_EXPORT QskLinearGradient : public QskGradient
{
Q_GADGET
Q_PROPERTY( qreal x1 READ x1 WRITE setX1 )
Q_PROPERTY( qreal y1 READ y1 WRITE setY1 )
Q_PROPERTY( qreal x2 READ x2 WRITE setX2 )
Q_PROPERTY( qreal y2 READ y2 WRITE setY2 )
public:
QskLinearGradient() noexcept;
QskLinearGradient( Qt::GlobalColor );
QskLinearGradient( QRgb );
QskLinearGradient( const QColor& );
QskLinearGradient( const QColor&, const QColor& );
QskLinearGradient( QGradient::Preset );
QskLinearGradient( const QVector< QskGradientStop >& );
QskLinearGradient( Qt::Orientation ) noexcept;
QskLinearGradient( Qt::Orientation, Qt::GlobalColor );
QskLinearGradient( Qt::Orientation, QRgb );
QskLinearGradient( Qt::Orientation, const QColor& );
QskLinearGradient( Qt::Orientation, const QColor&, const QColor& );
QskLinearGradient( Qt::Orientation, QGradient::Preset );
QskLinearGradient( Qt::Orientation, const QVector< QskGradientStop >& );
QskLinearGradient( const QPointF&, const QPointF& ) noexcept;
QskLinearGradient( qreal x1, qreal y1, qreal x2, qreal y2 ) noexcept;
QskLinearGradient( const QPointF&, const QPointF&,
const QColor&, const QColor& );
QskLinearGradient( qreal x1, qreal y1,
qreal x2, qreal y2, const QColor&, const QColor& );
QskLinearGradient( const QPointF&, const QPointF&, QGradient::Preset );
QskLinearGradient( qreal x1, qreal y1,
qreal x2, qreal y2, QGradient::Preset );
QskLinearGradient( const QPointF&, const QPointF&,
const QVector< QskGradientStop >& );
QskLinearGradient( qreal x1, qreal y1,
qreal x2, qreal y2, const QVector< QskGradientStop >& );
void setStart(const QPointF& start) noexcept;
void setStart( qreal x, qreal y ) noexcept;
void setStop(const QPointF& start) noexcept;
void setStop( qreal x, qreal y ) noexcept;
void setInterval( Qt::Orientation, qreal, qreal );
void setOrientation( Qt::Orientation ) noexcept;
bool isOriented( Qt::Orientation ) const noexcept;
bool isHorizontal() const noexcept;
bool isVertical() const noexcept;
bool isTilted() const noexcept;
QPointF start() const noexcept;
QPointF stop() const noexcept;
qreal x1() const noexcept;
void setX1( qreal ) noexcept;
qreal y1() const noexcept;
void setY1( qreal ) noexcept;
qreal x2() const noexcept;
void setX2( qreal ) noexcept;
qreal y2() const noexcept;
void setY2( qreal ) noexcept;
};
inline QskLinearGradient::QskLinearGradient() noexcept
: QskGradient( QskGradient::Linear, 0.0, 0.0, 0.0, 1.0 )
{
}
inline QskLinearGradient::QskLinearGradient( Qt::GlobalColor color )
: QskLinearGradient( QColor( color ) )
{
}
inline QskLinearGradient::QskLinearGradient( QRgb rgb )
: QskLinearGradient( QColor::fromRgba( rgb ) )
{
}
inline QskLinearGradient::QskLinearGradient(
Qt::Orientation orientation, Qt::GlobalColor color )
: QskLinearGradient( orientation, QColor( color ) )
{
}
inline QskLinearGradient::QskLinearGradient(
Qt::Orientation orientation, QRgb rgb )
: QskLinearGradient( orientation, QColor::fromRgba( rgb ) )
{
}
inline QskLinearGradient::QskLinearGradient(
const QPointF& start, const QPointF& stop,
const QColor& color1, const QColor& color2 )
: QskLinearGradient( start.x(), start.y(), stop.x(), stop.y(), color1, color2 )
{
}
inline QskLinearGradient::QskLinearGradient(
const QPointF& start, const QPointF& stop, QGradient::Preset preset )
: QskLinearGradient( start.x(), start.y(), stop.x(), stop.y(), preset )
{
}
inline QskLinearGradient::QskLinearGradient(
const QPointF& start, const QPointF& stop,
const QVector< QskGradientStop >& stops )
: QskLinearGradient( start.x(), start.y(), stop.x(), stop.y(), stops )
{
}
inline QskLinearGradient::QskLinearGradient(
const QPointF& start, const QPointF& stop ) noexcept
: QskLinearGradient( start.x(), start.y(), stop.x(), stop.y() )
{
}
inline QskLinearGradient::QskLinearGradient(
qreal x1, qreal y1, qreal x2, qreal y2 ) noexcept
: QskGradient( QskGradient::Linear, x1, y1, x2, y2 )
{
}
inline qreal QskLinearGradient::x1() const noexcept
{
return m_values[0];
}
inline qreal QskLinearGradient::y1() const noexcept
{
return m_values[1];
}
inline qreal QskLinearGradient::x2() const noexcept
{
return m_values[2];
}
inline qreal QskLinearGradient::y2() const noexcept
{
return m_values[3];
}
inline QPointF QskLinearGradient::start() const noexcept
{
return QPointF( x1(), y1() );
}
inline QPointF QskLinearGradient::stop() const noexcept
{
return QPointF( x2(), y2() );
}
inline bool QskLinearGradient::isOriented(
Qt::Orientation orientation ) const noexcept
{
return ( orientation == Qt::Horizontal )
? isHorizontal() : isVertical();
}
inline bool QskLinearGradient::isHorizontal() const noexcept
{
return !isVertical() && ( y1() == y2() );
}
inline bool QskLinearGradient::isVertical() const noexcept
{
return x1() == x2();
}
inline bool QskLinearGradient::isTilted() const noexcept
{
return ( x1() != x2() ) && ( y1() != y2() );
}
#endif

View File

@ -1,69 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskRadialGradient.h"
QskRadialGradient::QskRadialGradient( qreal cx, qreal cy, qreal radius ) noexcept
: QskGradient( Radial, cx, cy, radius, 0.0 )
{
}
QskRadialGradient::QskRadialGradient( const QColor& color1, const QColor& color2 )
: QskRadialGradient()
{
setStops( color1, color2 );
}
QskRadialGradient::QskRadialGradient( QGradient::Preset preset )
: QskRadialGradient()
{
setStops( preset );
}
QskRadialGradient::QskRadialGradient( const QVector< QskGradientStop >& stops )
: QskRadialGradient()
{
setStops( stops );
}
QskRadialGradient::QskRadialGradient( qreal cx, qreal cy, qreal radius,
const QColor& color1, const QColor& color2 )
: QskRadialGradient( cx, cy, radius )
{
setStops( color1, color2 );
}
QskRadialGradient::QskRadialGradient( qreal cx, qreal cy,
qreal radius, QGradient::Preset preset )
: QskRadialGradient( cx, cy, radius )
{
setStops( preset );
}
QskRadialGradient::QskRadialGradient( qreal cx, qreal cy,
qreal radius, const QVector< QskGradientStop >& stops )
: QskRadialGradient( cx, cy, radius )
{
setStops( stops );
}
void QskRadialGradient::setCenter( const QPointF& center ) noexcept
{
m_values[0] = center.x();
m_values[1] = center.y();
}
void QskRadialGradient::setCenter( qreal x, qreal y ) noexcept
{
m_values[0] = x;
m_values[1] = y;
}
void QskRadialGradient::setRadius( qreal radius ) noexcept
{
m_values[2] = radius;
}
#include "moc_QskRadialGradient.cpp"

View File

@ -1,90 +0,0 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#ifndef QSK_RADIAL_GRADIENT_H
#define QSK_RADIAL_GRADIENT_H
#include "QskGradient.h"
class QSK_EXPORT QskRadialGradient : public QskGradient
{
Q_GADGET
Q_PROPERTY( QPointF center READ center WRITE setCenter )
Q_PROPERTY( qreal radius READ radius WRITE setRadius )
public:
QskRadialGradient() noexcept;
QskRadialGradient( const QColor&, const QColor& );
QskRadialGradient( QGradient::Preset );
QskRadialGradient( const QVector< QskGradientStop >& );
QskRadialGradient( const QPointF& center, qreal radius ) noexcept;
QskRadialGradient( qreal cx, qreal cy, qreal radius ) noexcept;
QskRadialGradient( const QPointF& center, qreal radius,
const QColor&, const QColor& );
QskRadialGradient( qreal cx, qreal cy, qreal radius,
const QColor&, const QColor& );
QskRadialGradient( const QPointF& center, qreal radius, QGradient::Preset );
QskRadialGradient( qreal cx, qreal cy, qreal radius, QGradient::Preset );
QskRadialGradient( const QPointF& center, qreal radius,
const QVector< QskGradientStop >& );
QskRadialGradient( qreal cx, qreal cy, qreal radius,
const QVector< QskGradientStop >& );
QPointF center() const noexcept;
void setCenter(const QPointF& center) noexcept;
void setCenter(qreal x, qreal y) noexcept;
qreal radius() const noexcept;
void setRadius( qreal radius ) noexcept;
};
inline QskRadialGradient::QskRadialGradient() noexcept
: QskGradient( Radial, 0.5, 0.5, 0.5, 0.0 )
{
}
inline QskRadialGradient::QskRadialGradient(
const QPointF& center, qreal radius ) noexcept
: QskRadialGradient( center.x(), center.y(), radius )
{
}
inline QskRadialGradient::QskRadialGradient(
const QPointF& center, qreal radius, const QColor& start, const QColor& stop )
: QskRadialGradient( center.x(), center.y(), radius, start, stop )
{
}
inline QskRadialGradient::QskRadialGradient(
const QPointF& center, qreal radius, QGradient::Preset preset )
: QskRadialGradient( center.x(), center.y(), radius, preset )
{
}
inline QskRadialGradient::QskRadialGradient(
const QPointF& center, qreal radius, const QVector< QskGradientStop >& stops )
: QskRadialGradient( center.x(), center.y(), radius, stops )
{
}
inline QPointF QskRadialGradient::center() const noexcept
{
return QPointF( m_values[0], m_values[1] );
}
inline qreal QskRadialGradient::radius() const noexcept
{
return m_values[2];
}
#endif

View File

@ -14,7 +14,6 @@
#include "QskFunctions.h"
#include "QskMargins.h"
#include "QskFunctions.h"
#include "QskLinearGradient.h"
#include <qfontmetrics.h>
#include <qmath.h>
@ -534,7 +533,7 @@ QSGNode* QskMenuSkinlet::updateSampleNode( const QskSkinnable* skinnable,
{
auto gradient = menu->gradientHint( subControl );
if ( ( gradient.type() == QskGradient::Stops ) && !gradient.isMonochrome() )
gradient = QskLinearGradient( Qt::Vertical, gradient.stops() );
gradient.setLinearDirection( Qt::Vertical );
return updateBoxNode( menu, node, rect, gradient, subControl );
}

View File

@ -7,7 +7,7 @@
#include "QskProgressBar.h"
#include "QskIntervalF.h"
#include "QskBoxBorderMetrics.h"
#include "QskLinearGradient.h"
#include "QskGradientDirection.h"
#include <qeasingcurve.h>
#include <cmath>
@ -141,10 +141,11 @@ QSGNode* QskProgressBarSkinlet::updateBarNode(
const auto intv = qskBarInterval( bar );
auto stops = qskExtractedGradientStops( gradient.stops(),
const auto stops = qskExtractedGradientStops( gradient.stops(),
intv.lowerBound(), intv.upperBound() );
gradient = QskLinearGradient( bar->orientation(), stops );
gradient.setStops( stops );
gradient.setLinearDirection( bar->orientation() );
if ( bar->orientation() == Qt::Vertical || bar->layoutMirroring() )
gradient.reverse();
}

View File

@ -6,7 +6,7 @@
#include "QskSeparatorSkinlet.h"
#include "QskSeparator.h"
#include "QskLinearGradient.h"
#include "QskGradientDirection.h"
#include "QskAspect.h"
QskSeparatorSkinlet::QskSeparatorSkinlet( QskSkin* skin )
@ -50,7 +50,7 @@ QSGNode* QskSeparatorSkinlet::updateSubNode(
const auto orientation = ( separator->orientation() == Qt::Vertical )
? Qt::Horizontal : Qt::Vertical;
gradient = QskLinearGradient( orientation, gradient.stops() );
gradient.setLinearDirection( orientation );
}
return updateBoxNode( separator, node, rect, gradient, Q::Panel );

View File

@ -12,7 +12,6 @@
#include "QskBoxBorderMetrics.h"
#include "QskBoxBorderColors.h"
#include "QskShadowMetrics.h"
#include "QskLinearGradient.h"
namespace
{
@ -225,7 +224,9 @@ void QskSkinHintTableEditor::setHGradient(
QskAspect aspect, const QColor& color1, const QColor& color2,
QskStateCombination combination )
{
const QskLinearGradient gradient( Qt::Horizontal, color1, color2 );
QskGradient gradient( color1, color2 );
gradient.setLinearDirection( Qt::Horizontal );
setGradient( aspect, gradient, combination );
}
@ -233,7 +234,9 @@ void QskSkinHintTableEditor::setVGradient(
QskAspect aspect, const QColor& color1, const QColor& color2,
QskStateCombination combination )
{
const QskLinearGradient gradient( Qt::Vertical, color1, color2 );
QskGradient gradient( color1, color2 );
gradient.setLinearDirection( Qt::Vertical );
setGradient( aspect, gradient, combination );
}

View File

@ -5,7 +5,8 @@
#include "QskArcRenderer.h"
#include "QskArcMetrics.h"
#include "QskLinearGradient.h"
#include "QskGradient.h"
#include "QskGradientDirection.h"
#include <qpainter.h>
#include <qrect.h>
@ -21,7 +22,7 @@ void QskArcRenderer::renderArc(const QRectF& rect,
Horizontal is interpreted as conic ( in direction of the arc ),
while Vertical means radial ( inner to outer border )
*/
isRadial = gradient.asLinearGradient().isVertical();
isRadial = gradient.linearDirection().isVertical();
}
QBrush brush;

View File

@ -9,6 +9,7 @@
#include "QskBoxRenderer.h"
#include "QskBoxShapeMetrics.h"
#include "QskGradient.h"
#include "QskGradientDirection.h"
#include <qglobalstatic.h>
#include <qsgflatcolormaterial.h>
@ -39,56 +40,53 @@ static inline QskHashValue qskColorsHash(
#if 1
#include "QskLinearGradient.h"
static inline QskLinearGradient qskEffectiveGradient( const QskGradient& gradient )
static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
{
QskLinearGradient g;
QskGradient g;
if ( gradient.isVisible() )
{
if ( gradient.isMonochrome() )
{
g.setLinearDirection( Qt::Vertical );
g.setStops( gradient.startColor() );
}
else
{
switch( gradient.type() )
{
case QskGradient::Linear:
{
const auto& linearGradient = gradient.asLinearGradient();
auto dir = gradient.linearDirection();
if ( linearGradient.isVertical() )
if ( dir.isTilted() )
{
g.setOrientation( Qt::Vertical );
}
else if ( linearGradient.isHorizontal() )
{
g.setOrientation( Qt::Horizontal );
}
else
{
g.setStart( 0.0, 0.0 );
g.setStop( 1.0, 1.0 );
dir.setStart( 0.0, 0.0 );
dir.setStop( 1.0, 1.0 );
}
g.setStops( gradient.stops() );
g.setLinearDirection( dir );
break;
}
case QskGradient::Radial:
case QskGradient::Conic:
{
qWarning() << "QskBoxNode does not support radial/conic gradients";
g.setStops( Qt::black );
g.setLinearDirection( Qt::Vertical );
break;
}
case QskGradient::Stops:
{
g.setStops( gradient.stops() );
g.setLinearDirection( Qt::Vertical );
break;
}
}
g.setStops( gradient.stops() );
}
}

View File

@ -12,7 +12,6 @@
class QskBoxBorderMetrics;
class QskBoxBorderColors;
class QskLinearGradient;
class QskGradient;
class QSGGeometry;
@ -33,7 +32,7 @@ class QSK_EXPORT QskBoxRenderer
void renderBox( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskLinearGradient&, QSGGeometry& );
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
class Quad
{
@ -116,7 +115,7 @@ class QSK_EXPORT QskBoxRenderer
void renderRect( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskLinearGradient&, QSGGeometry& );
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
void renderRectellipseFill( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& );
@ -126,12 +125,12 @@ class QSK_EXPORT QskBoxRenderer
void renderRectellipse( const QRectF&,
const QskBoxShapeMetrics&, const QskBoxBorderMetrics&,
const QskBoxBorderColors&, const QskLinearGradient&, QSGGeometry& );
const QskBoxBorderColors&, const QskGradient&, QSGGeometry& );
void renderDiagonalFill( const Metrics&, const QskGradient&,
int lineCount, QskVertex::ColoredLine* );
void renderRectFill( const Quad&, const QskLinearGradient&, QskVertex::ColoredLine* );
void renderRectFill( const Quad&, const QskGradient&, QskVertex::ColoredLine* );
};
inline void QskBoxRenderer::renderBorder(
@ -156,7 +155,7 @@ inline void QskBoxRenderer::renderFill(
inline void QskBoxRenderer::renderBox( const QRectF& rect,
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border,
const QskBoxBorderColors& borderColors, const QskLinearGradient& gradient,
const QskBoxBorderColors& borderColors, const QskGradient& gradient,
QSGGeometry& geometry )
{
if ( shape.isRectangle() )

View File

@ -4,12 +4,12 @@
*****************************************************************************/
#include "QskBoxRenderer.h"
#include "QskLinearGradient.h"
#include "QskBoxBorderColors.h"
#include "QskBoxBorderMetrics.h"
#include "QskBoxRendererColorMap.h"
#include "QskBoxShapeMetrics.h"
#include "QskGradientDirection.h"
#include <qmath.h>
#include <qsggeometry.h>
@ -868,13 +868,13 @@ namespace
};
}
static inline Qt::Orientation qskQtOrientation( const QskLinearGradient& gradient )
static inline Qt::Orientation qskQtOrientation( const QskGradient& gradient )
{
return gradient.isVertical() ? Qt::Vertical : Qt::Horizontal;
return gradient.linearDirection().isVertical() ? Qt::Vertical : Qt::Horizontal;
}
static inline int qskFillLineCount(
const QskBoxRenderer::Metrics& metrics, const QskLinearGradient& gradient )
const QskBoxRenderer::Metrics& metrics, const QskGradient& gradient )
{
const int stepCount = metrics.corner[ 0 ].stepCount;
@ -883,7 +883,9 @@ static inline int qskFillLineCount(
int lineCount = 0;
if ( gradient.isVertical() )
const auto dir = gradient.linearDirection();
if ( dir.isVertical() )
{
lineCount += qMax( metrics.corner[ TopLeft ].stepCount,
metrics.corner[ TopRight ].stepCount ) + 1;
@ -894,7 +896,7 @@ static inline int qskFillLineCount(
if ( metrics.centerQuad.top >= metrics.centerQuad.bottom )
lineCount--;
}
else if ( gradient.isHorizontal() )
else if ( dir.isHorizontal() )
{
lineCount += qMax( metrics.corner[ TopLeft ].stepCount,
metrics.corner[ BottomLeft ].stepCount ) + 1;
@ -1029,7 +1031,7 @@ static inline void qskRenderBorder( const QskBoxRenderer::Metrics& metrics,
static inline void qskRenderFillRandom(
const QskBoxRenderer::Metrics& metrics,
const QskLinearGradient& gradient, ColoredLine* line )
const QskGradient& gradient, ColoredLine* line )
{
const auto orientation = qskQtOrientation( gradient );
@ -1047,7 +1049,7 @@ static inline void qskRenderFillRandom(
static inline void qskRenderBoxRandom(
const QskBoxRenderer::Metrics& metrics, const QskBoxBorderColors& borderColors,
const QskLinearGradient& gradient, ColoredLine* fillLine, ColoredLine* borderLine )
const QskGradient& gradient, ColoredLine* fillLine, ColoredLine* borderLine )
{
const auto& bc = borderColors;
@ -1099,7 +1101,7 @@ static inline void qskRenderBoxRandom(
static inline void qskRenderFillOrdered(
const QskBoxRenderer::Metrics& metrics,
const QskLinearGradient& gradient, ColoredLine* lines )
const QskGradient& gradient, ColoredLine* lines )
{
const auto& r = metrics.innerQuad;
@ -1108,7 +1110,7 @@ static inline void qskRenderFillOrdered(
implemented TODO ...
*/
if ( gradient.isHorizontal() )
if ( gradient.linearDirection().isHorizontal() )
{
HRectEllipseIterator it( metrics );
QskVertex::fillOrdered( it, r.left, r.right, gradient, lines );
@ -1333,7 +1335,7 @@ void QskBoxRenderer::renderRectellipseFill(
void QskBoxRenderer::renderRectellipse( const QRectF& rect,
const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border,
const QskBoxBorderColors& borderColors, const QskLinearGradient& gradient,
const QskBoxBorderColors& borderColors, const QskGradient& gradient,
QSGGeometry& geometry )
{
const Metrics metrics( rect, shape, border );
@ -1351,7 +1353,7 @@ void QskBoxRenderer::renderRectellipse( const QRectF& rect,
#if 1
// code copied from QskBoxRendererRect.cpp TODO ...
if ( gradient.isTilted() )
if ( gradient.linearDirection().isTilted() )
{
if ( metrics.centerQuad.width == metrics.centerQuad.height )
{
@ -1394,7 +1396,7 @@ void QskBoxRenderer::renderRectellipse( const QRectF& rect,
bool extraLine = false;
if ( borderLineCount > 0 && fillLineCount > 0 )
{
if ( !gradient.isMonochrome() && gradient.isTilted() )
if ( !gradient.isMonochrome() && gradient.linearDirection().isTilted() )
{
/*
The filling ends at 45° and we have no implementation
@ -1417,7 +1419,7 @@ void QskBoxRenderer::renderRectellipse( const QRectF& rect,
}
else if ( !gradient.isMonochrome() )
{
if ( gradient.stepCount() > 1 || gradient.isTilted() )
if ( gradient.stepCount() > 1 || gradient.linearDirection().isTilted() )
fillRandom = false;
}
@ -1447,7 +1449,7 @@ void QskBoxRenderer::renderRectellipse( const QRectF& rect,
{
renderRectFill( metrics.innerQuad, gradient, line );
}
else if ( gradient.isTilted() )
else if ( gradient.linearDirection().isTilted() )
{
renderDiagonalFill( metrics, gradient, fillLineCount, line );
}
@ -1483,7 +1485,7 @@ void QskBoxRenderer::renderRectellipse( const QRectF& rect,
{
renderRectFill( metrics.innerQuad, gradient, line );
}
else if ( gradient.isTilted() )
else if ( gradient.linearDirection().isTilted() )
{
renderDiagonalFill( metrics, gradient, fillLineCount, line );
}

View File

@ -8,7 +8,7 @@
#include "QskBoxRenderer.h"
#include "QskBoxRendererColorMap.h"
#include "QskFunctions.h"
#include "QskLinearGradient.h"
#include "QskGradientDirection.h"
#include "QskVertex.h"
using namespace QskVertex;
@ -343,14 +343,16 @@ namespace
}
static inline void qskCreateFillOrdered( const QskBoxRenderer::Quad& rect,
const QskLinearGradient& gradient, ColoredLine* line )
const QskGradient& gradient, ColoredLine* line )
{
if ( gradient.isHorizontal() )
const auto dir = gradient.linearDirection();
if ( dir.isHorizontal() )
{
HRectIterator it( rect );
line = QskVertex::fillOrdered( it, rect.left, rect.right, gradient, line );
}
else if ( gradient.isVertical() )
else if ( dir.isVertical() )
{
VRectIterator it( rect );
line = QskVertex::fillOrdered( it, rect.top, rect.bottom, gradient, line );
@ -554,7 +556,7 @@ void QskBoxRenderer::renderRectFill(
void QskBoxRenderer::renderRect(
const QRectF& rect, const QskBoxShapeMetrics& shape,
const QskBoxBorderMetrics& border, const QskBoxBorderColors& borderColors,
const QskLinearGradient& gradient, QSGGeometry& geometry )
const QskGradient& gradient, QSGGeometry& geometry )
{
Q_UNUSED( shape )
@ -566,7 +568,7 @@ void QskBoxRenderer::renderRect(
{
fillLineCount = gradient.stepCount() + 1;
if ( gradient.isTilted() )
if ( gradient.linearDirection().isTilted() )
{
if ( in.width == in.height )
{
@ -633,12 +635,13 @@ void QskBoxRenderer::renderRect(
but we didn't implement a random fill algo for
diagonal gradients yet.
*/
fillRandom = !gd.isTilted();
fillRandom = !gd.linearDirection().isTilted();
}
if ( fillRandom )
{
const auto orientation = gd.isVertical() ? Qt::Vertical : Qt::Horizontal;
const auto orientation = gd.linearDirection().isVertical()
? Qt::Vertical : Qt::Horizontal;
const ColorMapGradient colorMap( gd.startColor(), gd.endColor() );
qskCreateFillRandom( orientation, in, colorMap, line );
@ -668,7 +671,7 @@ void QskBoxRenderer::renderRect(
}
void QskBoxRenderer::renderRectFill( const QskBoxRenderer::Quad& rect,
const QskLinearGradient& gradient, QskVertex::ColoredLine* line )
const QskGradient& gradient, QskVertex::ColoredLine* line )
{
qskCreateFillOrdered( rect, gradient, line );
}

View File

@ -6,10 +6,7 @@
#include "QskGradientMaterial.h"
#include "QskFunctions.h"
#include "QskRgbValue.h"
#include "QskLinearGradient.h"
#include "QskRadialGradient.h"
#include "QskConicGradient.h"
#include "QskGradientDirection.h"
QSK_QT_PRIVATE_BEGIN
#include <private/qrhi_p.h>
@ -317,7 +314,7 @@ namespace
{
}
bool setGradient( const QRectF& rect, const QskLinearGradient& gradient )
bool setGradient( const QRectF& rect, const QskGradient& gradient )
{
bool changed = false;
@ -337,11 +334,13 @@ namespace
QTransform transform( rect.width(), 0, 0, rect.height(), rect.x(), rect.y());
#endif
const auto dir = gradient.linearDirection();
const QVector4D vector(
rect.left() + gradient.start().x() * rect.width(),
rect.top() + gradient.start().y() * rect.height(),
gradient.stop().x() * rect.width(),
gradient.stop().y() * rect.height() );
rect.left() + dir.start().x() * rect.width(),
rect.top() + dir.start().y() * rect.height(),
dir.stop().x() * rect.width(),
dir.stop().y() * rect.height() );
if ( m_gradientVector != vector )
{
@ -476,7 +475,7 @@ namespace
return &type;
}
bool setGradient( const QRectF& rect, const QskRadialGradient& gradient )
bool setGradient( const QRectF& rect, const QskGradient& gradient )
{
bool changed = false;
@ -492,14 +491,14 @@ namespace
changed = true;
}
const auto& center = gradient.center();
const auto r = gradient.radius();
const auto dir = gradient.radialDirection();
const QVector2D pos(
rect.left() + center.x() * rect.width(),
rect.top() + center.y() * rect.height() );
rect.left() + dir.center().x() * rect.width(),
rect.top() + dir.center().y() * rect.height() );
const QVector2D radius( r * rect.width(), r * rect.height() );
const QVector2D radius( dir.radius() * rect.width(),
dir.radius() * rect.height() );
if ( ( pos != m_center ) || ( m_radius != radius ) )
{
@ -647,7 +646,7 @@ namespace
return &type;
}
bool setGradient( const QRectF& rect, const QskConicGradient& gradient )
bool setGradient( const QRectF& rect, const QskGradient& gradient )
{
bool changed = false;
@ -663,17 +662,19 @@ namespace
changed = true;
}
const auto dir = gradient.conicDirection();
const QVector2D center(
rect.left() + gradient.center().x() * rect.width(),
rect.top() + gradient.center().y() * rect.height() );
rect.left() + dir.center().x() * rect.width(),
rect.top() + dir.center().y() * rect.height() );
// Angles as ratio of a rotation
float start = fmod( gradient.startAngle(), 360.0 ) / 360.0;
float start = fmod( dir.startAngle(), 360.0 ) / 360.0;
if ( start < 0.0)
start += 1.0;
const float span = fmod( gradient.spanAngle(), 360.0 ) / 360.0;
const float span = fmod( dir.spanAngle(), 360.0 ) / 360.0;
if ( center != m_center )
{
@ -842,19 +843,19 @@ bool QskGradientMaterial::updateGradient( const QRectF& rect, const QskGradient&
case QskGradient::Linear:
{
auto material = static_cast< LinearMaterial* >( this );
return material->setGradient( rect, gradient.asLinearGradient() );
return material->setGradient( rect, gradient );
}
case QskGradient::Radial:
{
auto material = static_cast< RadialMaterial* >( this );
return material->setGradient( rect, gradient.asRadialGradient() );
return material->setGradient( rect, gradient );
}
case QskGradient::Conic:
{
auto material = static_cast< ConicMaterial* >( this );
return material->setGradient( rect, gradient.asConicGradient() );
return material->setGradient( rect, gradient );
}
default:

View File

@ -6,7 +6,7 @@
#include "QskShapeNode.h"
#include "QskGradientMaterial.h"
#include "QskGradient.h"
#include "QskLinearGradient.h"
#include "QskGradientDirection.h"
#include <qsgflatcolormaterial.h>
@ -19,7 +19,13 @@ QSK_QT_PRIVATE_END
static inline QskGradient qskEffectiveGradient( const QskGradient& gradient )
{
if ( gradient.type() == QskGradient::Stops )
return QskLinearGradient( Qt::Vertical, gradient.stops() );
{
QskGradient g;
g.setLinearDirection( Qt::Vertical );
g.setStops( gradient.stops() );
return g;
}
return gradient;
}

View File

@ -26,10 +26,8 @@ HEADERS += \
common/QskFunctions.h \
common/QskGlobal.h \
common/QskGradient.h \
common/QskGradientDirection.h \
common/QskGradientStop.h \
common/QskConicGradient.h \
common/QskLinearGradient.h \
common/QskRadialGradient.h \
common/QskHctColor.h \
common/QskIntervalF.h \
common/QskMargins.h \
@ -58,9 +56,7 @@ SOURCES += \
common/QskBoxHints.cpp \
common/QskFunctions.cpp \
common/QskGradient.cpp \
common/QskConicGradient.cpp \
common/QskLinearGradient.cpp \
common/QskRadialGradient.cpp \
common/QskGradientDirection.cpp \
common/QskGradientStop.cpp \
common/QskHctColor.cpp \
common/QskIntervalF.cpp \