summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@digia.com>2013-11-26 17:30:03 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-04 12:51:19 +0100
commiteb69975cbc667d36e56795e2af2761835916e152 (patch)
treed098a01f5d256f75b4a687e296aa61973fee2d14
parent79fbed6f38d8d7fea2c7829fe285c8244deab95c (diff)
downloadqtquickcontrols-eb69975cbc667d36e56795e2af2761835916e152.tar.gz
SpinBox: attempt to fixup the input as appropriate
So for example "-0", which is a valid intermediate value, becomes "0" when the spinbox is accepted (enter) or it loses focus. Task-number: QTBUG-34774 Change-Id: Ie153294755aae2bf94ba1cb53c40a8fc5f1f5862 Reviewed-by: Liang Qi <liang.qi@digia.com>
-rw-r--r--src/controls/Private/qquickspinboxvalidator.cpp14
-rw-r--r--src/controls/Private/qquickspinboxvalidator_p.h3
-rw-r--r--tests/auto/controls/data/tst_spinbox.qml26
3 files changed, 40 insertions, 3 deletions
diff --git a/src/controls/Private/qquickspinboxvalidator.cpp b/src/controls/Private/qquickspinboxvalidator.cpp
index 16db3f08..342ae8c0 100644
--- a/src/controls/Private/qquickspinboxvalidator.cpp
+++ b/src/controls/Private/qquickspinboxvalidator.cpp
@@ -69,7 +69,7 @@ QQuickSpinBoxValidator::~QQuickSpinBoxValidator()
QString QQuickSpinBoxValidator::text() const
{
- return m_prefix + locale().toString(m_value, 'f', m_validator.decimals()) + m_suffix;
+ return textFromValue(m_value);
}
qreal QQuickSpinBoxValidator::value() const
@@ -178,7 +178,7 @@ void QQuickSpinBoxValidator::setSuffix(const QString &suffix)
void QQuickSpinBoxValidator::fixup(QString &input) const
{
- input.remove(locale().groupSeparator());
+ input = textFromValue(m_value).remove(locale().groupSeparator());
}
QValidator::State QQuickSpinBoxValidator::validate(QString &input, int &pos) const
@@ -207,8 +207,11 @@ QValidator::State QQuickSpinBoxValidator::validate(QString &input, int &pos) con
if (state == QValidator::Acceptable) {
bool ok = false;
qreal val = locale().toDouble(value, &ok);
- if (ok)
+ if (ok) {
const_cast<QQuickSpinBoxValidator *>(this)->setValue(val);
+ if (input != textFromValue(val))
+ state = QValidator::Intermediate;
+ }
}
return state;
}
@@ -229,4 +232,9 @@ void QQuickSpinBoxValidator::decrement()
setValue(m_value - m_step);
}
+QString QQuickSpinBoxValidator::textFromValue(qreal value) const
+{
+ return m_prefix + locale().toString(value, 'f', m_validator.decimals()) + m_suffix;
+}
+
QT_END_NAMESPACE
diff --git a/src/controls/Private/qquickspinboxvalidator_p.h b/src/controls/Private/qquickspinboxvalidator_p.h
index 09468fce..2ffac73e 100644
--- a/src/controls/Private/qquickspinboxvalidator_p.h
+++ b/src/controls/Private/qquickspinboxvalidator_p.h
@@ -107,6 +107,9 @@ Q_SIGNALS:
void suffixChanged();
void textChanged();
+protected:
+ QString textFromValue(qreal value) const;
+
private:
qreal m_value;
qreal m_step;
diff --git a/tests/auto/controls/data/tst_spinbox.qml b/tests/auto/controls/data/tst_spinbox.qml
index 176a70b5..260fc0c1 100644
--- a/tests/auto/controls/data/tst_spinbox.qml
+++ b/tests/auto/controls/data/tst_spinbox.qml
@@ -618,7 +618,33 @@ Item {
downCoord.y = item.y + item.height - arrowMargin
}
+ function test_fixup() {
+ var spinbox = Qt.createQmlObject('import QtQuick.Controls 1.1; SpinBox { minimumValue: -1 }', container, '')
+ verify(spinbox)
+ spinbox.forceActiveFocus()
+ verify(spinbox.activeFocus)
+
+ keyClick(Qt.Key_Minus)
+ keyClick(Qt.Key_0)
+ compare(spinbox.__text, "-0")
+ // fixup "-0" to "0" on accept
+ keyClick(Qt.Key_Enter)
+ compare(spinbox.__text, "0")
+
+ spinbox.prefix = "pfx"
+ spinbox.suffix = "sfx"
+ keyClick(Qt.Key_A, Qt.ControlModifier)
+ keyClick(Qt.Key_Minus)
+ keyClick(Qt.Key_0)
+ compare(spinbox.__text, "pfx-0sfx")
+
+ // fixup "-0" to "0" on defocus
+ spinbox.focus = false
+ compare(spinbox.__text, "pfx0sfx")
+
+ spinbox.destroy()
+ }
}
}