2021-10-20 05:50:25 +00:00
|
|
|
/******************************************************************************
|
2023-04-06 07:23:37 +00:00
|
|
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
2021-10-20 05:50:25 +00:00
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
#include "QskArcMetrics.h"
|
2023-04-13 07:25:02 +00:00
|
|
|
#include "QskFunctions.h"
|
2021-10-20 05:50:25 +00:00
|
|
|
|
|
|
|
#include <qhashfunctions.h>
|
|
|
|
#include <qvariant.h>
|
|
|
|
|
|
|
|
static void qskRegisterArcMetrics()
|
|
|
|
{
|
|
|
|
qRegisterMetaType< QskArcMetrics >();
|
2022-03-30 16:30:22 +00:00
|
|
|
|
|
|
|
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
|
|
|
QMetaType::registerEqualsComparator< QskArcMetrics >();
|
|
|
|
#endif
|
2021-10-20 05:50:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Q_CONSTRUCTOR_FUNCTION( qskRegisterArcMetrics )
|
|
|
|
|
|
|
|
static inline qreal qskInterpolated( qreal from, qreal to, qreal ratio )
|
|
|
|
{
|
|
|
|
return from + ( to - from ) * ratio;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline qreal qskAbsoluted( qreal length, qreal percentage )
|
|
|
|
{
|
|
|
|
// 100% means -> 0.5 of length
|
|
|
|
percentage = qBound( 0.0, percentage, 100.0 );
|
|
|
|
return percentage / 100.0 * 0.5 * length;
|
|
|
|
}
|
|
|
|
|
2023-04-11 11:04:10 +00:00
|
|
|
void QskArcMetrics::setThickness( qreal thickness ) noexcept
|
2021-10-20 05:50:25 +00:00
|
|
|
{
|
2023-04-11 11:04:10 +00:00
|
|
|
m_thickness = thickness;
|
2021-10-20 05:50:25 +00:00
|
|
|
}
|
|
|
|
|
2021-10-20 07:27:05 +00:00
|
|
|
void QskArcMetrics::setStartAngle( qreal startAngle ) noexcept
|
2021-10-20 05:50:25 +00:00
|
|
|
{
|
2023-04-13 07:25:02 +00:00
|
|
|
m_startAngle = qskConstrainedDegrees( startAngle );
|
2021-10-20 05:50:25 +00:00
|
|
|
}
|
|
|
|
|
2021-10-20 07:27:05 +00:00
|
|
|
void QskArcMetrics::setSpanAngle( qreal spanAngle ) noexcept
|
2021-10-20 05:50:25 +00:00
|
|
|
{
|
2023-04-13 07:25:02 +00:00
|
|
|
m_spanAngle = qBound( -360.0, spanAngle, 360.0 );
|
2021-10-20 05:50:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void QskArcMetrics::setSizeMode( Qt::SizeMode sizeMode ) noexcept
|
|
|
|
{
|
|
|
|
m_sizeMode = sizeMode;
|
|
|
|
}
|
|
|
|
|
2023-04-13 07:25:02 +00:00
|
|
|
bool QskArcMetrics::containsAngle( qreal angle ) const
|
|
|
|
{
|
|
|
|
angle = qskConstrainedDegrees( angle );
|
|
|
|
|
|
|
|
if ( m_spanAngle >= 0.0 )
|
|
|
|
{
|
|
|
|
if ( angle < m_startAngle )
|
|
|
|
angle += 360.0;
|
|
|
|
|
|
|
|
return ( angle >= m_startAngle ) && ( angle <= m_startAngle + m_spanAngle );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( angle > m_startAngle )
|
|
|
|
angle -= 360.0;
|
|
|
|
|
|
|
|
return ( angle <= m_startAngle ) && ( angle >= m_startAngle + m_spanAngle );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-10-20 05:50:25 +00:00
|
|
|
QskArcMetrics QskArcMetrics::interpolated(
|
|
|
|
const QskArcMetrics& to, qreal ratio ) const noexcept
|
|
|
|
{
|
|
|
|
if ( ( *this == to ) || ( m_sizeMode != to.m_sizeMode ) )
|
|
|
|
return to;
|
|
|
|
|
2023-04-11 11:04:10 +00:00
|
|
|
const qreal thickness = qskInterpolated( m_thickness, to.m_thickness, ratio );
|
2021-10-20 07:27:05 +00:00
|
|
|
|
|
|
|
const qreal s1 = qskInterpolated( m_startAngle, to.m_startAngle, ratio );
|
|
|
|
const qreal s2 = qskInterpolated( endAngle(), to.endAngle(), ratio );
|
|
|
|
|
2023-04-11 11:04:10 +00:00
|
|
|
return QskArcMetrics( s1, s2 - s1, thickness, m_sizeMode );
|
2021-10-20 05:50:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
QVariant QskArcMetrics::interpolate(
|
|
|
|
const QskArcMetrics& from, const QskArcMetrics& to,
|
|
|
|
qreal progress )
|
|
|
|
{
|
|
|
|
return QVariant::fromValue( from.interpolated( to, progress ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
QskArcMetrics QskArcMetrics::toAbsolute( const QSizeF& size ) const noexcept
|
2023-04-12 10:18:32 +00:00
|
|
|
{
|
|
|
|
if ( size.width() < 0.0 )
|
|
|
|
return toAbsolute( size.height() );
|
|
|
|
|
|
|
|
if ( size.height() < 0.0 )
|
|
|
|
return toAbsolute( size.width() );
|
|
|
|
|
|
|
|
return toAbsolute( qMin( size.width(), size.height() ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
QskArcMetrics QskArcMetrics::toAbsolute( qreal size ) const noexcept
|
2021-10-20 05:50:25 +00:00
|
|
|
{
|
|
|
|
if ( m_sizeMode != Qt::RelativeSize )
|
|
|
|
return *this;
|
|
|
|
|
2021-10-20 07:27:05 +00:00
|
|
|
QskArcMetrics absoluted = *this;
|
2021-10-20 05:50:25 +00:00
|
|
|
|
2023-04-12 10:18:32 +00:00
|
|
|
if ( size <= 0.0 )
|
2023-04-11 11:04:10 +00:00
|
|
|
absoluted.m_thickness = 0.0;
|
2021-10-20 05:50:25 +00:00
|
|
|
else
|
2023-04-12 10:18:32 +00:00
|
|
|
absoluted.m_thickness = qskAbsoluted( size, absoluted.m_thickness );
|
2021-10-20 05:50:25 +00:00
|
|
|
|
|
|
|
absoluted.m_sizeMode = Qt::AbsoluteSize;
|
|
|
|
|
|
|
|
return absoluted;
|
|
|
|
}
|
|
|
|
|
2022-03-25 09:28:06 +00:00
|
|
|
QskHashValue QskArcMetrics::hash( QskHashValue seed ) const noexcept
|
2021-10-20 05:50:25 +00:00
|
|
|
{
|
2023-04-11 11:04:10 +00:00
|
|
|
auto hash = qHash( m_thickness, seed );
|
2021-10-20 05:50:25 +00:00
|
|
|
hash = qHash( m_startAngle, hash );
|
|
|
|
hash = qHash( m_spanAngle, hash );
|
2021-10-20 07:27:05 +00:00
|
|
|
|
2021-10-20 05:50:25 +00:00
|
|
|
const int mode = m_sizeMode;
|
|
|
|
return qHashBits( &mode, sizeof( mode ), hash );
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef QT_NO_DEBUG_STREAM
|
|
|
|
|
|
|
|
#include <qdebug.h>
|
|
|
|
|
|
|
|
QDebug operator<<( QDebug debug, const QskArcMetrics& metrics )
|
|
|
|
{
|
|
|
|
QDebugStateSaver saver( debug );
|
|
|
|
debug.nospace();
|
|
|
|
|
2021-10-20 10:42:48 +00:00
|
|
|
debug << "QskArcMetrics" << '(';
|
2023-04-11 11:04:10 +00:00
|
|
|
debug << metrics.thickness() << ',' << metrics.sizeMode();
|
2021-10-20 10:42:48 +00:00
|
|
|
debug << ",[" << metrics.startAngle() << ',' << metrics.spanAngle() << ']';
|
2021-10-20 05:50:25 +00:00
|
|
|
debug << ')';
|
|
|
|
|
|
|
|
return debug;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "moc_QskArcMetrics.cpp"
|