@@ -28,7 +28,9 @@ namespace gui {
28
28
29
29
MenuSpinbox::MenuSpinbox (QString name, double val, QString unit, double min, double max, bool vertical, bool left,
30
30
bool large_widget, QWidget *parent)
31
- : QWidget(parent)
31
+ : m_min(min)
32
+ , m_max(max)
33
+ , QWidget(parent)
32
34
{
33
35
m_large_widget = large_widget;
34
36
m_label = new QLabel (name, parent);
@@ -82,7 +84,19 @@ MenuSpinbox::MenuSpinbox(QString name, double val, QString unit, double min, dou
82
84
setValue (-1 * scale);
83
85
}
84
86
} else {
85
- setValue (m_incrementStrategy->decrement (m_value));
87
+ double newValue = m_incrementStrategy->decrement (m_value);
88
+ // If decrement would result in 0 and there is a lower scale, scale down instead
89
+ if (qFuzzyCompare (newValue, 0.0 )) {
90
+ int idx = m_scaleCb->currentIndex ();
91
+ if (idx > 0 ) {
92
+ double lowerScale = m_scaleCb->itemData (idx - 1 ).toDouble ();
93
+ double currentScale = m_scaleCb->itemData (idx).toDouble ();
94
+ double maxLower = (currentScale / lowerScale) - 1 ;
95
+ setValue (maxLower * lowerScale);
96
+ return ;
97
+ }
98
+ }
99
+ setValue (newValue);
86
100
}
87
101
});
88
102
@@ -368,11 +382,10 @@ void MenuSpinbox::populateWidgets()
368
382
}
369
383
}
370
384
371
-
372
- // only chnage the scale for non 0 values
373
- if (m_value != 0 ) {
385
+ // only change the scale for non 0 values
386
+ if (!qFuzzyCompare (m_value, 0.0 )) {
374
387
m_edit->setText (QString::number (m_value / scale)); // reduce number to a meaningful value
375
- m_scaleCb->setCurrentIndex (i); // set apropriate scale in combobox
388
+ m_scaleCb->setCurrentIndex (i); // set appropriate scale in combobox
376
389
m_incrementStrategy->setScale (m_scaleCb->currentData ().toDouble ());
377
390
} else {
378
391
m_edit->setText (QString::number (m_value));
@@ -407,6 +420,21 @@ double MenuSpinbox::clamp(double val, double min, double max)
407
420
{
408
421
val = std::max (val, min);
409
422
val = std::min (val, max);
423
+
424
+ // disable decrement button if min is reached
425
+ if ((val == m_min) && (m_scaleCb->currentIndex () == 0 )) {
426
+ m_minus->setEnabled (false );
427
+ } else {
428
+ m_minus->setEnabled (true );
429
+ }
430
+
431
+ // disable increment button if max is reached
432
+ if (val == m_max) {
433
+ m_plus->setEnabled (false );
434
+ } else {
435
+ m_plus->setEnabled (true );
436
+ }
437
+
410
438
return val;
411
439
}
412
440
0 commit comments