blob: 0806523ab97962c8156239af3f372188dcbf4a15 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Quick Controls module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qquickspinboxvalidator_p.h"
#if QT_CONFIG(validator)
QT_BEGIN_NAMESPACE
QQuickSpinBoxValidator1::QQuickSpinBoxValidator1(QObject *parent)
: QValidator(parent), m_value(0), m_step(1), m_initialized(false)
{
m_validator.setTop(99);
m_validator.setBottom(0);
m_validator.setDecimals(0);
m_validator.setNotation(QDoubleValidator::StandardNotation);
QLocale locale;
locale.setNumberOptions(QLocale::OmitGroupSeparator);
setLocale(locale);
connect(this, SIGNAL(valueChanged()), this, SIGNAL(textChanged()));
connect(this, SIGNAL(minimumValueChanged()), this, SIGNAL(textChanged()));
connect(this, SIGNAL(maximumValueChanged()), this, SIGNAL(textChanged()));
connect(this, SIGNAL(decimalsChanged()), this, SIGNAL(textChanged()));
connect(this, SIGNAL(prefixChanged()), this, SIGNAL(textChanged()));
connect(this, SIGNAL(suffixChanged()), this, SIGNAL(textChanged()));
}
QQuickSpinBoxValidator1::~QQuickSpinBoxValidator1()
{
}
QString QQuickSpinBoxValidator1::text() const
{
return textFromValue(m_value);
}
qreal QQuickSpinBoxValidator1::value() const
{
return m_value;
}
void QQuickSpinBoxValidator1::setValue(qreal value)
{
if (m_initialized) {
value = qBound(minimumValue(), value, maximumValue());
value = QString::number(value, 'f', m_validator.decimals()).toDouble();
}
if (m_value != value) {
m_value = value;
if (m_initialized)
emit valueChanged();
}
}
qreal QQuickSpinBoxValidator1::minimumValue() const
{
return m_validator.bottom();
}
void QQuickSpinBoxValidator1::setMinimumValue(qreal min)
{
if (min != m_validator.bottom()) {
m_validator.setBottom(min);
emit minimumValueChanged();
if (m_initialized)
setValue(m_value);
}
}
qreal QQuickSpinBoxValidator1::maximumValue() const
{
return m_validator.top();
}
void QQuickSpinBoxValidator1::setMaximumValue(qreal max)
{
if (max != m_validator.top()) {
m_validator.setTop(max);
emit maximumValueChanged();
if (m_initialized)
setValue(m_value);
}
}
int QQuickSpinBoxValidator1::decimals() const
{
return m_validator.decimals();
}
void QQuickSpinBoxValidator1::setDecimals(int decimals)
{
if (decimals != m_validator.decimals()) {
m_validator.setDecimals(decimals);
emit decimalsChanged();
if (m_initialized)
setValue(m_value);
}
}
qreal QQuickSpinBoxValidator1::stepSize() const
{
return m_step;
}
void QQuickSpinBoxValidator1::setStepSize(qreal step)
{
if (m_step != step) {
m_step = step;
emit stepSizeChanged();
}
}
QString QQuickSpinBoxValidator1::prefix() const
{
return m_prefix;
}
void QQuickSpinBoxValidator1::setPrefix(const QString &prefix)
{
if (m_prefix != prefix) {
m_prefix = prefix;
emit prefixChanged();
}
}
QString QQuickSpinBoxValidator1::suffix() const
{
return m_suffix;
}
void QQuickSpinBoxValidator1::setSuffix(const QString &suffix)
{
if (m_suffix != suffix) {
m_suffix = suffix;
emit suffixChanged();
}
}
void QQuickSpinBoxValidator1::fixup(QString &input) const
{
input = textFromValue(m_value).remove(locale().groupSeparator());
}
QValidator::State QQuickSpinBoxValidator1::validate(QString &input, int &pos) const
{
if (pos > 0 && pos < input.length()) {
if (input.at(pos - 1) == locale().groupSeparator())
return QValidator::Invalid;
if (input.at(pos - 1) == locale().decimalPoint() && m_validator.decimals() == 0)
return QValidator::Invalid;
}
if (!m_prefix.isEmpty() && !input.startsWith(m_prefix)) {
input.prepend(m_prefix);
pos += m_prefix.length();
}
if (!m_suffix.isEmpty() && !input.endsWith(m_suffix))
input.append(m_suffix);
QString value = input.mid(m_prefix.length(), input.length() - m_prefix.length() - m_suffix.length());
int valuePos = pos - m_prefix.length();
QValidator::State state = m_validator.validate(value, valuePos);
input = m_prefix + value + m_suffix;
pos = m_prefix.length() + valuePos;
if (state == QValidator::Acceptable || state == QValidator::Intermediate) {
bool ok = false;
qreal val = locale().toDouble(value, &ok);
if (ok) {
if (state == QValidator::Acceptable ||
(state == QValidator::Intermediate && val >= 0 && val <= m_validator.top()) ||
(state == QValidator::Intermediate && val < 0 && val >= m_validator.bottom())) {
const_cast<QQuickSpinBoxValidator1 *>(this)->setValue(val);
if (input != textFromValue(val))
state = QValidator::Intermediate;
} else if (val < m_validator.bottom() || val > m_validator.top()) {
return QValidator::Invalid;
}
}
}
return state;
}
void QQuickSpinBoxValidator1::componentComplete()
{
m_initialized = true;
setValue(m_value);
}
void QQuickSpinBoxValidator1::increment()
{
setValue(m_value + m_step);
}
void QQuickSpinBoxValidator1::decrement()
{
setValue(m_value - m_step);
}
QString QQuickSpinBoxValidator1::textFromValue(qreal value) const
{
return m_prefix + locale().toString(value, 'f', m_validator.decimals()) + m_suffix;
}
QT_END_NAMESPACE
#endif // QT_CONFIG(validator)