4#pragma warning(disable : 4800)
5#pragma warning(disable : 4251)
6#pragma warning(disable : 4244)
14#include "../../global.hpp"
15#include "detail_spinbox64.hpp"
16#include "detail_label_slider.hpp"
28 class SpinBoxSlider64 :
public QFrame
34 explicit SpinBoxSlider64(QWidget *parent = 0)
36 , sliderDialog_(nullptr)
37 , sliderCoarse_(nullptr)
38 , sliderFine_(nullptr)
40 auto layout =
new QHBoxLayout(
this);
41 layout->setContentsMargins(0, 0, 0, 0);
42 layout->setSpacing(0);
44 spinBox_ =
new SpinBox64();
45 layout->addWidget(spinBox_);
46 QObject::connect(spinBox_, &SpinBox64::ValueChanged,
this, &SpinBoxSlider64::SpinBoxChanged,
47 Qt::QueuedConnection);
49 button_ =
new QPushButton(
"...");
50 button_->setFixedWidth(20);
51 layout->setStretch(0, 1);
52 layout->addWidget(button_);
53 QObject::connect(button_, &QPushButton::pressed,
this, &SpinBoxSlider64::ButtonPressed, Qt::QueuedConnection);
55 installEventFilter(
this);
63 void SetMinimum(qint64 minimum)
65 spinBox_->setMinimum(minimum);
68 sliderFine_->SetMinimum((
int)minimum);
76 void SetMaximum(qint64 maximum)
78 spinBox_->setMaximum(maximum);
86 void SetRange(qint64 minimum, qint64 maximum)
88 spinBox_->setRange(minimum, maximum);
96 qint64 Minimum()
const
98 return spinBox_->minimum();
101 qint64 Maximum()
const
103 return spinBox_->maximum();
106 void SetValue(qint64 val)
108 spinBox_->setValue(val);
113 return spinBox_->value();
116 void SetSingleStep(qint64 val)
118 spinBox_->setSingleStep(val);
121 qint64 SingleStep()
const
123 return spinBox_->singleStep();
128 void ValueChanged(qint64 value);
132 void SliderFineChanged(
int value)
135 auto oldState = spinBox_->blockSignals(
true);
136 spinBox_->setValue(value);
137 spinBox_->blockSignals(oldState);
140 oldState = sliderCoarse_->blockSignals(
true);
141 sliderCoarse_->SetValue(value);
142 sliderCoarse_->blockSignals(oldState);
144 ValueChanged(
static_cast<qint64
>(value));
147 void SliderCoarseChanged(
int value)
150 auto oldState = spinBox_->blockSignals(
true);
151 spinBox_->setValue(value);
152 spinBox_->blockSignals(oldState);
155 oldState = sliderFine_->blockSignals(
true);
156 SetFineSliderRanges(value);
157 SetFineSlider(value);
158 sliderFine_->blockSignals(oldState);
160 ValueChanged(
static_cast<qint64
>(value));
163 void SpinBoxChanged(qint64 value)
168 auto oldState = sliderFine_->blockSignals(
true);
169 SetFineSliderRanges(
static_cast<int>(value));
170 SetFineSlider(
static_cast<int>(value));
171 sliderFine_->blockSignals(oldState);
177 auto oldState = sliderCoarse_->blockSignals(
true);
178 sliderCoarse_->SetValue(
static_cast<int>(value));
179 sliderCoarse_->blockSignals(oldState);
189 auto min =
static_cast<int>(Minimum());
190 auto max =
static_cast<int>(Maximum());
191 auto value =
static_cast<int>(Value());
192 ShowSliderDialog(min, max, value);
199 sliderDialog_->hide();
205 sliderDialog_->show();
208 bool IsDialogBoxVisible()
211 return sliderDialog_->isVisible();
216 bool eventFilter(QObject *obj, QEvent *event)
override
220 button_->updateGeometry();
221 auto g = button_->geometry();
223 auto buttonPos = button_->rect().bottomRight();
224 auto buttonPosGlob = button_->mapToGlobal(buttonPos);
226 auto x = buttonPosGlob.x();
227 auto y = buttonPosGlob.y();
230 static const int range = 60;
231 if (buttonPosGlobal_.x() < x - range || buttonPosGlobal_.x() > x + range || buttonPosGlobal_.y() < y - range
232 || buttonPosGlobal_.y() > y + range)
234 sliderDialog_->move(buttonPosGlob.x() - sliderDialog_->width(), buttonPosGlob.y());
235 buttonPosGlobal_ = buttonPosGlob;
239 return QObject::eventFilter(obj, event);
243 void ShowSliderDialog(
int min,
int max,
int value)
247 if (sliderDialog_->isVisible())
248 sliderDialog_->hide();
250 sliderDialog_->show();
254 sliderDialog_ =
new QDialog(
this);
255 sliderDialog_->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
256 sliderDialog_->setObjectName(
"sliderDialog");
257 sliderDialog_->setStyleSheet(
"#sliderDialog{border:1px solid black}");
259 auto layout =
new QHBoxLayout(sliderDialog_);
260 layout->setContentsMargins(0, 0, 0, 0);
261 layout->setSpacing(0);
263 sliderFine_ =
new LabelSlider(Qt::Vertical,
false, sliderDialog_);
264 sliderFine_->SetMinimum(FineSliderMin(value));
265 sliderFine_->SetMaximum(FineSliderMax(value));
266 sliderFine_->SetSingleStep(
static_cast<int>(spinBox_->singleStep()));
267 sliderFine_->SetValue(value);
269 QObject::connect(sliderFine_, &LabelSlider::ValueChanged,
this, &SpinBoxSlider64::SliderFineChanged,
270 Qt::QueuedConnection);
273 new LabelSlider(Qt::Vertical,
true, sliderDialog_);
274 sliderCoarse_->SetMinimum(min);
275 sliderCoarse_->SetMaximum(max);
276 sliderCoarse_->SetSingleStep(FineSliderSubRange());
277 sliderCoarse_->SetBoldLabel(
true);
278 sliderCoarse_->SetValue(value);
280 QString scrollMin =
"<b>" + QString::number(min) +
"</b>";
281 QString scrollMax =
"<b>" + QString::number(max) +
"</b>";
283 layout->addWidget(sliderFine_);
286 if ((sliderCoarse_->Maximum() - sliderCoarse_->Minimum() > sliderCoarse_->SingleStep()))
287 layout->addWidget(sliderCoarse_);
289 QObject::connect(sliderCoarse_, &LabelSlider::ValueChanged,
this, &SpinBoxSlider64::SliderCoarseChanged,
290 Qt::QueuedConnection);
292 sliderDialog_->adjustSize();
294 button_->updateGeometry();
295 auto buttonPos = button_->rect().bottomRight();
296 auto buttonPosGlob = button_->mapToGlobal(buttonPos);
297 sliderDialog_->move(buttonPosGlob.x() - sliderDialog_->width(), buttonPosGlob.y());
298 buttonPosGlobal_ = buttonPosGlob;
300 sliderDialog_->show();
303 int FineSliderMin(
int value)
305 auto minimum = spinBox_->minimum();
307 if (value > spinBox_->maximum())
308 value =
static_cast<int>(spinBox_->maximum());
310 auto min = value - FineSliderSubRange();
312 min =
static_cast<int>(minimum);
317 int FineSliderMax(
int value)
319 auto maximum = spinBox_->maximum();
321 if (value < spinBox_->minimum())
322 value =
static_cast<int>(spinBox_->minimum());
324 auto max = value + FineSliderSubRange();
326 max =
static_cast<int>(maximum);
331 void SetFineSliderRanges(
int value)
333 if (value >= sliderFine_->Minimum() && value <= sliderFine_->Maximum())
336 sliderFine_->SetMinimum(FineSliderMin(value));
337 sliderFine_->SetMaximum(FineSliderMax(value));
340 void SetFineSlider(
int value)
342 if (value >= sliderFine_->Minimum() && value <= sliderFine_->Maximum())
344 sliderFine_->SetValue(value);
348 SetFineSliderRanges(value);
349 sliderFine_->SetValue(value);
353 bool IsInRange(
int value)
355 if (value >= spinBox_->minimum() && value <= spinBox_->maximum())
360 int FineSliderSubRange()
362 auto subrange = MAX_FINE_SLIDER_RANGE;
363 while (subrange % SingleStep() != 0)
376 QPushButton *button_;
377 QPoint buttonPosGlobal_;
378 QDialog *sliderDialog_;
379 LabelSlider *sliderCoarse_;
380 LabelSlider *sliderFine_;
382 static const int MAX_FINE_SLIDER_RANGE = 250;
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