qskinny/src/common/QskBoxShapeMetrics.h

250 lines
8.0 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
*****************************************************************************/
#ifndef QSK_BOX_SHAPE_METRICS_H
#define QSK_BOX_SHAPE_METRICS_H
#include "QskGlobal.h"
2018-07-19 14:10:48 +02:00
#include <qmetatype.h>
2018-08-03 08:15:28 +02:00
#include <qnamespace.h>
2018-07-19 14:10:48 +02:00
#include <qsize.h>
class QVariant;
class QSK_EXPORT QskBoxShapeMetrics
{
2018-08-03 08:15:28 +02:00
public:
2020-05-03 14:24:17 +02:00
constexpr QskBoxShapeMetrics() noexcept;
2018-08-03 08:15:28 +02:00
2017-10-18 19:45:56 +02:00
constexpr QskBoxShapeMetrics( qreal topLeft, qreal topRight,
2020-05-03 14:24:17 +02:00
qreal bottomLeft, qreal bottomRight, Qt::SizeMode = Qt::AbsoluteSize ) noexcept;
2017-10-18 19:45:56 +02:00
2020-05-03 14:24:17 +02:00
constexpr QskBoxShapeMetrics(
qreal radius, Qt::SizeMode = Qt::AbsoluteSize ) noexcept;
2020-05-03 14:24:17 +02:00
constexpr QskBoxShapeMetrics( qreal radiusX, qreal radiusY,
Qt::SizeMode = Qt::AbsoluteSize ) noexcept;
2020-05-03 14:24:17 +02:00
constexpr bool operator==( const QskBoxShapeMetrics& ) const noexcept;
constexpr bool operator!=( const QskBoxShapeMetrics& ) const noexcept;
2020-05-03 14:24:17 +02:00
void setRadius( qreal radius ) noexcept;
void setRadius( qreal radius, Qt::SizeMode ) noexcept;
void setRadius( Qt::Corner, qreal radius ) noexcept;
2020-05-03 14:24:17 +02:00
void setRadius( qreal radiusX, qreal radiusY ) noexcept;
void setRadius( const QSizeF& ) noexcept;
void setRadius( Qt::Corner, qreal radiusX, qreal radiusY ) noexcept;
void setRadius( Qt::Corner, const QSizeF& radius ) noexcept;
void setRadius( qreal topLeft, qreal topRight,
2020-05-03 14:24:17 +02:00
qreal bottomLeft, qreal bottomRight ) noexcept;
void setRadius( const QSizeF& topLeft, const QSizeF& topRight,
2020-05-03 14:24:17 +02:00
const QSizeF& bottomLeft, const QSizeF& bottomRight ) noexcept;
void setRadius(
qreal topLeftX, qreal topLeftY,
qreal topRightX, qreal topRightY,
qreal bottomLeftX, qreal bottomLeftY,
2020-05-03 14:24:17 +02:00
qreal bottomRightX, qreal bottomRightY ) noexcept;
2020-05-03 14:24:17 +02:00
constexpr QSizeF radius( Qt::Corner ) const noexcept;
2020-05-03 14:24:17 +02:00
constexpr bool isRectangle() const noexcept;
constexpr bool isRectellipse() const noexcept;
2020-05-03 14:24:17 +02:00
void setSizeMode( Qt::SizeMode ) noexcept;
constexpr Qt::SizeMode sizeMode() const noexcept;
2020-05-03 14:24:17 +02:00
void setAspectRatioMode( Qt::AspectRatioMode ) noexcept;
constexpr Qt::AspectRatioMode aspectRatioMode() const noexcept;
2018-08-03 08:15:28 +02:00
QskBoxShapeMetrics interpolated(
2020-05-03 14:24:17 +02:00
const QskBoxShapeMetrics&, qreal value ) const noexcept;
2018-08-03 08:15:28 +02:00
2020-05-03 14:24:17 +02:00
QskBoxShapeMetrics toAbsolute( const QSizeF& ) const noexcept;
2018-08-03 08:15:28 +02:00
2020-05-04 08:59:44 +02:00
constexpr QskBoxShapeMetrics transposed() const noexcept;
2020-05-03 14:24:17 +02:00
uint hash( uint seed = 0 ) const noexcept;
static QVariant interpolate( const QskBoxShapeMetrics&,
2020-05-03 14:24:17 +02:00
const QskBoxShapeMetrics&, qreal progress ) noexcept;
2018-08-03 08:15:28 +02:00
private:
2020-05-03 14:24:17 +02:00
inline constexpr QskBoxShapeMetrics(
2020-05-04 08:59:44 +02:00
const QSizeF& topLeft, const QSizeF& topRight,
const QSizeF& bottomLeft, const QSizeF& bottomRight,
Qt::SizeMode sizeMode, Qt::AspectRatioMode aspectRatioMode ) noexcept
: m_radii{ topLeft, topRight, bottomLeft, bottomRight }
2018-08-03 08:15:28 +02:00
, m_sizeMode( sizeMode )
2020-05-04 08:59:44 +02:00
, m_aspectRatioMode( aspectRatioMode )
{
}
QSizeF m_radii[ 4 ];
Qt::SizeMode m_sizeMode : 2;
Qt::AspectRatioMode m_aspectRatioMode : 2;
};
2020-05-03 14:24:17 +02:00
inline constexpr QskBoxShapeMetrics::QskBoxShapeMetrics() noexcept
2018-08-03 08:15:28 +02:00
: m_radii{ { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 } }
, m_sizeMode( Qt::AbsoluteSize )
, m_aspectRatioMode( Qt::KeepAspectRatio )
{
}
2020-05-03 14:24:17 +02:00
inline constexpr QskBoxShapeMetrics::QskBoxShapeMetrics(
qreal radius, Qt::SizeMode sizeMode ) noexcept
2018-08-03 08:15:28 +02:00
: QskBoxShapeMetrics( radius, radius, sizeMode )
{
}
2020-05-03 14:24:17 +02:00
inline constexpr QskBoxShapeMetrics::QskBoxShapeMetrics(
qreal radiusX, qreal radiusY, Qt::SizeMode sizeMode ) noexcept
: m_radii{ { radiusX, radiusY }, { radiusX, radiusY },
{ radiusX, radiusY }, { radiusX, radiusY } }
, m_sizeMode( sizeMode )
, m_aspectRatioMode( Qt::KeepAspectRatio )
{
}
2017-10-18 19:45:56 +02:00
inline constexpr QskBoxShapeMetrics::QskBoxShapeMetrics( qreal topLeft, qreal topRight,
2020-05-03 14:24:17 +02:00
qreal bottomLeft, qreal bottomRight, Qt::SizeMode sizeMode ) noexcept
2018-08-03 08:15:28 +02:00
: m_radii{ { topLeft, topLeft }, { topRight, topRight },
{ bottomLeft, bottomLeft }, { bottomRight, bottomRight } }
, m_sizeMode( sizeMode )
, m_aspectRatioMode( Qt::KeepAspectRatio )
2017-10-18 19:45:56 +02:00
{
}
2020-05-03 14:24:17 +02:00
inline constexpr bool QskBoxShapeMetrics::operator==(
const QskBoxShapeMetrics& other ) const noexcept
{
return ( m_sizeMode == other.m_sizeMode )
&& ( m_aspectRatioMode == other.m_aspectRatioMode )
&& ( m_radii[ 0 ] == other.m_radii[ 0 ] )
&& ( m_radii[ 1 ] == other.m_radii[ 1 ] )
&& ( m_radii[ 2 ] == other.m_radii[ 2 ] )
&& ( m_radii[ 3 ] == other.m_radii[ 3 ] );
}
inline constexpr bool QskBoxShapeMetrics::operator!=(
const QskBoxShapeMetrics& other ) const noexcept
{
return !( *this == other );
}
2020-05-03 14:24:17 +02:00
inline void QskBoxShapeMetrics::setRadius( qreal radius ) noexcept
{
setRadius( radius, radius );
}
2020-05-03 14:24:17 +02:00
inline void QskBoxShapeMetrics::setRadius( qreal radius, Qt::SizeMode sizeMode ) noexcept
{
setRadius( radius );
setSizeMode( sizeMode );
}
2020-05-03 14:24:17 +02:00
inline void QskBoxShapeMetrics::setRadius( qreal radiusX, qreal radiusY ) noexcept
{
setRadius( radiusX, radiusY, radiusX, radiusY,
radiusX, radiusY, radiusX, radiusY );
}
2020-05-03 14:24:17 +02:00
inline void QskBoxShapeMetrics::setRadius( const QSizeF& radius ) noexcept
{
setRadius( radius.width(), radius.height() );
}
2020-05-03 14:24:17 +02:00
inline void QskBoxShapeMetrics::setRadius( Qt::Corner corner, qreal radius ) noexcept
{
setRadius( corner, radius, radius );
}
2020-05-03 14:24:17 +02:00
inline void QskBoxShapeMetrics::setRadius( Qt::Corner corner, const QSizeF& radius ) noexcept
{
setRadius( corner, radius.width(), radius.height() );
}
inline void QskBoxShapeMetrics::setRadius(
2020-05-03 14:24:17 +02:00
qreal topLeft, qreal topRight, qreal bottomLeft, qreal bottomRight ) noexcept
{
setRadius( topLeft, topLeft, topRight, topRight,
bottomLeft, bottomLeft, bottomRight, bottomRight );
}
inline void QskBoxShapeMetrics::setRadius(
const QSizeF& topLeft, const QSizeF& topRight,
2020-05-03 14:24:17 +02:00
const QSizeF& bottomLeft, const QSizeF& bottomRight ) noexcept
{
setRadius( topLeft.width(), topLeft.height(),
topRight.width(), topRight.height(),
bottomLeft.width(), bottomLeft.height(),
bottomRight.width(), bottomRight.height() );
}
2020-05-03 14:24:17 +02:00
inline constexpr QSizeF QskBoxShapeMetrics::radius( Qt::Corner corner ) const noexcept
{
2020-05-03 14:24:17 +02:00
return ( ( corner >= 0 ) && ( corner < 4 ) ) ? m_radii[ corner ] : QSizeF();
}
2020-05-03 14:24:17 +02:00
inline void QskBoxShapeMetrics::setSizeMode( Qt::SizeMode sizeMode ) noexcept
{
m_sizeMode = sizeMode;
}
2020-05-03 14:24:17 +02:00
inline constexpr Qt::SizeMode QskBoxShapeMetrics::sizeMode() const noexcept
{
return m_sizeMode;
}
2020-05-03 14:24:17 +02:00
inline void QskBoxShapeMetrics::setAspectRatioMode(
Qt::AspectRatioMode aspectRatioMode ) noexcept
{
m_aspectRatioMode = aspectRatioMode;
}
inline constexpr Qt::AspectRatioMode QskBoxShapeMetrics::aspectRatioMode() const noexcept
{
return m_aspectRatioMode;
}
2020-05-03 14:24:17 +02:00
inline constexpr bool QskBoxShapeMetrics::isRectellipse() const noexcept
{
return ( m_radii[ 1 ] == m_radii[ 0 ] )
&& ( m_radii[ 2 ] == m_radii[ 1 ] )
&& ( m_radii[ 3 ] == m_radii[ 2 ] );
}
inline constexpr bool QskBoxShapeMetrics::isRectangle() const noexcept
{
return ( ( ( m_radii[ 0 ].width() <= 0.0 ) && ( m_radii[ 0 ].height() <= 0.0 ) )
&& ( ( m_radii[ 1 ].width() <= 0.0 ) && ( m_radii[ 1 ].height() <= 0.0 ) )
&& ( ( m_radii[ 2 ].width() <= 0.0 ) && ( m_radii[ 2 ].height() <= 0.0 ) )
&& ( ( m_radii[ 3 ].width() <= 0.0 ) && ( m_radii[ 3 ].height() <= 0.0 ) ) );
}
2020-05-04 08:59:44 +02:00
inline constexpr QskBoxShapeMetrics QskBoxShapeMetrics::transposed() const noexcept
{
return QskBoxShapeMetrics(
m_radii[ 0 ].transposed(), m_radii[ 1 ].transposed(),
m_radii[ 2 ].transposed(), m_radii[ 3 ].transposed(),
m_sizeMode, m_aspectRatioMode );
}
#ifndef QT_NO_DEBUG_STREAM
QSK_EXPORT QDebug operator<<( QDebug, const QskBoxShapeMetrics& );
#endif
Q_DECLARE_TYPEINFO( QskBoxShapeMetrics, Q_MOVABLE_TYPE );
Q_DECLARE_METATYPE( QskBoxShapeMetrics )
#endif