features added

This commit is contained in:
Uwe Rathmann 2020-07-31 12:42:36 +02:00
parent 2186765763
commit 6871b7a0b8
2 changed files with 123 additions and 9 deletions

View File

@ -9,6 +9,8 @@
#include <qhashfunctions.h> #include <qhashfunctions.h>
#include <qvariant.h> #include <qvariant.h>
#include <algorithm>
static void qskRegisterGradient() static void qskRegisterGradient()
{ {
qRegisterMetaType< QskGradient >(); qRegisterMetaType< QskGradient >();
@ -17,6 +19,12 @@ static void qskRegisterGradient()
Q_CONSTRUCTOR_FUNCTION( qskRegisterGradient ) Q_CONSTRUCTOR_FUNCTION( qskRegisterGradient )
static inline QskGradient::Orientation qskOrientation( Qt::Orientation o )
{
return ( o == Qt::Vertical )
? QskGradient::Vertical : QskGradient::Horizontal;
}
static inline bool qskIsGradientValid( const QVector< QskGradientStop >& stops ) static inline bool qskIsGradientValid( const QVector< QskGradientStop >& stops )
{ {
if ( stops.size() < 2 ) if ( stops.size() < 2 )
@ -110,6 +118,53 @@ static inline QVector< QskGradientStop > qskExpandedStops(
return stops; return stops;
} }
static inline QVector< QskGradientStop > qskExtractedStops(
const QVector< QskGradientStop >& stops, qreal from, qreal to )
{
QVector< QskGradientStop > extracted;
if ( from == to )
extracted.reserve( 2 );
else
extracted.reserve( stops.size() );
int i = 0;
if ( from == 0.0 )
{
extracted += QskGradientStop( 0.0, stops[i].color() );
}
else
{
for ( ; i < stops.count(); i++ )
{
if ( stops[i].position() >= from )
break;
}
const auto color =
QskGradientStop::interpolated( stops[i-1], stops[i], from );
extracted += QskGradientStop( 0.0, color );
}
for ( i = i + 1 ; i < stops.count(); i++ )
{
const auto& s = stops[i];
if ( s.position() >= to )
break;
const auto pos = ( s.position() - from ) / ( to - from );
extracted += QskGradientStop( pos, s.color() );
}
const auto color = QskGradientStop::interpolated( stops[i-1], stops[i], to );
extracted += QskGradientStop( 1.0, color );
return extracted;
}
void QskGradientStop::setPosition( qreal position ) void QskGradientStop::setPosition( qreal position )
{ {
m_position = position; m_position = position;
@ -175,6 +230,12 @@ QskGradient::QskGradient( const QColor& color )
setColor( color ); setColor( color );
} }
QskGradient::QskGradient( Qt::Orientation orientation,
const QColor& startColor, const QColor& stopColor )
: QskGradient( qskOrientation( orientation ), startColor, stopColor )
{
}
QskGradient::QskGradient( Orientation orientation, QskGradient::QskGradient( Orientation orientation,
const QColor& startColor, const QColor& stopColor ) const QColor& startColor, const QColor& stopColor )
: m_orientation( orientation ) : m_orientation( orientation )
@ -182,6 +243,12 @@ QskGradient::QskGradient( Orientation orientation,
setColors( startColor, stopColor ); setColors( startColor, stopColor );
} }
QskGradient::QskGradient( Qt::Orientation orientation,
const QVector< QskGradientStop >& stops )
: QskGradient( qskOrientation( orientation ), stops )
{
}
QskGradient::QskGradient( Orientation orientation, QskGradient::QskGradient( Orientation orientation,
const QVector< QskGradientStop >& stops ) const QVector< QskGradientStop >& stops )
: m_orientation( orientation ) : m_orientation( orientation )
@ -226,6 +293,11 @@ bool QskGradient::isVisible() const
return false; return false;
} }
void QskGradient::setOrientation( Qt::Orientation orientation )
{
setOrientation( qskOrientation( orientation ) );
}
void QskGradient::setOrientation( Orientation orientation ) void QskGradient::setOrientation( Orientation orientation )
{ {
m_orientation = orientation; m_orientation = orientation;
@ -354,6 +426,39 @@ uint QskGradient::hash( uint seed ) const
return hash; return hash;
} }
void QskGradient::reverse()
{
if ( isMonochrome() )
return;
std::reverse( m_stops.begin(), m_stops.end() );
for( auto& stop : m_stops )
stop.setPosition( 1.0 - stop.position() );
}
QskGradient QskGradient::reversed() const
{
auto gradient = *this;
gradient.reverse();
return gradient;
}
QskGradient QskGradient::extracted( qreal from, qreal to ) const
{
if ( from > to )
return QskGradient( m_orientation );
if ( isMonochrome() || ( from <= 0.0 && to >= 1.0 ) )
return *this;
from = qMax( from, 0.0 );
to = qMin( to, 1.0 );
const auto stops = qskExtractedStops( m_stops, from, to );
return QskGradient( m_orientation, stops );
}
QskGradient QskGradient::interpolated( QskGradient QskGradient::interpolated(
const QskGradient& to, qreal value ) const const QskGradient& to, qreal value ) const
{ {

View File

@ -76,16 +76,20 @@ class QSK_EXPORT QskGradient
QskGradient( QRgb ); QskGradient( QRgb );
QskGradient( const QColor& ); QskGradient( const QColor& );
QskGradient( Qt::Orientation, const QVector< QskGradientStop >& );
QskGradient( Qt::Orientation, const QColor&, const QColor& );
QskGradient( Orientation, const QVector< QskGradientStop >& ); QskGradient( Orientation, const QVector< QskGradientStop >& );
QskGradient( Orientation, const QColor&, const QColor& ); QskGradient( Orientation, const QColor&, const QColor& );
~QskGradient(); ~QskGradient();
void setOrientation( Qt::Orientation );
void setOrientation( Orientation ); void setOrientation( Orientation );
Orientation orientation() const; Orientation orientation() const;
bool isValid() const; bool isValid() const;
void invalidate(); Q_INVOKABLE void invalidate();
bool operator==( const QskGradient& ) const; bool operator==( const QskGradient& ) const;
bool operator!=( const QskGradient& ) const; bool operator!=( const QskGradient& ) const;
@ -93,20 +97,25 @@ class QSK_EXPORT QskGradient
void setColor( const QColor& ); void setColor( const QColor& );
void setColors( const QColor&, const QColor& ); void setColors( const QColor&, const QColor& );
QColor startColor() const; Q_INVOKABLE QColor startColor() const;
QColor endColor() const; Q_INVOKABLE QColor endColor() const;
void setStops( const QVector< QskGradientStop >& ); Q_INVOKABLE void setStops( const QVector< QskGradientStop >& );
QVector< QskGradientStop > stops() const; Q_INVOKABLE QVector< QskGradientStop > stops() const;
bool hasStopAt( qreal value ) const; Q_INVOKABLE bool hasStopAt( qreal value ) const;
void setAlpha( int alpha ); void setAlpha( int alpha );
bool isMonochrome() const; bool isMonochrome() const;
bool isVisible() const; bool isVisible() const;
QskGradient expanded( const QVector< QskGradientStop >& ); void reverse();
QskGradient reversed() const;
// all stops between [from, to] with positions streched into [0,1]
QskGradient extracted( qreal from, qreal start ) const;
QskGradient interpolated( const QskGradient&, qreal value ) const; QskGradient interpolated( const QskGradient&, qreal value ) const;
static QVariant interpolate( const QskGradient&, static QVariant interpolate( const QskGradient&,
@ -114,8 +123,8 @@ class QSK_EXPORT QskGradient
uint hash( uint seed ) const; uint hash( uint seed ) const;
qreal stopAt( int index ) const; Q_INVOKABLE qreal stopAt( int index ) const;
QColor colorAt( int index ) const; Q_INVOKABLE QColor colorAt( int index ) const;
private: private:
void setStopAt( int index, qreal stop ); void setStopAt( int index, qreal stop );