File indexing completed on 2024-06-23 05:48:51

0001 /*
0002     This file is part of the Okteta Kasten module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2009 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #ifndef KASTEN_SINTSPINBOX_HPP
0010 #define KASTEN_SINTSPINBOX_HPP
0011 
0012 // Qt
0013 #include <QAbstractSpinBox>
0014 // C++
0015 #include <limits>
0016 
0017 class SIntSpinBox : public QAbstractSpinBox
0018 {
0019     Q_OBJECT
0020     Q_PROPERTY(qint64 value READ value WRITE setValue USER true)
0021 
0022 public:
0023     explicit SIntSpinBox(QWidget* parent = nullptr, int base = 10);
0024 
0025     ~SIntSpinBox() override;
0026 
0027 public:
0028     qint64 value() const;
0029 
0030 public:
0031     void setValue(qint64 value);
0032 
0033     // TODO getters + setters
0034     void setRange(qint64 minimum, qint64 maximum);
0035     void setBase(int base);
0036 
0037     static SIntSpinBox* createSInt64Spinbox(QWidget* parent = nullptr);
0038     static SIntSpinBox* createSInt32Spinbox(QWidget* parent = nullptr);
0039     static SIntSpinBox* createSInt16Spinbox(QWidget* parent = nullptr);
0040     static SIntSpinBox* createSInt8Spinbox(QWidget* parent = nullptr);
0041 
0042 protected: // QAbstractSpinBox API
0043     QValidator::State validate(QString& input, int& pos) const override;
0044     void stepBy(int steps) override;
0045     void fixup(QString& input) const override;
0046     StepEnabled stepEnabled() const override;
0047 
0048 private:
0049     void updateEditLine() const;
0050 
0051 private:
0052     mutable qint64 mValue = 0;
0053 
0054     qint64 mMinimum = std::numeric_limits<qint64>::min();
0055     qint64 mMaximum = std::numeric_limits<qint64>::max();
0056     int mBase = 0;
0057 
0058     QString mPrefix;
0059 };
0060 
0061 inline SIntSpinBox::SIntSpinBox(QWidget* parent, int base)
0062     : QAbstractSpinBox(parent)
0063 {
0064     setBase(base);
0065 }
0066 
0067 inline SIntSpinBox::~SIntSpinBox() = default;
0068 
0069 inline qint64 SIntSpinBox::value() const { return mValue; }
0070 
0071 inline void SIntSpinBox::setValue(qint64 value)
0072 {
0073     if (value > mMaximum) {
0074         value = mMaximum;
0075     } else if (value < mMinimum) {
0076         value = mMinimum;
0077     }
0078 
0079     if (mValue == value) {
0080         return;
0081     }
0082 
0083     mValue = value;
0084 
0085     updateEditLine();
0086 }
0087 
0088 inline void SIntSpinBox::setRange(qint64 minimum, qint64 maximum)
0089 {
0090     mMinimum = minimum;
0091     mMaximum = (maximum > minimum) ? maximum : minimum;
0092 
0093     if (mValue > mMaximum) {
0094         mValue = mMaximum;
0095 
0096         updateEditLine();
0097     } else if (mValue < mMinimum) {
0098         mValue = mMinimum;
0099 
0100         updateEditLine();
0101     }
0102 }
0103 
0104 inline void SIntSpinBox::setBase(int base)
0105 {
0106     base = qBound(2, base, 36);
0107 
0108     if (mBase == base) {
0109         return;
0110     }
0111 
0112     mBase = base;
0113     mPrefix = QString::fromLatin1(
0114         (base == 16) ? "0x" :
0115         (base ==  8) ? "0o" :
0116         (base ==  2) ? "0b" :
0117         /* else */     nullptr);
0118 }
0119 
0120 inline SIntSpinBox* SIntSpinBox::createSInt64Spinbox(QWidget* parent)
0121 {
0122     return new SIntSpinBox(parent);
0123 }
0124 
0125 inline SIntSpinBox* SIntSpinBox::createSInt32Spinbox(QWidget* parent)
0126 {
0127     auto* ret = new SIntSpinBox(parent);
0128     ret->setRange(std::numeric_limits<qint32>::min(), std::numeric_limits<qint32>::max());
0129     return ret;
0130 }
0131 
0132 inline SIntSpinBox* SIntSpinBox::createSInt16Spinbox(QWidget* parent)
0133 {
0134     auto* ret = new SIntSpinBox(parent);
0135     ret->setRange(std::numeric_limits<qint16>::min(), std::numeric_limits<qint16>::max());
0136     return ret;
0137 }
0138 
0139 inline SIntSpinBox* SIntSpinBox::createSInt8Spinbox(QWidget* parent)
0140 {
0141     auto* ret = new SIntSpinBox(parent);
0142     ret->setRange(std::numeric_limits<qint8>::min(), std::numeric_limits<qint8>::max());
0143     return ret;
0144 }
0145 
0146 #endif