#include "lts_spinbox.h" #include namespace LtsWidgets { LtsSpinBox::LtsSpinBox(QWidget *parent) : QSpinBox(parent) { } QValidator::State LtsSpinBox::validate(QString &input, int &pos) const { QIntValidator validator; for (auto range : m_validRanges) { validator.setBottom(range.first); validator.setTop(range.second); QValidator::State state = validator.validate(input, pos); if (state == QValidator::Invalid || state == QValidator::Intermediate) return state; } int value = input.toInt(); value -= minimum(); return (value % singleStep() == 0) ? QValidator::Acceptable : QValidator::Intermediate; } void LtsSpinBox::fixup(QString &str) const { QSpinBox::fixup(str); if (singleStep() == 1) return; bool bOk; int value = str.toInt(&bOk); if (!bOk) return; int remainder = (value - minimum()) % singleStep(); if (2 * remainder > singleStep()) value += singleStep(); value -= remainder; if (value > maximum()) value -= singleStep(); str = QString::number(value); } bool LtsSpinBox::setExclusionRanges(const QVector > &exclusionRanges, bool preserveCurrentValues) { bool retVal = true; auto newExclusions = exclusionRanges; if (preserveCurrentValues) newExclusions += m_exclusions; for (auto &elem : newExclusions) { if (elem.first > elem.second) { int tmp = elem.first; elem.first= elem.second; elem.second = tmp; } } std::sort(newExclusions.begin(), newExclusions.end(), [](const QPair &a, const QPair &b) { return a.first < b.first; }); for (int i=0; i= newExclusions[i+1].first) { retVal = false; break; } } if (!retVal || newExclusions[0].first <= minimum() || newExclusions[newExclusions.size()-1].second >= maximum()) { if (!preserveCurrentValues) m_exclusions.clear(); return false; } m_exclusions = exclusionRanges; m_validRanges.clear(); if (m_exclusions[0].first - 1 > minimum()) m_validRanges.append({minimum(), m_exclusions[0].first - 1}); for (int i=0; i singleStep()) value += singleStep(); value -= remainder; if (value > maximum()) value -= singleStep(); str = QString::number(value, 'f', decimals()); } }