/**************************************************************************** ** ** 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(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)