216 lines
5.4 KiB
C++
Raw Normal View History

2019-06-20 12:02:28 +02:00
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the 3-clause BSD License
*****************************************************************************/
#include "Box.h"
#include <QskBoxBorderColors.h>
2018-08-03 08:15:28 +02:00
#include <QskBoxBorderMetrics.h>
#include <QskBoxShapeMetrics.h>
2022-06-25 16:14:08 +02:00
#include <QskHctColor.h>
2022-10-20 09:23:19 +02:00
#include <QskRgbValue.h>
2018-08-03 08:15:28 +02:00
Box::Box( QQuickItem* parentItem )
: QskBox( parentItem )
{
setSizePolicy( QskSizePolicy::Ignored, QskSizePolicy::Ignored );
// decoupling the hints from the skin
setBoxShapeHint( QskBox::Panel, QskBoxShapeMetrics() );
2017-10-18 20:00:06 +02:00
setBoxBorderMetricsHint( QskBox::Panel, QskBoxBorderMetrics() );
setBoxBorderColorsHint( QskBox::Panel, QskBoxBorderColors() );
setGradientHint( QskBox::Panel, QskGradient() );
}
2022-06-25 16:14:08 +02:00
void Box::setBackground( FillType type, QGradient::Preset preset, bool inverted )
{
if ( type == Unfilled )
{
setGradient( QskGradient() );
return;
}
2022-06-25 16:14:08 +02:00
QskGradient gradient( preset );
2022-06-25 16:14:08 +02:00
if ( type == Solid )
{
2022-10-20 09:23:19 +02:00
const auto color = QskRgb::interpolated(
gradient.startColor(), gradient.endColor(), 0.5 );
2022-06-25 16:14:08 +02:00
setGradient( QskGradient( color ) );
}
else
{
2022-06-25 16:14:08 +02:00
const auto orientation =
static_cast< QskGradient::Orientation >( type - 2 );
2022-06-25 16:14:08 +02:00
gradient.setOrientation( orientation );
2022-06-25 16:14:08 +02:00
if ( inverted )
gradient.reverse();
2022-06-25 16:14:08 +02:00
setGradient( gradient );
}
}
2022-06-25 16:14:08 +02:00
void Box::setBackground( FillType type, const QRgb base, bool inverted )
{
2022-06-25 16:14:08 +02:00
if ( type == Unfilled )
{
setGradient( QskGradient() );
return;
}
const QskHctColor htcColor( base );
2022-06-25 16:14:08 +02:00
if ( type == Solid )
{
setGradient( htcColor.toned( 50 ).rgb() );
2022-06-25 16:14:08 +02:00
}
else
{
const auto dark = htcColor.toned( 40 ).rgb();
const auto light = htcColor.toned( 70 ).rgb();
2022-06-25 16:14:08 +02:00
const auto orientation =
static_cast< QskGradient::Orientation >( type - 2 );
2022-06-25 16:14:08 +02:00
if ( inverted )
setGradient( orientation, dark, light );
else
setGradient( orientation, light, dark );
}
}
void Box::setBorder( BorderType type, const QRgb base )
{
setBorderWidth( 5 );
2022-06-25 16:14:08 +02:00
switch ( static_cast< int >( type ) )
{
case NoBorder:
setBorderWidth( 0 );
2022-06-25 16:14:08 +02:00
return;
case Flat:
2022-06-25 16:14:08 +02:00
setBorderGradient( base );
return;
}
const QskHctColor htcColor( base );
2022-06-25 16:14:08 +02:00
const auto dark = htcColor.toned( 40 ).rgb();
const auto mid = htcColor.toned( 65 ).rgb();
const auto light = htcColor.toned( 90 ).rgb();
2022-06-25 16:14:08 +02:00
switch ( static_cast< int >( type ) )
{
case Raised1:
setBorderGradients( light, light, dark, dark );
break;
case Sunken1:
setBorderGradients( dark, dark, light, light );
break;
case Raised2:
setBorderGradients( mid, light, mid, dark );
break;
case Sunken2:
setBorderGradients( mid, dark, mid, light );
break;
}
}
void Box::setShape( const QskBoxShapeMetrics& shape )
{
setBoxShapeHint( QskBox::Panel, shape );
}
void Box::setShape( qreal radius, Qt::SizeMode sizeMode )
{
2018-08-03 08:15:28 +02:00
setBoxShapeHint( QskBox::Panel, QskBoxShapeMetrics( radius, sizeMode ) );
}
void Box::setShape( qreal radiusX, qreal radiusY, Qt::SizeMode sizeMode )
{
setBoxShapeHint( QskBox::Panel,
QskBoxShapeMetrics( radiusX, radiusY, sizeMode ) );
}
void Box::setBorderGradients( const QskGradient& left, const QskGradient& top,
const QskGradient& right, const QskGradient& bottom )
{
QskBoxBorderColors colors( left, top, right, bottom );
2017-10-18 20:00:06 +02:00
setBoxBorderColorsHint( QskBox::Panel, colors );
}
void Box::setBorderGradient( const QskGradient& gradient )
{
setBoxBorderColorsHint( QskBox::Panel, gradient );
}
void Box::setBorderWidth( qreal left, qreal top, qreal right, qreal bottom )
{
2017-10-18 20:00:06 +02:00
setBoxBorderMetricsHint( QskBox::Panel,
QskMargins( left, top, right, bottom ) );
}
void Box::setBorderWidth( int width )
{
2017-10-18 20:00:06 +02:00
setBoxBorderMetricsHint( QskBox::Panel, QskMargins( width ) );
}
void Box::setGradient( QRgb rgb )
{
setGradient( QskGradient( QColor::fromRgba( rgb ) ) );
}
void Box::setGradient( Qt::GlobalColor color )
{
setGradient( QskGradient( color ) );
}
void Box::setGradient( const QColor& color )
{
setGradient( QskGradient( color ) );
}
void Box::setGradient( QskGradient::Orientation orientation,
const QColor& color1, const QColor& color2 )
{
setGradient( QskGradient( orientation, color1, color2 ) );
}
void Box::setGradient( QskGradient::Orientation orientation,
const QColor& color1, const QColor& color2, const QColor& color3 )
{
2021-09-17 13:35:47 +02:00
QskGradientStops stops;
stops += QskGradientStop( 0.0, color1 );
stops += QskGradientStop( 0.5, color2 );
stops += QskGradientStop( 1.0, color3 );
setGradient( QskGradient( orientation, stops ) );
}
void Box::setGradient( const QskGradient& gradient )
{
setGradientHint( QskBox::Panel, gradient );
}
void Box::setGradient(
2022-06-25 16:14:08 +02:00
const QskGradient::Orientation orientation, const QRgb base )
{
const QskHctColor hctColor( base );
2022-06-25 16:14:08 +02:00
QVector< QRgb > rgb;
rgb.reserve( 10 );
for ( int i = 0; i < 10; i++ )
rgb += hctColor.toned( 90 - i * 7 ).rgb();
2022-06-25 16:14:08 +02:00
setGradient( QskGradient( orientation, QskGradient::colorStops( rgb, true ) ) );
}