qskinny/src/common/QskBoxOptions.cpp

116 lines
3.3 KiB
C++
Raw Normal View History

2017-07-21 16:21:34 +00:00
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskBoxOptions.h"
#include <qhashfunctions.h>
QskBoxOptions::QskBoxOptions():
radius( { 0, 0, 0, 0, 0, 0, 0, 0 } ),
color( { 0, 0, 0, 0, 0, 0, 0, 0 } )
{
}
uint QskBoxOptions::metricsHash( uint seed ) const
{
return qHashBits( this, 2 * sizeof( QMarginsF ) + 8 * sizeof( qreal ), seed );
}
uint QskBoxOptions::colorsHash( uint seed ) const
{
return qHashBits( &color, 8 * sizeof( QRgb ), seed );
}
void QskBoxOptions::setBorder( qreal width )
{
borders = QMarginsF( width, width, width, width );
}
void QskBoxOptions::setBorder( qreal left, qreal top, qreal right, qreal bottom )
{
borders = QMarginsF( left, top, right, bottom );
}
void QskBoxOptions::setRadius( qreal radius )
{
this->radius = { radius, radius, radius, radius, radius, radius, radius, radius };
}
void QskBoxOptions::setBorderRgb( QRgb rgb )
{
color.borderLeft = color.borderTop =
color.borderRight = color.borderBottom = rgb;
}
void QskBoxOptions::setBorderRgb( QRgb rgbLeft, QRgb rgbTop,
QRgb rgbRight, QRgb rgbBottom )
{
color.borderLeft = rgbLeft;
color.borderTop = rgbTop;
color.borderRight = rgbRight;
color.borderBottom = rgbBottom;
}
void QskBoxOptions::setFillRgb( QRgb rgb )
{
color.fillTopLeft = color.fillTopRight =
color.fillBottomRight = color.fillBottomLeft = rgb;
}
void QskBoxOptions::setFillRgb( QRgb rgbTopLeft, QRgb rgbTopRight,
QRgb rgbBottomRight, QRgb rgbBottomLeft )
{
color.fillTopLeft = rgbTopLeft;
color.fillTopRight = rgbTopRight;
color.fillBottomRight = rgbBottomRight;
color.fillBottomLeft = rgbBottomLeft;
}
bool QskBoxOptions::isVisible() const
{
if ( qAlpha( color.fillTopLeft ) ||
qAlpha( color.fillTopRight ) ||
qAlpha( color.fillBottomRight ) ||
qAlpha( color.fillBottomLeft ) )
{
return true;
}
if ( ( borders.left() && qAlpha( color.borderLeft ) ) ||
( borders.top() && qAlpha( color.borderTop ) ) ||
( borders.right() && qAlpha( color.borderRight ) ) ||
( borders.bottom() && qAlpha( color.borderBottom ) ) )
{
return true;
}
return false;
}
QMarginsF QskBoxOptions::padding() const
{
const qreal left = std::max( radius.topLeftX, radius.bottomLeftX );
const qreal top = std::max( radius.topLeftY, radius.topRightY );
const qreal right = std::max( radius.topRightX, radius.bottomRightX );
const qreal bottom = std::max( radius.bottomRightY, radius.bottomLeftY );
return QMarginsF( std::max( 0.0, left ), std::max( 0.0, top ),
std::max( 0.0, right ), std::max( 0.0, bottom ) );
}
QMarginsF QskBoxOptions::unitedMargins() const
{
const QMarginsF pad = padding();
// what the heck is this extra offset about - TODO ...
const QMarginsF extra(
std::max( 0.0, pad.left() - shadows.left() ) + 0.5,
std::max( 0.0, pad.top() - shadows.top() ) + 0.5,
std::max( 0.0, pad.right() - shadows.right() ) + 0.5,
std::max( 0.0, pad.bottom() - shadows.bottom() ) + 0.5
);
return borders + shadows + pad + extra;
}