From e2c76aa121653f82758100464e23b0443086a254 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Wed, 27 Nov 2024 16:24:55 +0100 Subject: [PATCH] QskSlider ticks implementaton completed --- designsystems/fusion/QskFusionSkin.cpp | 36 ++++++++++++ .../material3/QskMaterial3SliderSkinlet.cpp | 56 ++++--------------- .../material3/QskMaterial3SliderSkinlet.h | 2 - src/controls/QskSlider.cpp | 22 -------- src/controls/QskSlider.h | 9 --- src/controls/QskSliderSkinlet.cpp | 45 ++++++++------- src/controls/QskSliderSkinlet.h | 1 + 7 files changed, 73 insertions(+), 98 deletions(-) diff --git a/designsystems/fusion/QskFusionSkin.cpp b/designsystems/fusion/QskFusionSkin.cpp index 9e9d713d..f3a50d2b 100644 --- a/designsystems/fusion/QskFusionSkin.cpp +++ b/designsystems/fusion/QskFusionSkin.cpp @@ -46,6 +46,8 @@ #include #include +#include + #include #include #include @@ -773,6 +775,7 @@ void Editor::setupSlider() { using A = QskAspect; using Q = QskSlider; + using SK = QskSliderSkinlet; using P = QPalette; const qreal extent = 16_px; @@ -824,6 +827,39 @@ void Editor::setupSlider() } } + { + /* + Tick + + QSlider optionally allows to display ticks left/right or top/bottom + of the groove. However this not supported by the skinlets yet. + ( Qt/Quick slider does not support showing ticks at all ) + + For the moment we make something up. TODO ... + */ + + setFlag( Q::Tick | A::Option, Qsk::Maybe ); + setStrutSize( Q::Tick, 2_px, 2_px ); + + const QskStateCombination combination( + QskStateCombination::CombinationNoState, Q::Focused | Q::Pressed ); + + const auto rgb = m_pal.active( P::Text ); + + setColor( Q::Tick, + QskRgb::interpolated( rgb, m_pal.groove, 0.2 ), combination ); + + setColor( Q::Tick | Q::Disabled, + QskRgb::interpolated( rgb, m_pal.groove, 0.5 ) ); + + setColor( Q::Tick | SK::Filled, + m_pal.active( P::HighlightedText ), combination ); + setColor( Q::Tick | SK::Filled | Q::Disabled, + m_pal.disabled( P::HighlightedText ) ); + } + + // Handle + setBoxShape( Q::Handle, 2 ); setBoxBorderMetrics( Q::Handle, 1 ); setBoxBorderColors( Q::Handle, m_pal.outline ); diff --git a/designsystems/material3/QskMaterial3SliderSkinlet.cpp b/designsystems/material3/QskMaterial3SliderSkinlet.cpp index c05e8220..0ba56ba0 100644 --- a/designsystems/material3/QskMaterial3SliderSkinlet.cpp +++ b/designsystems/material3/QskMaterial3SliderSkinlet.cpp @@ -11,11 +11,6 @@ using Q = QskSlider; -static inline bool qskHasBoundaryTicks( const QskSlider* slider ) -{ - return ( slider->graduationPolicy() == Qsk::Maybe ) && !slider->isSnapping(); -} - QskMaterial3SliderSkinlet::QskMaterial3SliderSkinlet( QskSkin* skin ) : Inherited( skin ) { @@ -80,49 +75,11 @@ QSGNode* QskMaterial3SliderSkinlet::updateSubNode( return Inherited::updateSubNode( skinnable, nodeRole, node ); } -int QskMaterial3SliderSkinlet::sampleCount( const QskSkinnable* skinnable, - QskAspect::Subcontrol subControl ) const -{ - if ( subControl == Q::Tick ) - { - const auto slider = static_cast< const QskSlider* >( skinnable ); - - if ( ( slider->graduationPolicy() == Qsk::Maybe ) && !slider->isSnapping() ) - { - const bool hasOrigin = false; - - // min/origin/max or max - return hasOrigin ? 3 : 1; - } - } - - return Inherited::sampleCount( skinnable, subControl ); -} - QVector< qreal > QskMaterial3SliderSkinlet::graduation( const QskSlider* slider ) const { QVector< qreal > graduation; - if ( ( slider->graduationPolicy() == Qsk::Maybe ) && !slider->isSnapping() ) - { - const bool hasOrigin = false; - - if ( hasOrigin ) - { - graduation.reserve( 3 ); - graduation += slider->minimum(); -#if 1 - graduation += slider->maximum(); // origin !!! -#endif - graduation += slider->maximum(); - } - else - { - graduation.reserve( 1 ); - graduation += slider->maximum(); - } - } - else + if ( hasGraduation( slider ) ) { const auto g = Inherited::graduation( slider ); @@ -133,6 +90,17 @@ QVector< qreal > QskMaterial3SliderSkinlet::graduation( const QskSlider* slider graduation += g; graduation += slider->maximum(); } + else + { + const auto policy = slider->flagHint< Qsk::Policy >( + Q::Tick | QskAspect::Option, Qsk::Maybe ); + + if ( policy != Qsk::Never ) + { + graduation.reserve( 1 ); + graduation += slider->maximum(); + } + } return graduation; } diff --git a/designsystems/material3/QskMaterial3SliderSkinlet.h b/designsystems/material3/QskMaterial3SliderSkinlet.h index 807f2734..6ad9d02d 100644 --- a/designsystems/material3/QskMaterial3SliderSkinlet.h +++ b/designsystems/material3/QskMaterial3SliderSkinlet.h @@ -20,8 +20,6 @@ class QskMaterial3SliderSkinlet : QskSliderSkinlet QRectF subControlRect( const QskSkinnable*, const QRectF& rect, QskAspect::Subcontrol ) const override; - int sampleCount( const QskSkinnable*, QskAspect::Subcontrol ) const override; - protected: QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* ) const override; diff --git a/src/controls/QskSlider.cpp b/src/controls/QskSlider.cpp index 664b4168..0311f5e5 100644 --- a/src/controls/QskSlider.cpp +++ b/src/controls/QskSlider.cpp @@ -17,11 +17,6 @@ QSK_SUBCONTROL( QskSlider, Handle ) QSK_SYSTEM_STATE( QskSlider, Pressed, QskAspect::FirstSystemState << 2 ) -static inline QskAspect qskAspectGraduationPolicy() -{ - return QskSlider::Tick | QskAspect::Option; -} - static QRectF qskHandleSelectionRect( const QskSlider* slider ) { auto rect = slider->subControlRect( QskSlider::Handle ); @@ -136,23 +131,6 @@ QskAspect::Variation QskSlider::effectiveVariation() const return static_cast< QskAspect::Variation >( m_data->orientation ); } -void QskSlider::setGraduationPolicy( Qsk::Policy policy ) -{ - if ( setFlagHint( qskAspectGraduationPolicy(), policy ) ) - Q_EMIT graduationPolicyChanged( graduationPolicy() ); -} - -void QskSlider::resetGraduationPolicy() -{ - if ( resetSkinHint( qskAspectGraduationPolicy() ) ) - Q_EMIT graduationPolicyChanged( graduationPolicy() ); -} - -Qsk::Policy QskSlider::graduationPolicy() const -{ - return flagHint< Qsk::Policy >( qskAspectGraduationPolicy(), Qsk::Never ); -} - void QskSlider::setTracking( bool on ) { if ( on != m_data->tracking ) diff --git a/src/controls/QskSlider.h b/src/controls/QskSlider.h index 5c9f201e..2c102c56 100644 --- a/src/controls/QskSlider.h +++ b/src/controls/QskSlider.h @@ -15,10 +15,6 @@ class QSK_EXPORT QskSlider : public QskBoundedValueInput Q_PROPERTY( bool isPressed READ isPressed NOTIFY pressedChanged ) - Q_PROPERTY( Qsk::Policy graduationPolicy READ graduationPolicy - WRITE setGraduationPolicy RESET resetGraduationPolicy - NOTIFY graduationPolicyChanged ) - Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged ) @@ -43,10 +39,6 @@ class QSK_EXPORT QskSlider : public QskBoundedValueInput void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; - void setGraduationPolicy( Qsk::Policy ); - void resetGraduationPolicy(); - Qsk::Policy graduationPolicy() const; - void setTracking( bool ); bool isTracking() const; @@ -58,7 +50,6 @@ class QSK_EXPORT QskSlider : public QskBoundedValueInput void pressedChanged( bool ); void orientationChanged( Qt::Orientation ); void trackingChanged( bool ); - void graduationPolicyChanged( Qsk::Policy ); protected: void mousePressEvent( QMouseEvent* ) override; diff --git a/src/controls/QskSliderSkinlet.cpp b/src/controls/QskSliderSkinlet.cpp index 4b42c3b7..5d1e709f 100644 --- a/src/controls/QskSliderSkinlet.cpp +++ b/src/controls/QskSliderSkinlet.cpp @@ -52,26 +52,6 @@ static QRectF qskInnerRect( const QskSlider* slider, return r; } -static inline bool qskHasGraduation( const QskSlider* slider ) -{ - if ( slider->stepSize() ) - { - switch( slider->graduationPolicy() ) - { - case Qsk::Always: - return true; - - case Qsk::Maybe: - return slider->isSnapping(); - - case Qsk::Never: - return false; - } - } - - return false; -} - static inline QPair< qreal, qreal > qskTickSpan( qreal min, qreal max, qreal length ) { if ( length >= 0.0 ) @@ -345,11 +325,34 @@ QSizeF QskSliderSkinlet::sizeHint( const QskSkinnable* skinnable, return hint; } +bool QskSliderSkinlet::hasGraduation( const QskSlider* slider ) const +{ + if ( slider->stepSize() ) + { + const auto policy = slider->flagHint< Qsk::Policy >( + Q::Tick | QskAspect::Option, Qsk::Never ); + + switch( policy ) + { + case Qsk::Always: + return true; + + case Qsk::Maybe: + return slider->isSnapping(); + + case Qsk::Never: + return false; + } + } + + return false; +} + QVector< qreal > QskSliderSkinlet::graduation( const QskSlider* slider ) const { QVector< qreal > graduation; - if ( qskHasGraduation( slider ) ) + if ( hasGraduation( slider ) ) { const auto from = slider->minimum(); const auto to = slider->maximum(); diff --git a/src/controls/QskSliderSkinlet.h b/src/controls/QskSliderSkinlet.h index 6a6b6cba..6a042f83 100644 --- a/src/controls/QskSliderSkinlet.h +++ b/src/controls/QskSliderSkinlet.h @@ -58,6 +58,7 @@ class QSK_EXPORT QskSliderSkinlet : public QskSkinlet QskAspect::Subcontrol, int index, QSGNode* ) const override; virtual QVector< qreal > graduation( const QskSlider* ) const; + bool hasGraduation( const QskSlider* ) const; private: QRectF panelRect( const QskSlider*, const QRectF& ) const;