Skip to content

Commit 1716c41

Browse files
committed
qmlui: restored VC Slider value catching from external controller
Reported: https://www.qlcplus.org/forum/viewtopic.php?t=19130
1 parent d943f5f commit 1716c41

3 files changed

Lines changed: 86 additions & 0 deletions

File tree

qmlui/qml/virtualconsole/VCSliderProperties.qml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,35 @@ Rectangle
414414
}
415415
} // SectionBox Values range
416416

417+
SectionBox
418+
{
419+
sectionLabel: qsTr("External input")
420+
421+
sectionContents:
422+
GridLayout
423+
{
424+
width: parent.width
425+
columns: 2
426+
columnSpacing: 5
427+
rowSpacing: 4
428+
429+
CustomCheckBox
430+
{
431+
implicitWidth: UISettings.iconSizeMedium
432+
implicitHeight: implicitWidth
433+
checked: widgetRef ? widgetRef.catchValues : false
434+
onClicked: if (widgetRef) widgetRef.catchValues = checked
435+
}
436+
437+
RobotoText
438+
{
439+
height: gridItemsHeight
440+
Layout.fillWidth: true
441+
label: qsTr("Catch up with the external controller input value")
442+
}
443+
}
444+
} // end of SectionBox External input
445+
417446
SectionBox
418447
{
419448
visible: widgetRef ? widgetRef.sliderMode === VCSlider.GrandMaster : false

qmlui/virtualconsole/vcslider.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747

4848
#define KXMLQLCVCSliderClickAndGoType QStringLiteral("ClickAndGoType")
4949
#define KXMLQLCVCSliderInvertedAppearance QStringLiteral("InvertedAppearance")
50+
#define KXMLQLCVCSliderCatchValues QStringLiteral("CatchValues")
5051

5152
#define KXMLQLCVCSliderLevel QStringLiteral("Level")
5253
#define KXMLQLCVCSliderLevelLowLimit QStringLiteral("LowLimit")
@@ -70,16 +71,21 @@
7071
#define INPUT_SLIDER_RESET_ID 1
7172
#define INPUT_SLIDER_FLASH_ID 2
7273

74+
/** +/- value range to catch the slider for external
75+
* controllers with no feedback support */
76+
#define VALUE_CATCHING_THRESHOLD 4
7377

7478
VCSlider::VCSlider(Doc *doc, QObject *parent)
7579
: VCWidget(doc, parent)
7680
, m_widgetMode(WSlider)
7781
, m_valueDisplayStyle(DMXValue)
7882
, m_invertedAppearance(false)
83+
, m_catchValues(false)
7984
, m_sliderMode(Adjust)
8085
, m_value(0)
8186
, m_rangeLowLimit(0)
8287
, m_rangeHighLimit(UCHAR_MAX)
88+
, m_lastInputValue(-1)
8389
, m_levelValueChanged(false)
8490
, m_monitorEnabled(false)
8591
, m_monitorValue(0)
@@ -195,6 +201,7 @@ bool VCSlider::copyFrom(const VCWidget *widget)
195201
/* Copy slider appearance */
196202
setValueDisplayStyle(slider->valueDisplayStyle());
197203
setInvertedAppearance(slider->invertedAppearance());
204+
setCatchValues(slider->catchValues());
198205

199206
/* Copy Click & Go feature */
200207
setClickAndGoType(slider->clickAndGoType());
@@ -377,6 +384,24 @@ void VCSlider::setInvertedAppearance(bool inverted)
377384
emit invertedAppearanceChanged(inverted);
378385
}
379386

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+
380405
/*********************************************************************
381406
* Slider value
382407
*********************************************************************/
@@ -1378,7 +1403,23 @@ void VCSlider::slotInputValueChanged(quint8 id, uchar value)
13781403
switch (id)
13791404
{
13801405
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+
}
13811421
setValue(scaledValue, true, false);
1422+
m_lastInputValue = scaledValue;
13821423
break;
13831424
case INPUT_SLIDER_RESET_ID:
13841425
if (value)
@@ -1419,6 +1460,10 @@ bool VCSlider::loadXML(QXmlStreamReader &root)
14191460
else
14201461
setInvertedAppearance(true);
14211462

1463+
/* Values catching */
1464+
if (attrs.hasAttribute(KXMLQLCVCSliderCatchValues))
1465+
setCatchValues(true);
1466+
14221467
while (root.readNextStartElement())
14231468
{
14241469
if (root.name() == KXMLQLCWindowState)
@@ -1634,6 +1679,10 @@ bool VCSlider::saveXML(QXmlStreamWriter *doc) const
16341679
else
16351680
doc->writeAttribute(KXMLQLCVCSliderInvertedAppearance, "false");
16361681

1682+
/* Values catching */
1683+
if (catchValues() == true)
1684+
doc->writeAttribute(KXMLQLCVCSliderCatchValues, "true");
1685+
16371686
/* Window state */
16381687
saveXMLWindowState(doc);
16391688

qmlui/virtualconsole/vcslider.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class VCSlider : public VCWidget, public DMXSource
3838
Q_PROPERTY(ValueDisplayStyle valueDisplayStyle READ valueDisplayStyle WRITE setValueDisplayStyle NOTIFY valueDisplayStyleChanged)
3939
Q_PROPERTY(bool invertedAppearance READ invertedAppearance WRITE setInvertedAppearance NOTIFY invertedAppearanceChanged)
4040
Q_PROPERTY(SliderMode sliderMode READ sliderMode WRITE setSliderMode NOTIFY sliderModeChanged)
41+
Q_PROPERTY(bool catchValues READ catchValues WRITE setCatchValues NOTIFY catchValuesChanged)
4142

4243
Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
4344
Q_PROPERTY(qreal rangeLowLimit READ rangeLowLimit WRITE setRangeLowLimit NOTIFY rangeLowLimitChanged)
@@ -146,10 +147,12 @@ class VCSlider : public VCWidget, public DMXSource
146147
signals:
147148
void valueDisplayStyleChanged(ValueDisplayStyle valueDisplayStyle);
148149
void invertedAppearanceChanged(bool inverted);
150+
void catchValuesChanged(bool enable);
149151

150152
protected:
151153
ValueDisplayStyle m_valueDisplayStyle;
152154
bool m_invertedAppearance;
155+
bool m_catchValues;
153156

154157
/*********************************************************************
155158
* Slider Mode
@@ -180,6 +183,10 @@ class VCSlider : public VCWidget, public DMXSource
180183
int value() const;
181184
void setValue(int value, bool setDMX = true, bool updateFeedback = true);
182185

186+
/** Get/Set the external input values catching */
187+
bool catchValues() const;
188+
void setCatchValues(bool enable);
189+
183190
/** Set/Get the lower limit for the slider values */
184191
void setRangeLowLimit(qreal value);
185192
qreal rangeLowLimit() const;
@@ -202,6 +209,7 @@ class VCSlider : public VCWidget, public DMXSource
202209
int m_value;
203210
qreal m_rangeLowLimit;
204211
qreal m_rangeHighLimit;
212+
int m_lastInputValue;
205213

206214
/*********************************************************************
207215
* Level mode

0 commit comments

Comments
 (0)