qskinny/src/common/QskBoxBorderColors.cpp

233 lines
5.1 KiB
C++
Raw Normal View History

/******************************************************************************
* 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>
2018-07-19 14:10:48 +02:00
#include <qvariant.h>
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
2018-07-19 14:10:48 +02:00
#include <qdebug.h>
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