QskRangeControl -> QskBoundedValueControl

This commit is contained in:
Uwe Rathmann 2020-07-25 12:50:26 +02:00
parent 22230365b7
commit 2aadafc34c
9 changed files with 102 additions and 103 deletions

View File

@ -14,7 +14,7 @@ QSK_SUBCONTROL( Speedometer, NeedleHead )
QSK_SUBCONTROL( Speedometer, Needle )
Speedometer::Speedometer( QQuickItem* parent )
: QskRangeControl( parent )
: QskBoundedValueControl( parent )
{
}

View File

@ -6,9 +6,9 @@
#ifndef SPEEDOMETER_H
#define SPEEDOMETER_H
#include <QskRangeControl.h>
#include <QskBoundedValueControl.h>
class Speedometer : public QskRangeControl
class Speedometer : public QskBoundedValueControl
{
Q_OBJECT

View File

@ -49,7 +49,7 @@ Slider::Slider( QQuickItem* parentItem )
setSkinlet( skinlet );
connect( this, &QskRangeControl::valueChanged,
connect( this, &QskSlider::valueChanged,
this, &QskControl::focusIndicatorRectChanged );
}

View File

@ -191,7 +191,7 @@ QRectF SliderSkinlet::fillRect(
auto r = subControlRect( slider, contentsRect, Slider::Scale );
r.setTop( r.bottom() - qskMinorTick );
r.setWidth( r.width() * slider->position() );
r.setWidth( r.width() * slider->valueAsRatio() );
return r;
}
@ -238,7 +238,7 @@ QSGNode* SliderSkinlet::updateScaleNode(
if ( ticksNode == nullptr )
ticksNode = new TicksNode( slider->color( Slider::Scale ) );
const int tickCount = std::floor( slider->range() / slider->stepSize() ) + 1;
const int tickCount = std::floor( slider->boundaryLength() / slider->stepSize() ) + 1;
auto geometry = ticksNode->geometry();
geometry->allocate( tickCount * 2 );
@ -246,7 +246,7 @@ QSGNode* SliderSkinlet::updateScaleNode(
auto vertexData = geometry->vertexDataAsPoint2D();
memset( vertexData, 0, geometry->vertexCount() );
auto stepStride = slider->stepSize() / slider->range() * scaleRect.width();
auto stepStride = slider->stepSize() / slider->boundaryLength() * scaleRect.width();
auto x = scaleRect.x();
const auto y = scaleRect.bottom();
@ -281,11 +281,11 @@ QSGNode* SliderSkinlet::updateDecorationNode(
if ( decorationNode == nullptr )
decorationNode = new QSGTransformNode();
const int tickCount = std::floor( slider->range() / slider->stepSize() ) + 1;
const int tickCount = std::floor( slider->boundaryLength() / slider->stepSize() ) + 1;
auto labelNode = static_cast< QskTextNode* >( decorationNode->firstChild() );
auto stepStride = slider->stepSize() / slider->range() * decorationRect.width();
auto stepStride = slider->stepSize() / slider->boundaryLength() * decorationRect.width();
auto x = decorationRect.x();
const auto y = decorationRect.y();

View File

@ -3,13 +3,13 @@
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskRangeControl.h"
#include "QskBoundedValueControl.h"
#include "QskFunctions.h"
#include "QskIntervalF.h"
QSK_SYSTEM_STATE( QskRangeControl, ReadOnly, ( QskAspect::FirstSystemState << 1 ) )
QSK_SYSTEM_STATE( QskBoundedValueControl, ReadOnly, ( QskAspect::FirstSystemState << 1 ) )
class QskRangeControl::PrivateData
class QskBoundedValueControl::PrivateData
{
public:
PrivateData()
@ -30,7 +30,7 @@ class QskRangeControl::PrivateData
bool snap : 1;
};
QskRangeControl::QskRangeControl( QQuickItem* parent )
QskBoundedValueControl::QskBoundedValueControl( QQuickItem* parent )
: QskControl( parent )
, m_data( new PrivateData() )
{
@ -39,76 +39,66 @@ QskRangeControl::QskRangeControl( QQuickItem* parent )
setWheelEnabled( true );
}
QskRangeControl::~QskRangeControl()
QskBoundedValueControl::~QskBoundedValueControl()
{
}
void QskRangeControl::setMinimum( qreal minimum )
void QskBoundedValueControl::setMinimum( qreal minimum )
{
if ( m_data->minimum == minimum )
return;
const auto oldRange = range();
m_data->minimum = minimum;
Q_EMIT minimumChanged( minimum );
if ( isComponentComplete() )
adjustRangeAndValue( false );
const auto newRange = range();
if ( oldRange != newRange )
Q_EMIT rangeChanged( newRange );
adjustBoundariesAndValue( false );
Q_EMIT boundariesChanged( boundaries() );
update();
}
qreal QskRangeControl::minimum() const
qreal QskBoundedValueControl::minimum() const
{
return m_data->minimum;
}
void QskRangeControl::setMaximum( qreal maximum )
void QskBoundedValueControl::setMaximum( qreal maximum )
{
if ( m_data->maximum == maximum )
return;
const auto oldRange = range();
m_data->maximum = maximum;
Q_EMIT maximumChanged( maximum );
if ( isComponentComplete() )
adjustRangeAndValue( true );
const auto newRange = range();
if ( oldRange != newRange )
Q_EMIT rangeChanged( newRange );
adjustBoundariesAndValue( true );
Q_EMIT boundariesChanged( boundaries() );
update();
}
qreal QskRangeControl::maximum() const
qreal QskBoundedValueControl::maximum() const
{
return m_data->maximum;
}
void QskRangeControl::setInterval( qreal min, qreal max )
void QskBoundedValueControl::setBoundaries( qreal min, qreal max )
{
if ( max < min )
max = min;
if ( min == m_data->minimum && max == m_data->maximum )
return;
const auto oldMin = m_data->minimum;
const auto oldMax = m_data->maximum;
if ( min == oldMin && max == oldMax )
return;
m_data->minimum = min;
m_data->maximum = max;
if ( isComponentComplete() )
adjustRangeAndValue( false );
adjustBoundariesAndValue( false );
if ( m_data->minimum != oldMin )
Q_EMIT minimumChanged( m_data->minimum );
@ -116,24 +106,21 @@ void QskRangeControl::setInterval( qreal min, qreal max )
if ( m_data->maximum != oldMax )
Q_EMIT maximumChanged( m_data->maximum );
const auto newRange = range();
if ( newRange != oldMax - oldMin )
Q_EMIT rangeChanged( newRange );
Q_EMIT boundariesChanged( boundaries() );
update();
}
void QskRangeControl::setInterval( const QskIntervalF& interval )
void QskBoundedValueControl::setBoundaries( const QskIntervalF& boundaries )
{
setInterval( interval.lowerBound(), interval.upperBound() );
setBoundaries( boundaries.lowerBound(), boundaries.upperBound() );
}
QskIntervalF QskRangeControl::interval() const
QskIntervalF QskBoundedValueControl::boundaries() const
{
return QskIntervalF( m_data->minimum, m_data->maximum );
}
void QskRangeControl::adjustRangeAndValue( bool increasing )
void QskBoundedValueControl::adjustBoundariesAndValue( bool increasing )
{
if ( m_data->maximum < m_data->minimum )
{
@ -163,22 +150,28 @@ void QskRangeControl::adjustRangeAndValue( bool increasing )
}
}
qreal QskRangeControl::range() const
qreal QskBoundedValueControl::boundaryLength() const
{
return m_data->maximum - m_data->minimum;
}
qreal QskRangeControl::position() const
{
return ( value() - minimum() ) / range();
}
qreal QskRangeControl::fixupValue( qreal value ) const
qreal QskBoundedValueControl::fixupValue( qreal value ) const
{
return value;
}
void QskRangeControl::setValue( qreal value )
void QskBoundedValueControl::setValueAsRatio( qreal ratio )
{
ratio = qBound( 0.0, ratio, 1.0 );
setValue( m_data->minimum + ratio * ( m_data->maximum - m_data->minimum ) );
}
qreal QskBoundedValueControl::valueAsRatio() const
{
return ( m_data->value - m_data->minimum ) / ( m_data->maximum - m_data->minimum );
}
void QskBoundedValueControl::setValue( qreal value )
{
if ( isComponentComplete() )
{
@ -199,12 +192,12 @@ void QskRangeControl::setValue( qreal value )
}
}
qreal QskRangeControl::value() const
qreal QskBoundedValueControl::value() const
{
return m_data->value;
}
void QskRangeControl::setStepSize( qreal stepSize )
void QskBoundedValueControl::setStepSize( qreal stepSize )
{
if ( qskFuzzyCompare( m_data->stepSize, stepSize ) )
return;
@ -215,12 +208,12 @@ void QskRangeControl::setStepSize( qreal stepSize )
update();
}
qreal QskRangeControl::stepSize() const
qreal QskBoundedValueControl::stepSize() const
{
return m_data->stepSize;
}
void QskRangeControl::setPageSize( int pageSize )
void QskBoundedValueControl::setPageSize( int pageSize )
{
if ( m_data->pageSize == pageSize )
return;
@ -231,12 +224,12 @@ void QskRangeControl::setPageSize( int pageSize )
update();
}
int QskRangeControl::pageSize() const
int QskBoundedValueControl::pageSize() const
{
return m_data->pageSize;
}
void QskRangeControl::setSnap( bool snap )
void QskBoundedValueControl::setSnap( bool snap )
{
if ( m_data->snap == snap )
return;
@ -250,12 +243,12 @@ void QskRangeControl::setSnap( bool snap )
}
}
bool QskRangeControl::snap() const
bool QskBoundedValueControl::snap() const
{
return m_data->snap;
}
void QskRangeControl::setReadOnly( bool readOnly )
void QskBoundedValueControl::setReadOnly( bool readOnly )
{
if ( readOnly == isReadOnly() )
return;
@ -270,32 +263,32 @@ void QskRangeControl::setReadOnly( bool readOnly )
Q_EMIT readOnlyChanged( readOnly );
}
bool QskRangeControl::isReadOnly() const
bool QskBoundedValueControl::isReadOnly() const
{
return skinState() & ReadOnly;
}
void QskRangeControl::stepUp()
void QskBoundedValueControl::stepUp()
{
setValue( m_data->value + m_data->stepSize );
}
void QskRangeControl::stepDown()
void QskBoundedValueControl::stepDown()
{
setValue( m_data->value - m_data->stepSize );
}
void QskRangeControl::pageUp()
void QskBoundedValueControl::pageUp()
{
setValue( m_data->value + m_data->stepSize * m_data->pageSize );
}
void QskRangeControl::pageDown()
void QskBoundedValueControl::pageDown()
{
setValue( m_data->value - m_data->stepSize * m_data->pageSize );
}
void QskRangeControl::keyPressEvent( QKeyEvent* event )
void QskBoundedValueControl::keyPressEvent( QKeyEvent* event )
{
if ( !isReadOnly() )
{
@ -317,7 +310,7 @@ void QskRangeControl::keyPressEvent( QKeyEvent* event )
#ifndef QT_NO_WHEELEVENT
void QskRangeControl::wheelEvent( QWheelEvent* event )
void QskBoundedValueControl::wheelEvent( QWheelEvent* event )
{
if ( isReadOnly() )
return;
@ -336,10 +329,10 @@ void QskRangeControl::wheelEvent( QWheelEvent* event )
#endif
void QskRangeControl::componentComplete()
void QskBoundedValueControl::componentComplete()
{
Inherited::componentComplete();
adjustRangeAndValue( true );
adjustBoundariesAndValue( true );
}
#include "moc_QskRangeControl.cpp"
#include "moc_QskBoundedValueControl.cpp"

View File

@ -3,20 +3,22 @@
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#ifndef QSK_RANGE_CONTROL_H
#define QSK_RANGE_CONTROL_H
#ifndef QSK_BOUNDED_VALUE_CONTROL_H
#define QSK_BOUNDED_VALUE_CONTROL_H
#include "QskControl.h"
class QskIntervalF;
class QSK_EXPORT QskRangeControl : public QskControl
class QSK_EXPORT QskBoundedValueControl : public QskControl
{
Q_OBJECT
Q_PROPERTY( qreal minimum READ minimum WRITE setMinimum NOTIFY minimumChanged )
Q_PROPERTY( qreal maximum READ maximum WRITE setMaximum NOTIFY maximumChanged )
Q_PROPERTY( qreal range READ range NOTIFY rangeChanged )
Q_PROPERTY( QskIntervalF boundaries READ boundaries
WRITE setBoundaries NOTIFY boundariesChanged )
Q_PROPERTY( qreal value READ value WRITE setValue NOTIFY valueChanged )
Q_PROPERTY( qreal stepSize READ stepSize WRITE setStepSize NOTIFY stepSizeChanged )
@ -30,20 +32,22 @@ class QSK_EXPORT QskRangeControl : public QskControl
public:
QSK_STATES( ReadOnly )
QskRangeControl( QQuickItem* parent = nullptr );
~QskRangeControl() override;
QskBoundedValueControl( QQuickItem* parent = nullptr );
~QskBoundedValueControl() override;
qreal minimum() const;
qreal maximum() const;
void setInterval( qreal min, qreal max );
QskIntervalF interval() const;
qreal boundaryLength() const;
qreal range() const;
qreal position() const;
void setBoundaries( qreal min, qreal max );
QskIntervalF boundaries() const;
qreal value() const;
// [0.0, 1.0]
qreal valueAsRatio() const;
qreal stepSize() const;
int pageSize() const;
@ -55,9 +59,12 @@ class QSK_EXPORT QskRangeControl : public QskControl
public Q_SLOTS:
void setValue( qreal );
void setValueAsRatio( qreal );
void setMinimum( qreal );
void setMaximum( qreal );
void setInterval( const QskIntervalF& );
void setBoundaries( const QskIntervalF& );
void setStepSize( qreal );
void setPageSize( int );
@ -67,13 +74,16 @@ class QSK_EXPORT QskRangeControl : public QskControl
void pageDown();
Q_SIGNALS:
void valueChanged( qreal );
void minimumChanged( qreal );
void maximumChanged( qreal );
void rangeChanged( qreal );
void valueChanged( qreal );
void boundariesChanged( const QskIntervalF& );
void stepSizeChanged( qreal );
void pageSizeChanged( qreal );
void snapChanged( bool );
void readOnlyChanged( bool );
protected:
@ -87,7 +97,7 @@ class QSK_EXPORT QskRangeControl : public QskControl
void componentComplete() override;
private:
void adjustRangeAndValue( bool );
void adjustBoundariesAndValue( bool );
class PrivateData;
std::unique_ptr< PrivateData > m_data;

View File

@ -50,13 +50,10 @@ QskSlider::QskSlider( Qt::Orientation orientation, QQuickItem* parent )
else
initSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Minimum );
setMetric( QskSlider::Handle | QskAspect::Position, position() );
setMetric( QskSlider::Handle | QskAspect::Position, valueAsRatio() );
connect( this, &QskRangeControl::rangeChanged,
[ this ]( qreal ) { updatePosition(); } );
connect( this, &QskRangeControl::valueChanged,
[ this ]( qreal ) { updatePosition(); } );
connect( this, &QskSlider::boundariesChanged, [ this ]() { updatePosition(); } );
connect( this, &QskSlider::valueChanged, [ this ]() { updatePosition(); } );
}
QskSlider::~QskSlider()
@ -173,12 +170,12 @@ void QskSlider::mouseMoveEvent( QMouseEvent* event )
if ( m_data->orientation == Qt::Horizontal )
{
const auto distance = event->localPos().x() - m_data->pressedPos.x();
newValue = m_data->pressedValue + distance / r.width() * range();
newValue = m_data->pressedValue + distance / r.width() * boundaryLength();
}
else
{
const auto distance = event->localPos().y() - m_data->pressedPos.y();
newValue = m_data->pressedValue - distance / r.height() * range();
newValue = m_data->pressedValue - distance / r.height() * boundaryLength();
}
setValue( newValue );
@ -199,14 +196,14 @@ void QskSlider::mouseReleaseEvent( QMouseEvent* event )
const qreal w = szHandle.width();
const qreal x = ( pos.x() - rect.x() - w * 0.5 ) / ( rect.width() - w );
up = x > position();
up = x > valueAsRatio();
}
else
{
const qreal h = szHandle.height();
const qreal y = ( pos.y() - rect.y() - h * 0.5 ) / ( rect.height() - h );
up = y < 1.0 - position();
up = y < 1.0 - valueAsRatio();
}
if ( up )
@ -228,9 +225,8 @@ void QskSlider::updatePosition()
const Aspect aspect = QskSlider::Handle | Position | Metric;
const QskAnimationHint hint = animation( aspect | skinState() );
const qreal pos = position();
const auto hint = animation( aspect | skinState() );
const qreal pos = valueAsRatio();
if ( hint.duration > 0 )
{

View File

@ -6,12 +6,12 @@
#ifndef QSK_SLIDER_H
#define QSK_SLIDER_H
#include "QskRangeControl.h"
#include "QskBoundedValueControl.h"
class QSGNode;
class QskSkin;
class QSK_EXPORT QskSlider : public QskRangeControl
class QSK_EXPORT QskSlider : public QskBoundedValueControl
{
Q_OBJECT
@ -22,7 +22,7 @@ class QSK_EXPORT QskSlider : public QskRangeControl
Q_PROPERTY( bool tracking READ isTracking WRITE setTracking NOTIFY trackingChanged )
using Inherited = QskRangeControl;
using Inherited = QskBoundedValueControl;
public:
QSK_SUBCONTROLS( Panel, Groove, Fill, Scale, Handle )

View File

@ -110,6 +110,7 @@ HEADERS += \
controls/QskAbstractButton.h \
controls/QskAnimationHint.h \
controls/QskAnimator.h \
controls/QskBoundedValueControl.h \
controls/QskBox.h \
controls/QskBoxSkinlet.h \
controls/QskControl.h \
@ -138,7 +139,6 @@ HEADERS += \
controls/QskQuick.h \
controls/QskQuickItem.h \
controls/QskQuickItemPrivate.h \
controls/QskRangeControl.h \
controls/QskScrollArea.h \
controls/QskScrollBox.h \
controls/QskScrollView.h \
@ -178,6 +178,7 @@ HEADERS += \
SOURCES += \
controls/QskAbstractButton.cpp \
controls/QskAnimator.cpp \
controls/QskBoundedValueControl.cpp \
controls/QskBox.cpp \
controls/QskBoxSkinlet.cpp \
controls/QskControl.cpp \
@ -206,7 +207,6 @@ SOURCES += \
controls/QskQuick.cpp \
controls/QskQuickItem.cpp \
controls/QskQuickItemPrivate.cpp \
controls/QskRangeControl.cpp \
controls/QskScrollArea.cpp \
controls/QskScrollBox.cpp \
controls/QskScrollView.cpp \