first adjustments for QskGradient improvements
This commit is contained in:
parent
4a04a27d0d
commit
99132276fc
@ -201,7 +201,7 @@ void Editor::setButton( QskAspect aspect, PanelStyle style, qreal border )
|
||||
{
|
||||
borderColors.setGradientAt( Qt::TopEdge | Qt::LeftEdge, m_pal.lighter135 );
|
||||
borderColors.setGradientAt( Qt::RightEdge | Qt::BottomEdge, m_pal.darker200 );
|
||||
gradient.setColors( m_pal.lighter125, m_pal.lighter110 );
|
||||
gradient.setStops( m_pal.lighter125, m_pal.lighter110 );
|
||||
|
||||
break;
|
||||
}
|
||||
@ -209,14 +209,14 @@ void Editor::setButton( QskAspect aspect, PanelStyle style, qreal border )
|
||||
{
|
||||
borderColors.setGradientAt( Qt::TopEdge | Qt::LeftEdge, m_pal.darker200 );
|
||||
borderColors.setGradientAt( Qt::RightEdge | Qt::BottomEdge, m_pal.lighter135 );
|
||||
gradient.setColors( m_pal.lighter110, m_pal.lighter125 );
|
||||
gradient.setStops( m_pal.lighter110, m_pal.lighter125 );
|
||||
|
||||
break;
|
||||
}
|
||||
case Plain:
|
||||
{
|
||||
borderColors.setGradients( m_pal.darker125 );
|
||||
gradient.setColor( m_pal.lighter125 );
|
||||
gradient.setStops( m_pal.lighter125 );
|
||||
|
||||
break;
|
||||
}
|
||||
@ -227,7 +227,7 @@ void Editor::setButton( QskAspect aspect, PanelStyle style, qreal border )
|
||||
noColor.setAlpha( 0 );
|
||||
|
||||
borderColors.setGradients( noColor );
|
||||
gradient.setColor( noColor );
|
||||
gradient.setStops( noColor );
|
||||
|
||||
if ( style == NoPanel )
|
||||
border = 0;
|
||||
|
@ -230,7 +230,7 @@ static inline QskGradientStops qskColorStops(
|
||||
return stops;
|
||||
}
|
||||
|
||||
QskGradient::QskGradient( Orientation orientation )
|
||||
QskGradient::QskGradient( Orientation orientation ) noexcept
|
||||
: m_orientation( orientation )
|
||||
, m_isDirty( false )
|
||||
, m_isValid( false )
|
||||
@ -242,7 +242,7 @@ QskGradient::QskGradient( Orientation orientation )
|
||||
QskGradient::QskGradient( const QColor& color )
|
||||
: QskGradient( Vertical )
|
||||
{
|
||||
setColor( color );
|
||||
setStops( color );
|
||||
}
|
||||
|
||||
QskGradient::QskGradient( Qt::Orientation orientation,
|
||||
@ -255,7 +255,7 @@ QskGradient::QskGradient( Orientation orientation,
|
||||
const QColor& startColor, const QColor& stopColor )
|
||||
: QskGradient( orientation )
|
||||
{
|
||||
setColors( startColor, stopColor );
|
||||
setStops( startColor, stopColor );
|
||||
}
|
||||
|
||||
QskGradient::QskGradient( Qt::Orientation orientation, const QskGradientStops& stops )
|
||||
@ -284,7 +284,31 @@ QskGradient::~QskGradient()
|
||||
{
|
||||
}
|
||||
|
||||
bool QskGradient::isValid() const
|
||||
bool QskGradient::operator==( const QskGradient& other ) const noexcept
|
||||
{
|
||||
return ( m_orientation == other.m_orientation ) && ( m_stops == other.m_stops );
|
||||
}
|
||||
|
||||
void QskGradient::updateStatusBits() const
|
||||
{
|
||||
// doing all bits in one loop ?
|
||||
m_isValid = qskIsGradientValid( m_stops );
|
||||
|
||||
if ( m_isValid )
|
||||
{
|
||||
m_isMonchrome = qskIsMonochrome( m_stops );
|
||||
m_isVisible = qskIsVisible( m_stops );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_isMonchrome = true;
|
||||
m_isVisible = false;
|
||||
}
|
||||
|
||||
m_isDirty = false;
|
||||
}
|
||||
|
||||
bool QskGradient::isValid() const noexcept
|
||||
{
|
||||
if ( m_isDirty )
|
||||
updateStatusBits();
|
||||
@ -292,16 +316,7 @@ bool QskGradient::isValid() const
|
||||
return m_isValid;
|
||||
}
|
||||
|
||||
void QskGradient::invalidate()
|
||||
{
|
||||
if ( !m_stops.isEmpty() )
|
||||
{
|
||||
m_stops.clear();
|
||||
m_isDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool QskGradient::isMonochrome() const
|
||||
bool QskGradient::isMonochrome() const noexcept
|
||||
{
|
||||
if ( m_isDirty )
|
||||
updateStatusBits();
|
||||
@ -309,7 +324,7 @@ bool QskGradient::isMonochrome() const
|
||||
return m_isMonchrome;
|
||||
}
|
||||
|
||||
bool QskGradient::isVisible() const
|
||||
bool QskGradient::isVisible() const noexcept
|
||||
{
|
||||
if ( m_isDirty )
|
||||
updateStatusBits();
|
||||
@ -317,18 +332,18 @@ bool QskGradient::isVisible() const
|
||||
return m_isVisible;
|
||||
}
|
||||
|
||||
void QskGradient::setOrientation( Qt::Orientation orientation )
|
||||
void QskGradient::setOrientation( Qt::Orientation orientation ) noexcept
|
||||
{
|
||||
setOrientation( qskOrientation( orientation ) );
|
||||
}
|
||||
|
||||
void QskGradient::setOrientation( Orientation orientation )
|
||||
void QskGradient::setOrientation( Orientation orientation ) noexcept
|
||||
{
|
||||
// does not change m_isDirty
|
||||
m_orientation = orientation;
|
||||
}
|
||||
|
||||
void QskGradient::setColor( const QColor& color )
|
||||
void QskGradient::setStops( const QColor& color )
|
||||
{
|
||||
m_stops.clear();
|
||||
m_stops.reserve( 2 );
|
||||
@ -339,7 +354,7 @@ void QskGradient::setColor( const QColor& color )
|
||||
m_isDirty = true;
|
||||
}
|
||||
|
||||
void QskGradient::setColors( const QColor& startColor, const QColor& stopColor )
|
||||
void QskGradient::setStops( const QColor& startColor, const QColor& stopColor )
|
||||
{
|
||||
m_stops.clear();
|
||||
m_stops.reserve( 2 );
|
||||
@ -352,31 +367,19 @@ void QskGradient::setColors( const QColor& startColor, const QColor& stopColor )
|
||||
|
||||
void QskGradient::setStops( const QskGradientStops& stops )
|
||||
{
|
||||
if ( !qskIsGradientValid( stops ) )
|
||||
if ( !stops.isEmpty() && !qskIsGradientValid( stops ) )
|
||||
{
|
||||
qWarning( "Invalid gradient stops" );
|
||||
invalidate();
|
||||
return;
|
||||
m_stops.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_stops = stops;
|
||||
}
|
||||
|
||||
m_stops = stops;
|
||||
m_isDirty = true;
|
||||
}
|
||||
|
||||
const QskGradientStops& QskGradient::stops() const
|
||||
{
|
||||
#if 1
|
||||
/*
|
||||
Returning a const& so that it is possible to write:
|
||||
for ( const auto& stop : qAsConst( gradient.stops() ) )
|
||||
|
||||
Once we have changed QskGradientStop from QColor to QRgb
|
||||
we should check if there is a better solution possible
|
||||
*/
|
||||
#endif
|
||||
return m_stops;
|
||||
}
|
||||
|
||||
int QskGradient::stopCount() const
|
||||
{
|
||||
return m_stops.count();
|
||||
@ -413,7 +416,7 @@ void QskGradient::setAlpha( int alpha )
|
||||
m_isDirty = true;
|
||||
}
|
||||
|
||||
bool QskGradient::hasStopAt( qreal value ) const
|
||||
bool QskGradient::hasStopAt( qreal value ) const noexcept
|
||||
{
|
||||
// better use binary search TODO ...
|
||||
for ( auto& stop : m_stops )
|
||||
@ -428,20 +431,6 @@ bool QskGradient::hasStopAt( qreal value ) const
|
||||
return false;
|
||||
}
|
||||
|
||||
QskHashValue QskGradient::hash( QskHashValue seed ) const
|
||||
{
|
||||
if ( m_stops.isEmpty() )
|
||||
return seed;
|
||||
|
||||
const auto o = orientation();
|
||||
|
||||
auto hash = qHashBits( &o, sizeof( o ), seed );
|
||||
for ( const auto& stop : m_stops )
|
||||
hash = stop.hash( hash );
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
void QskGradient::reverse()
|
||||
{
|
||||
if ( isMonochrome() )
|
||||
@ -622,25 +611,6 @@ QVariant QskGradient::interpolate(
|
||||
return QVariant::fromValue( from.interpolated( to, progress ) );
|
||||
}
|
||||
|
||||
void QskGradient::updateStatusBits() const
|
||||
{
|
||||
// doing all bits in one loop ?
|
||||
m_isValid = qskIsGradientValid( m_stops );
|
||||
|
||||
if ( m_isValid )
|
||||
{
|
||||
m_isMonchrome = qskIsMonochrome( m_stops );
|
||||
m_isVisible = qskIsVisible( m_stops );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_isMonchrome = true;
|
||||
m_isVisible = false;
|
||||
}
|
||||
|
||||
m_isDirty = false;
|
||||
}
|
||||
|
||||
QskGradientStops QskGradient::colorStops(
|
||||
const QVector< QRgb >& rgb, bool discrete )
|
||||
{
|
||||
@ -674,6 +644,30 @@ QGradientStops QskGradient::qtStops() const
|
||||
return qstops;
|
||||
}
|
||||
|
||||
void QskGradient::clearStops()
|
||||
{
|
||||
if ( !m_stops.isEmpty() )
|
||||
{
|
||||
m_stops.clear();
|
||||
m_isDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
QskHashValue QskGradient::hash( QskHashValue seed ) const
|
||||
{
|
||||
if ( m_stops.isEmpty() )
|
||||
return seed;
|
||||
|
||||
const auto o = orientation();
|
||||
|
||||
auto hash = qHashBits( &o, sizeof( o ), seed );
|
||||
for ( const auto& stop : m_stops )
|
||||
hash = stop.hash( hash );
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
|
||||
#include <qdebug.h>
|
||||
|
@ -38,11 +38,11 @@ class QSK_EXPORT QskGradient
|
||||
Vertical,
|
||||
Diagonal
|
||||
};
|
||||
|
||||
Q_ENUM( Orientation )
|
||||
|
||||
QskGradient();
|
||||
QskGradient( Orientation );
|
||||
QskGradient() noexcept = default;
|
||||
|
||||
QskGradient( Orientation ) noexcept;
|
||||
QskGradient( Qt::GlobalColor );
|
||||
QskGradient( QRgb );
|
||||
QskGradient( const QColor& );
|
||||
@ -58,32 +58,33 @@ class QSK_EXPORT QskGradient
|
||||
|
||||
~QskGradient();
|
||||
|
||||
void setOrientation( Qt::Orientation );
|
||||
void setOrientation( Orientation );
|
||||
Orientation orientation() const;
|
||||
bool operator==( const QskGradient& ) const noexcept;
|
||||
bool operator!=( const QskGradient& ) const noexcept;
|
||||
|
||||
bool isValid() const;
|
||||
Q_INVOKABLE void invalidate();
|
||||
void setOrientation( Qt::Orientation ) noexcept;
|
||||
void setOrientation( Orientation ) noexcept;
|
||||
Orientation orientation() const noexcept;
|
||||
|
||||
bool operator==( const QskGradient& ) const;
|
||||
bool operator!=( const QskGradient& ) const;
|
||||
|
||||
void setColor( const QColor& );
|
||||
void setColors( const QColor&, const QColor& );
|
||||
|
||||
Q_INVOKABLE QColor startColor() const;
|
||||
Q_INVOKABLE QColor endColor() const;
|
||||
bool isValid() const noexcept;
|
||||
bool isMonochrome() const noexcept;
|
||||
bool isVisible() const noexcept;
|
||||
|
||||
Q_INVOKABLE void setStops( const QVector< QskGradientStop >& );
|
||||
Q_INVOKABLE const QVector< QskGradientStop >& stops() const;
|
||||
Q_INVOKABLE const QVector< QskGradientStop >& stops() const noexcept;
|
||||
|
||||
Q_INVOKABLE bool hasStopAt( qreal value ) const;
|
||||
void setStops( const QColor& );
|
||||
void setStops( const QColor&, const QColor& );
|
||||
void setStops( QGradient::Preset );
|
||||
|
||||
void clearStops();
|
||||
|
||||
Q_INVOKABLE bool hasStopAt( qreal value ) const noexcept;
|
||||
|
||||
Q_INVOKABLE QColor startColor() const noexcept;
|
||||
Q_INVOKABLE QColor endColor() const noexcept;
|
||||
|
||||
void setAlpha( int alpha );
|
||||
|
||||
bool isMonochrome() const;
|
||||
bool isVisible() const;
|
||||
|
||||
void reverse();
|
||||
QskGradient reversed() const;
|
||||
|
||||
@ -99,6 +100,7 @@ class QSK_EXPORT QskGradient
|
||||
|
||||
Q_INVOKABLE qreal stopAt( int index ) const;
|
||||
Q_INVOKABLE QColor colorAt( int index ) const;
|
||||
|
||||
Q_INVOKABLE int stopCount() const;
|
||||
|
||||
QGradientStops qtStops() const;
|
||||
@ -109,23 +111,19 @@ class QSK_EXPORT QskGradient
|
||||
private:
|
||||
void updateStatusBits() const;
|
||||
|
||||
private:
|
||||
QVector< QskGradientStop > m_stops;
|
||||
|
||||
int m_orientation : 4;
|
||||
Orientation m_orientation = Vertical;
|
||||
|
||||
mutable bool m_isDirty : 1;
|
||||
mutable bool m_isValid : 1;
|
||||
mutable bool m_isMonchrome : 1;
|
||||
mutable bool m_isVisible : 1;
|
||||
mutable bool m_isDirty = false;
|
||||
mutable bool m_isValid = false;
|
||||
mutable bool m_isMonchrome = true;
|
||||
mutable bool m_isVisible = false;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE( QskGradient )
|
||||
|
||||
inline QskGradient::QskGradient()
|
||||
: QskGradient( Vertical )
|
||||
{
|
||||
}
|
||||
|
||||
inline QskGradient::QskGradient( Qt::GlobalColor color )
|
||||
: QskGradient( QColor( color ) )
|
||||
{
|
||||
@ -141,31 +139,40 @@ inline QskGradient::QskGradient( QGradient::Preset preset )
|
||||
{
|
||||
}
|
||||
|
||||
inline QskGradient::Orientation QskGradient::orientation() const
|
||||
{
|
||||
return static_cast< Orientation >( m_orientation );
|
||||
}
|
||||
|
||||
inline QColor QskGradient::startColor() const
|
||||
{
|
||||
return ( m_stops.size() >= 2 ) ? m_stops.first().color() : QColor();
|
||||
}
|
||||
|
||||
inline QColor QskGradient::endColor() const
|
||||
{
|
||||
return ( m_stops.size() >= 2 ) ? m_stops.last().color() : QColor();
|
||||
}
|
||||
|
||||
inline bool QskGradient::operator==( const QskGradient& other ) const
|
||||
{
|
||||
return ( m_orientation == other.m_orientation ) && ( m_stops == other.m_stops );
|
||||
}
|
||||
|
||||
inline bool QskGradient::operator!=( const QskGradient& other ) const
|
||||
inline bool QskGradient::operator!=( const QskGradient& other ) const noexcept
|
||||
{
|
||||
return ( !( *this == other ) );
|
||||
}
|
||||
|
||||
inline QskGradient::Orientation QskGradient::orientation() const noexcept
|
||||
{
|
||||
return m_orientation;
|
||||
}
|
||||
|
||||
inline const QskGradientStops& QskGradient::stops() const noexcept
|
||||
{
|
||||
#if 1
|
||||
/*
|
||||
Returning a const& so that it is possible to write:
|
||||
for ( const auto& stop : qAsConst( gradient.stops() ) )
|
||||
|
||||
Once we have changed QskGradientStop from QColor to QRgb
|
||||
we should check if there is a better solution possible
|
||||
*/
|
||||
#endif
|
||||
return m_stops;
|
||||
}
|
||||
|
||||
inline QColor QskGradient::startColor() const noexcept
|
||||
{
|
||||
return m_stops.isEmpty() ? QColor() : m_stops.first().color();
|
||||
}
|
||||
|
||||
inline QColor QskGradient::endColor() const noexcept
|
||||
{
|
||||
return m_stops.isEmpty() ? QColor() : m_stops.last().color();
|
||||
}
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
|
||||
class QDebug;
|
||||
|
@ -84,7 +84,7 @@ void QskBoxNode::setBoxData( const QRectF& rect,
|
||||
// Renderer is buggy for monochrome gradients with stops. TODO ...
|
||||
if ( fillGradient.stops().count() > 2 && fillGradient.isMonochrome() )
|
||||
{
|
||||
fillGradient.setColor( fillGradient.startColor() );
|
||||
fillGradient.setStops( fillGradient.startColor() );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user