233 lines
5.2 KiB
C++
233 lines
5.2 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 <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
|
|
|
|
#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
|