CVB++ 15.0
detail_spinbox64.hpp
1#pragma once
2
3#pragma warning(push)
4#pragma warning(disable : 4800)
5#pragma warning(disable : 4251)
6#pragma warning(disable : 4244)
7#include <QAbstractSpinBox>
8#include <QLineEdit>
9#pragma warning(pop)
10
11#include "../../global.hpp"
12#include "../../utilities/system_info.hpp"
13
14namespace Cvb
15{
16
17 CVB_BEGIN_INLINE_NS
18
19 namespace UI
20 {
21 namespace Private
22 {
23
24 class SpinBox64 : public QAbstractSpinBox
25 {
26
27 Q_OBJECT
28
29 public:
30 explicit SpinBox64(QWidget *parent = 0)
31 : QAbstractSpinBox(parent)
32 , value_(0)
33 , min_(std::numeric_limits<qint64>::min())
34 , max_(std::numeric_limits<qint64>::max())
35 , singleStep_(1)
36 {
37 setButtonSymbols(QAbstractSpinBox::UpDownArrows);
38 setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue);
39
40 QObject::connect(this, &SpinBox64::editingFinished, this, &SpinBox64::valueChanged);
41 }
42
43 void stepBy(int steps) override
44 {
45 if (steps == -1)
46 stepDown();
47 else
48 stepUp();
49 }
50
51 QString textFromValue(qint64 value) const
52 {
53 return QString::number(value);
54 }
55
56 qint64 valueFromText(const QString &text) const
57 {
58 return text.toLongLong();
59 }
60
61 void setValue(qint64 value)
62 {
63 if (value > max_)
64 value_ = max_;
65 else if (value < min_)
66 value_ = min_;
67 else
68 value_ = value;
69
70 lineEdit()->setText(QString::number(value_));
71 ValueChanged(value_); // send signal
72 }
73
74 qint64 value() const
75 {
76 return value_;
77 }
78
79 void setMaximum(qint64 max)
80 {
81 max_ = max;
82 }
83
84 void setMinimum(qint64 min)
85 {
86 min_ = min;
87 }
88
89 void setRange(qint64 minimum, qint64 maximum)
90 {
91 setMinimum(minimum);
92 setMaximum(maximum);
93 }
94
95 qint64 maximum() const
96 {
97 return max_;
98 }
99
100 qint64 minimum() const
101 {
102 return min_;
103 }
104
105 void setSingleStep(qint64 val)
106 {
107 if (val < 0)
108 return;
109
110 singleStep_ = val;
111 }
112
113 qint64 singleStep()
114 {
115 return singleStep_;
116 }
117
118 QValidator::State validate(QString &input, int & /*pos*/) const override
119 {
120 qlonglong b(Q_UINT64_C(0x8000000000000000));
121 qlonglong t(Q_UINT64_C(0x7FFFFFFFFFFFFFFF));
122
123 if (input.contains(QLatin1Char(' ')))
124 return QValidator::Invalid;
125 if (input.isEmpty() || (b < 0 && input == QString(QLatin1Char('-'))))
126 return QValidator::Intermediate;
127 bool ok = false;
128 auto entered = input.toLongLong(&ok);
129 if (!ok || (entered < 0 && b >= 0))
130 {
131 return QValidator::Invalid;
132 }
133 else if (entered >= b && entered <= t)
134 {
135 return QValidator::Acceptable;
136 }
137 else
138 {
139 if (entered >= 0)
140 return (entered > t) ? QValidator::Invalid : QValidator::Intermediate;
141 else
142 return (entered < b) ? QValidator::Invalid : QValidator::Intermediate;
143 }
144 }
145
146 public Q_SLOTS:
147
148 void stepDown()
149 {
150 auto value = value_;
151 value -= singleStep_;
152 if (value < min_)
153 value = min_;
154
155 setValue(value);
156 }
157
158 void stepUp()
159 {
160 auto value = value_;
161 value += singleStep_;
162 if (value > max_)
163 value = max_;
164
165 setValue(value);
166 }
167
168 void valueChanged()
169 {
170 auto value = lineEdit()->text().toLongLong();
171 value_ = value;
172 if (value_ > max_)
173 value_ = max_;
174 else if (value_ < min_)
175 value_ = min_;
176
177 lineEdit()->setText(QString::number(value_));
178 ValueChanged(value_); // send signal
179 }
180
181 Q_SIGNALS:
182
183 void ValueChanged(qint64 value);
184
185 protected:
186 QAbstractSpinBox::StepEnabled stepEnabled() const override
187 {
188 return (StepUpEnabled) | (StepDownEnabled);
189 }
190
191 private:
192 qint64 value_;
193 qint64 min_;
194 qint64 max_;
195 qint64 singleStep_;
196
197 }; /* class SpinBox64 */
198
199 } /* namespace Private */
200 } /* namespace UI */
201
202 CVB_END_INLINE_NS
203
204} /* namespace Cvb */
T max(T... args)
T min(T... args)
Namespace for user interface components.
Definition decl_image_scene.hpp:39
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17