QSkinny 0.8.0
C++/Qt UI toolkit
Loading...
Searching...
No Matches
QskBoundedValueInput.cpp
1/******************************************************************************
2 * QSkinny - Copyright (C) The authors
3 * SPDX-License-Identifier: BSD-3-Clause
4 *****************************************************************************/
5
6#include "QskBoundedValueInput.h"
7#include "QskFunctions.h"
8
9#include <qlocale.h>
10#include <cfloat>
11
12static qreal qskAlignedValue( const QskBoundedValueInput* input, qreal value )
13{
14 value = input->boundedValue( value );
15
16 if ( value > input->minimum() && value < input->maximum() )
17 {
18 if ( input->isSnapping() && input->stepSize() )
19 {
20 const auto step = input->stepSize();
21
22 value = qRound( value / step ) * step;
23 value = input->boundedValue( value );
24 }
25 }
26
27 return value;
28}
29
30class QskBoundedValueInput::PrivateData
31{
32 public:
33 qreal value = 0.0;
34 int decimals = 2;
35};
36
37QskBoundedValueInput::QskBoundedValueInput( QQuickItem* parent )
38 : Inherited( parent )
39 , m_data( new PrivateData )
40{
41}
42
43QskBoundedValueInput::~QskBoundedValueInput()
44{
45}
46
47void QskBoundedValueInput::setDecimals( int decimals )
48{
49 decimals = qBound( 0, decimals, DBL_MAX_10_EXP + DBL_DIG );
50 if ( decimals != m_data->decimals )
51 {
52 m_data->decimals = decimals;
53
54 update();
56 }
57}
58
59int QskBoundedValueInput::decimals() const
60{
61 return m_data->decimals;
62}
63
64void QskBoundedValueInput::alignInput()
65{
66 auto value = qskAlignedValue( this, m_data->value );
67 value = fixupValue( value );
68
69 setValueInternal( value );
70}
71
72qreal QskBoundedValueInput::fixupValue( qreal value ) const
73{
74 return value;
75}
76
77void QskBoundedValueInput::setValueAsRatio( qreal ratio )
78{
79 ratio = qBound( 0.0, ratio, 1.0 );
80 setValue( minimum() + ratio * boundaryLength() );
81}
82
83qreal QskBoundedValueInput::valueAsRatio() const
84{
85 return valueAsRatio( m_data->value );
86}
87
88void QskBoundedValueInput::setValue( qreal value )
89{
90 if ( isComponentComplete() )
91 {
92 value = qskAlignedValue( this, value );
93 value = fixupValue( value );
94 }
95
96 setValueInternal( value );
97}
98
99qreal QskBoundedValueInput::value() const
100{
101 return m_data->value;
102}
103
104void QskBoundedValueInput::increment( qreal offset )
105{
106 setValue( m_data->value + offset );
107}
108
109void QskBoundedValueInput::setValueInternal( qreal value )
110{
111 if ( !qskFuzzyCompare( value, m_data->value ) )
112 {
113 m_data->value = value;
114 Q_EMIT valueChanged( value );
115
116 update();
117 }
118}
119
120QString QskBoundedValueInput::valueText() const
121{
122 return textFromValue( value() );
123}
124
125QString QskBoundedValueInput::textFromValue( qreal value ) const
126{
127 return locale().toString( value, 'f', m_data->decimals );
128}
129
130#include "moc_QskBoundedValueInput.cpp"
QLocale locale
Definition QskControl.h:27
void resetImplicitSize()
Definition QskItem.cpp:721