From 2aadafc34c0dc932a45a967d415a1d318ab796c3 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Sat, 25 Jul 2020 12:50:26 +0200 Subject: [PATCH] QskRangeControl -> QskBoundedValueControl --- examples/automotive/Speedometer.cpp | 2 +- examples/automotive/Speedometer.h | 4 +- examples/sliders/Slider.cpp | 2 +- examples/sliders/SliderSkinlet.cpp | 10 +- ...Control.cpp => QskBoundedValueControl.cpp} | 117 ++++++++---------- ...angeControl.h => QskBoundedValueControl.h} | 38 +++--- src/controls/QskSlider.cpp | 22 ++-- src/controls/QskSlider.h | 6 +- src/src.pro | 4 +- 9 files changed, 102 insertions(+), 103 deletions(-) rename src/controls/{QskRangeControl.cpp => QskBoundedValueControl.cpp} (67%) rename src/controls/{QskRangeControl.h => QskBoundedValueControl.h} (74%) diff --git a/examples/automotive/Speedometer.cpp b/examples/automotive/Speedometer.cpp index f9670d52..d027f935 100644 --- a/examples/automotive/Speedometer.cpp +++ b/examples/automotive/Speedometer.cpp @@ -14,7 +14,7 @@ QSK_SUBCONTROL( Speedometer, NeedleHead ) QSK_SUBCONTROL( Speedometer, Needle ) Speedometer::Speedometer( QQuickItem* parent ) - : QskRangeControl( parent ) + : QskBoundedValueControl( parent ) { } diff --git a/examples/automotive/Speedometer.h b/examples/automotive/Speedometer.h index 496ff407..622664c0 100644 --- a/examples/automotive/Speedometer.h +++ b/examples/automotive/Speedometer.h @@ -6,9 +6,9 @@ #ifndef SPEEDOMETER_H #define SPEEDOMETER_H -#include +#include -class Speedometer : public QskRangeControl +class Speedometer : public QskBoundedValueControl { Q_OBJECT diff --git a/examples/sliders/Slider.cpp b/examples/sliders/Slider.cpp index 9cde8bda..2e079990 100644 --- a/examples/sliders/Slider.cpp +++ b/examples/sliders/Slider.cpp @@ -49,7 +49,7 @@ Slider::Slider( QQuickItem* parentItem ) setSkinlet( skinlet ); - connect( this, &QskRangeControl::valueChanged, + connect( this, &QskSlider::valueChanged, this, &QskControl::focusIndicatorRectChanged ); } diff --git a/examples/sliders/SliderSkinlet.cpp b/examples/sliders/SliderSkinlet.cpp index 3610f30b..534973bd 100644 --- a/examples/sliders/SliderSkinlet.cpp +++ b/examples/sliders/SliderSkinlet.cpp @@ -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(); diff --git a/src/controls/QskRangeControl.cpp b/src/controls/QskBoundedValueControl.cpp similarity index 67% rename from src/controls/QskRangeControl.cpp rename to src/controls/QskBoundedValueControl.cpp index 5e75140f..bed20244 100644 --- a/src/controls/QskRangeControl.cpp +++ b/src/controls/QskBoundedValueControl.cpp @@ -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" diff --git a/src/controls/QskRangeControl.h b/src/controls/QskBoundedValueControl.h similarity index 74% rename from src/controls/QskRangeControl.h rename to src/controls/QskBoundedValueControl.h index 68f9f8f7..4bedd40b 100644 --- a/src/controls/QskRangeControl.h +++ b/src/controls/QskBoundedValueControl.h @@ -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; diff --git a/src/controls/QskSlider.cpp b/src/controls/QskSlider.cpp index 060591e8..893644d6 100644 --- a/src/controls/QskSlider.cpp +++ b/src/controls/QskSlider.cpp @@ -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 ) { diff --git a/src/controls/QskSlider.h b/src/controls/QskSlider.h index eaa5fb54..eb0a24d5 100644 --- a/src/controls/QskSlider.h +++ b/src/controls/QskSlider.h @@ -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 ) diff --git a/src/src.pro b/src/src.pro index 50a189c0..a30704f6 100644 --- a/src/src.pro +++ b/src/src.pro @@ -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 \