|
47 | 47 |
|
48 | 48 | #define KXMLQLCVCSliderClickAndGoType QStringLiteral("ClickAndGoType") |
49 | 49 | #define KXMLQLCVCSliderInvertedAppearance QStringLiteral("InvertedAppearance") |
| 50 | +#define KXMLQLCVCSliderCatchValues QStringLiteral("CatchValues") |
50 | 51 |
|
51 | 52 | #define KXMLQLCVCSliderLevel QStringLiteral("Level") |
52 | 53 | #define KXMLQLCVCSliderLevelLowLimit QStringLiteral("LowLimit") |
|
70 | 71 | #define INPUT_SLIDER_RESET_ID 1 |
71 | 72 | #define INPUT_SLIDER_FLASH_ID 2 |
72 | 73 |
|
| 74 | +/** +/- value range to catch the slider for external |
| 75 | + * controllers with no feedback support */ |
| 76 | +#define VALUE_CATCHING_THRESHOLD 4 |
73 | 77 |
|
74 | 78 | VCSlider::VCSlider(Doc *doc, QObject *parent) |
75 | 79 | : VCWidget(doc, parent) |
76 | 80 | , m_widgetMode(WSlider) |
77 | 81 | , m_valueDisplayStyle(DMXValue) |
78 | 82 | , m_invertedAppearance(false) |
| 83 | + , m_catchValues(false) |
79 | 84 | , m_sliderMode(Adjust) |
80 | 85 | , m_value(0) |
81 | 86 | , m_rangeLowLimit(0) |
82 | 87 | , m_rangeHighLimit(UCHAR_MAX) |
| 88 | + , m_lastInputValue(-1) |
83 | 89 | , m_levelValueChanged(false) |
84 | 90 | , m_monitorEnabled(false) |
85 | 91 | , m_monitorValue(0) |
@@ -195,6 +201,7 @@ bool VCSlider::copyFrom(const VCWidget *widget) |
195 | 201 | /* Copy slider appearance */ |
196 | 202 | setValueDisplayStyle(slider->valueDisplayStyle()); |
197 | 203 | setInvertedAppearance(slider->invertedAppearance()); |
| 204 | + setCatchValues(slider->catchValues()); |
198 | 205 |
|
199 | 206 | /* Copy Click & Go feature */ |
200 | 207 | setClickAndGoType(slider->clickAndGoType()); |
@@ -377,6 +384,24 @@ void VCSlider::setInvertedAppearance(bool inverted) |
377 | 384 | emit invertedAppearanceChanged(inverted); |
378 | 385 | } |
379 | 386 |
|
| 387 | +/********************************************************************* |
| 388 | + * Value catching feature |
| 389 | + *********************************************************************/ |
| 390 | + |
| 391 | +bool VCSlider::catchValues() const |
| 392 | +{ |
| 393 | + return m_catchValues; |
| 394 | +} |
| 395 | + |
| 396 | +void VCSlider::setCatchValues(bool enable) |
| 397 | +{ |
| 398 | + if (enable == m_catchValues) |
| 399 | + return; |
| 400 | + |
| 401 | + m_catchValues = enable; |
| 402 | + emit catchValuesChanged(enable); |
| 403 | +} |
| 404 | + |
380 | 405 | /********************************************************************* |
381 | 406 | * Slider value |
382 | 407 | *********************************************************************/ |
@@ -1378,7 +1403,23 @@ void VCSlider::slotInputValueChanged(quint8 id, uchar value) |
1378 | 1403 | switch (id) |
1379 | 1404 | { |
1380 | 1405 | case INPUT_SLIDER_CONTROL_ID: |
| 1406 | + if (catchValues()) |
| 1407 | + { |
| 1408 | + int currentValue = m_value; |
| 1409 | + |
| 1410 | + // filter 'out of threshold' cases |
| 1411 | + if (m_lastInputValue == -1 || |
| 1412 | + (m_lastInputValue < currentValue - VALUE_CATCHING_THRESHOLD && |
| 1413 | + scaledValue < currentValue - VALUE_CATCHING_THRESHOLD) || |
| 1414 | + (m_lastInputValue > currentValue + VALUE_CATCHING_THRESHOLD && |
| 1415 | + scaledValue > currentValue + VALUE_CATCHING_THRESHOLD)) |
| 1416 | + { |
| 1417 | + m_lastInputValue = scaledValue; |
| 1418 | + break; |
| 1419 | + } |
| 1420 | + } |
1381 | 1421 | setValue(scaledValue, true, false); |
| 1422 | + m_lastInputValue = scaledValue; |
1382 | 1423 | break; |
1383 | 1424 | case INPUT_SLIDER_RESET_ID: |
1384 | 1425 | if (value) |
@@ -1419,6 +1460,10 @@ bool VCSlider::loadXML(QXmlStreamReader &root) |
1419 | 1460 | else |
1420 | 1461 | setInvertedAppearance(true); |
1421 | 1462 |
|
| 1463 | + /* Values catching */ |
| 1464 | + if (attrs.hasAttribute(KXMLQLCVCSliderCatchValues)) |
| 1465 | + setCatchValues(true); |
| 1466 | + |
1422 | 1467 | while (root.readNextStartElement()) |
1423 | 1468 | { |
1424 | 1469 | if (root.name() == KXMLQLCWindowState) |
@@ -1634,6 +1679,10 @@ bool VCSlider::saveXML(QXmlStreamWriter *doc) const |
1634 | 1679 | else |
1635 | 1680 | doc->writeAttribute(KXMLQLCVCSliderInvertedAppearance, "false"); |
1636 | 1681 |
|
| 1682 | + /* Values catching */ |
| 1683 | + if (catchValues() == true) |
| 1684 | + doc->writeAttribute(KXMLQLCVCSliderCatchValues, "true"); |
| 1685 | + |
1637 | 1686 | /* Window state */ |
1638 | 1687 | saveXMLWindowState(doc); |
1639 | 1688 |
|
|
0 commit comments