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