qskinny/src/common/QskBoxBorderColors.cpp
Uwe Rathmann 6479937294 All box subcontrols are displayd with vertex lists instead of textures
now. Implementation is almost complete beside of the not yet done Qt
antialiasing mode. Not all sort of linear gradients ( see
QLinearGradients ) are implemented - needs 1-2 days more.
The aspect flags for box primitives have been substantially changed from
too atomic to more strutured units.
The skins are currently incomplete - will be fixed later.
2017-10-17 17:29:02 +02:00

231 lines
5.1 KiB
C++

/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskBoxBorderColors.h"
#include "QskRgbValue.h"
#include <qhashfunctions.h>
#include <QDebug>
static void qskRegisterBoxBorderColors()
{
qRegisterMetaType< QskBoxBorderColors >();
}
Q_CONSTRUCTOR_FUNCTION( qskRegisterBoxBorderColors )
static inline bool qskIsVisble( const QColor& c )
{
return c.isValid() && ( c.alpha() > 0 );
}
static inline void qskSetColors( const QColor& c, QColor* colors )
{
colors[0] = colors[1] = colors[2] = colors[3] = c.toRgb();
}
static inline void qskSetColors(
const QColor& left, const QColor& top,
const QColor& right, const QColor& bottom, QColor* colors )
{
colors[ Qsk::Left ] = left.toRgb();
colors[ Qsk::Top ] = top.toRgb();
colors[ Qsk::Right ] = right.toRgb();
colors[ Qsk::Bottom ] = bottom.toRgb();
}
QskBoxBorderColors::QskBoxBorderColors()
{
}
QskBoxBorderColors::QskBoxBorderColors(
const QColor& left, const QColor& top,
const QColor& right, const QColor& bottom )
{
qskSetColors( left, top, right, bottom, m_colors );
}
QskBoxBorderColors::QskBoxBorderColors( const QColor& color )
{
qskSetColors( color, m_colors );
}
QskBoxBorderColors::~QskBoxBorderColors()
{
}
bool QskBoxBorderColors::operator==( const QskBoxBorderColors& other ) const
{
return ( m_colors[0] == other.m_colors[0] )
&& ( m_colors[1] == other.m_colors[1] )
&& ( m_colors[2] == other.m_colors[2] )
&& ( m_colors[3] == other.m_colors[3] );
}
void QskBoxBorderColors::setAlpha( int alpha )
{
for ( int i = 0; i < 4; i++ )
{
if ( m_colors[i].isValid() && m_colors[i].alpha() )
m_colors[i].setAlpha( alpha );
}
}
void QskBoxBorderColors::setColors( const QColor& color )
{
qskSetColors( color, m_colors );
}
void QskBoxBorderColors::setColors(
const QColor& left, const QColor& top,
const QColor& right, const QColor& bottom )
{
qskSetColors( left, top, right, bottom, m_colors );
}
void QskBoxBorderColors::setColor(
Qsk::Position position, const QColor& color )
{
m_colors[ position ] = color.toRgb();
}
void QskBoxBorderColors::setColorsAt( Qt::Edges edges, const QColor& color )
{
const QColor c = color.toRgb();
if ( edges & Qt::TopEdge )
m_colors[ Qsk::Top ] = c;
if ( edges & Qt::LeftEdge )
m_colors[ Qsk::Left ] = c;
if ( edges & Qt::RightEdge )
m_colors[ Qsk::Right ] = c;
if ( edges & Qt::BottomEdge )
m_colors[ Qsk::Bottom ] = c;
}
QColor QskBoxBorderColors::colorAt( Qt::Edge edge ) const
{
switch( edge )
{
case Qt::TopEdge:
return m_colors[ Qsk::Top ];
case Qt::LeftEdge:
return m_colors[ Qsk::Left ];
case Qt::RightEdge:
return m_colors[ Qsk::Right ];
case Qt::BottomEdge:
return m_colors[ Qsk::Bottom ];
}
return QColor();
}
bool QskBoxBorderColors::isVisible() const
{
if ( qskIsVisble( m_colors[0] ) )
return true;
if ( qskIsVisble( m_colors[1] ) )
return true;
if ( qskIsVisble( m_colors[2] ) )
return true;
if ( qskIsVisble( m_colors[3] ) )
return true;
return false;
}
bool QskBoxBorderColors::isMonochrome() const
{
if ( m_colors[1] != m_colors[0] )
return false;
if ( m_colors[2] != m_colors[1] )
return false;
if ( m_colors[3] != m_colors[2] )
return false;
return true;
}
QskBoxBorderColors QskBoxBorderColors::interpolated(
const QskBoxBorderColors& to, qreal ratio ) const
{
QskBoxBorderColors colors;
for ( size_t i = 0; i < 4; i++ )
{
colors.m_colors[i] = QskRgbValue::interpolated(
m_colors[i], to.m_colors[i], ratio );
}
return colors;
}
QVariant QskBoxBorderColors::interpolate(
const QskBoxBorderColors& from, const QskBoxBorderColors& to, qreal ratio )
{
return QVariant::fromValue( from.interpolated( to, ratio ) );
}
uint QskBoxBorderColors::hash( uint seed ) const
{
const QRgb rgb[] =
{
m_colors[0].rgba(),
m_colors[1].rgba(),
m_colors[2].rgba(),
m_colors[3].rgba(),
};
return qHashBits( rgb, sizeof( rgb ), seed );
}
#ifndef QT_NO_DEBUG_STREAM
static inline void qskDebugColor( QDebug debug, const QColor& c )
{
debug << '('
<< c.red() << ','
<< c.green() << ','
<< c.blue() << ','
<< c.alpha() << ')';
}
QDebug operator<<( QDebug debug, const QskBoxBorderColors& colors )
{
QDebugStateSaver saver( debug );
debug.nospace();
debug << "BoxBorderColors" << '(';
debug << " L";
qskDebugColor( debug, colors.color( Qsk::Left ) );
debug << ", T";
qskDebugColor( debug, colors.color( Qsk::Top ) );
debug << ", R";
qskDebugColor( debug, colors.color( Qsk::Right ) );
debug << ", B";
qskDebugColor( debug, colors.color( Qsk::Bottom ) );
debug << " )";
return debug;
}
#endif