qskinny/src/controls/QskBoundedRangeInput.cpp
2020-08-09 11:50:34 +02:00

140 lines
3.3 KiB
C++

/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskBoundedRangeInput.h"
#include "QskIntervalF.h"
#include "QskFunctions.h"
QskBoundedRangeInput::QskBoundedRangeInput( QQuickItem* parent )
: QskBoundedInput( parent )
{
}
QskBoundedRangeInput::QskBoundedRangeInput(
const QskIntervalF& range, QQuickItem* parent )
: QskBoundedInput( parent )
, m_range( range )
{
}
QskBoundedRangeInput::~QskBoundedRangeInput()
{
}
void QskBoundedRangeInput::setLowerValueAsRatio( qreal ratio )
{
ratio = qBound( 0.0, ratio, 1.0 );
setLowerValue( minimum() + ratio * boundaryLength() );
}
qreal QskBoundedRangeInput::lowerValueAsRatio() const
{
return ( lowerValue() - minimum() ) / boundaryLength();
}
void QskBoundedRangeInput::setUpperValueAsRatio( qreal ratio )
{
ratio = qBound( 0.0, ratio, 1.0 );
setUpperValue( minimum() + ratio * boundaryLength() );
}
qreal QskBoundedRangeInput::upperValueAsRatio() const
{
return ( upperValue() - minimum() ) / boundaryLength();
}
void QskBoundedRangeInput::setLowerValue( qreal value )
{
if ( isComponentComplete() )
{
value = std::min( value, m_range.upperBound() );
value = boundedValue( value );
}
setRange( QskIntervalF( value, m_range.upperBound() ) );
}
qreal QskBoundedRangeInput::lowerValue() const
{
return m_range.lowerBound();
}
void QskBoundedRangeInput::setUpperValue( qreal value )
{
if ( isComponentComplete() )
{
value = std::max( m_range.lowerBound(), value );
value = boundedValue( value );
}
setRange( QskIntervalF( m_range.lowerBound(), value ) );
}
qreal QskBoundedRangeInput::upperValue() const
{
return m_range.upperBound();
}
void QskBoundedRangeInput::setRange( qreal lowerValue, qreal upperValue )
{
setRange( QskIntervalF( lowerValue, upperValue ) );
}
void QskBoundedRangeInput::setRange( const QskIntervalF& range )
{
auto newRange = range;
if ( isComponentComplete() )
{
newRange = alignedInterval( newRange );
newRange = fixupRange( newRange );
}
setRangeInternal( range );
}
void QskBoundedRangeInput::resetRange()
{
if ( m_range.isValid() )
{
m_range.invalidate();
Q_EMIT rangeChanged( m_range );
}
}
void QskBoundedRangeInput::setRangeInternal( const QskIntervalF& range )
{
if ( range != m_range )
{
const auto oldRange = m_range;
m_range = range;
if ( !qskFuzzyCompare( m_range.lowerBound(), oldRange.lowerBound() ) )
Q_EMIT lowerValueChanged( m_range.lowerBound() );
if ( !qskFuzzyCompare( m_range.upperBound(), oldRange.upperBound() ) )
Q_EMIT upperValueChanged( m_range.upperBound() );
Q_EMIT rangeChanged( m_range );
}
}
QskIntervalF QskBoundedRangeInput::range() const
{
return m_range;
}
void QskBoundedRangeInput::alignInput()
{
setRangeInternal( alignedInterval( m_range ) );
}
QskIntervalF QskBoundedRangeInput::fixupRange( const QskIntervalF& range ) const
{
return range;
}
#include "moc_QskBoundedRangeInput.cpp"