Skip to content

Commit

Permalink
Merge pull request #1537 from hjtappe/limited-gobo-control
Browse files Browse the repository at this point in the history
VC Click & Go Gobo control on limited-range knobs and sliders
  • Loading branch information
mcallegari committed Apr 30, 2024
2 parents 73349d7 + 22a5798 commit e1f5d16
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 24 deletions.
6 changes: 4 additions & 2 deletions qmlui/qml/QLCPlusKnob.qml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
limitations under the License.
*/

import QtQuick 2.0
import QtQuick.Controls 2.0
import QtQuick 2.14
import QtQuick.Controls 2.14

import "CanvasDrawFunctions.js" as DrawFuncs
import "."
Expand All @@ -33,6 +33,8 @@ Dial

from: 0
to: 255
stepSize: 1.0
wheelEnabled: true

onPositionChanged: kCanvas.requestPaint()
onHeightChanged: kCanvas.requestPaint()
Expand Down
13 changes: 10 additions & 3 deletions qmlui/qml/fixturesfunctions/PresetCapabilityItem.qml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ Rectangle
return

var resArray = capability.resources
var slMin = (sliderRoot && sliderRoot.sliderObj) ? sliderRoot.sliderObj.rangeLowLimit : 0
var slMax = (sliderRoot && sliderRoot.sliderObj) ? sliderRoot.sliderObj.rangeHighLimit : 255
visible = (capability.min <= slMax || capability.max <= slMin)
capName.label = capability.name

if (resArray.length === 0)
Expand All @@ -63,7 +66,7 @@ Rectangle
if (Qt.platform.os === "android")
pic.source = resArray[0]
else
pic.source = "file:/" + resArray[0]
pic.source = "file:" + resArray[0]
}
}

Expand Down Expand Up @@ -147,8 +150,12 @@ Rectangle
onReleased: iRoot.color = "white"
onClicked:
{
var value = ((capability.max - capability.min) * capBar.width) / iRoot.width
//console.log("max: " + capability.max + " min: " + capability.min + " value: " + value)
var slMin = (sliderRoot && sliderRoot.sliderObj) ? sliderRoot.sliderObj.rangeLowLimit : 0
var slMax = (sliderRoot && sliderRoot.sliderObj) ? sliderRoot.sliderObj.rangeHighLimit : 255
var cMin = Math.max(capability.min, slMin)
var cMax = Math.min(capability.max, slMax)
var value = Math.round(((cMax - cMin) * capBar.width) / iRoot.width)
//console.log("max: " + capability.max + "|" + slMax + "|" + cMax + " min: " + capability.min + "|" + slMin + "|" + cMin + " value: " + value)
valueChanged(value + capability.min)
}
}
Expand Down
6 changes: 3 additions & 3 deletions qmlui/qml/virtualconsole/VCSliderItem.qml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
limitations under the License.
*/

import QtQuick 2.0
import QtQuick 2.14
import QtQuick.Layouts 1.1

import org.qlcplus.classes 1.0
Expand Down Expand Up @@ -149,7 +149,7 @@ VCWidgetItem
to: sliderObj ? sliderObj.rangeHighLimit : 255
value: sliderValue

onMoved: if (sliderObj) sliderObj.value = value // position * 255
onValueChanged: if (sliderObj) sliderObj.value = value
}

// widget name text box
Expand Down Expand Up @@ -230,7 +230,7 @@ VCWidgetItem
if (Qt.platform.os === "android")
presetImageBox.source = cngResource
else
presetImageBox.source = "file:/" + cngResource
presetImageBox.source = "file:" + cngResource
}

onClicked: colorToolLoader.toggleVisibility()
Expand Down
11 changes: 9 additions & 2 deletions qmlui/virtualconsole/vcslider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1029,7 +1029,7 @@ void VCSlider::writeDMXLevel(MasterTimer* timer, QList<Universe *> universes)

if (clickAndGoType() == CnGColors)
{
float f = SCALE(float(m_value), rangeLowLimit(), rangeHighLimit(), 0.0, 200.0);
float f = SCALE(float(modLevel), rangeLowLimit(), rangeHighLimit(), 0.0, 200.0);

if ((uchar)f != 0)
{
Expand Down Expand Up @@ -1136,6 +1136,10 @@ void VCSlider::writeDMXLevel(MasterTimer* timer, QList<Universe *> universes)
if (m_isOverriding)
fc->addFlag(FadeChannel::Override);

// request to autoremove LTP channels when set
if (! (chType & FadeChannel::Intensity))
fc->addFlag(FadeChannel::AutoRemove);

if (chType & FadeChannel::Intensity && clickAndGoType() == CnGColors)
{
const QLCChannel *qlcch = fxi->channel(scv.channel);
Expand Down Expand Up @@ -1233,10 +1237,13 @@ void VCSlider::updateFeedback()

void VCSlider::slotInputValueChanged(quint8 id, uchar value)
{
int scaledValue = SCALE(float(value), float(0), float(UCHAR_MAX),
float(rangeLowLimit()),
float(rangeHighLimit()));
switch (id)
{
case INPUT_SLIDER_CONTROL_ID:
setValue(value, true, false);
setValue(scaledValue, true, false);
break;
case INPUT_SLIDER_RESET_ID:
if (value)
Expand Down
34 changes: 24 additions & 10 deletions ui/src/clickandgowidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ ClickAndGoWidget::ClickAndGoWidget(QWidget *parent) :
m_cellBarXpos = 1;
m_cellBarYpos = 1;
m_cellBarWidth = 0;
m_levelLowLimit = 0;
m_levelHighLimit = 255;
}

void ClickAndGoWidget::setupGradient(QColor begin, QColor end)
Expand Down Expand Up @@ -146,6 +148,16 @@ void ClickAndGoWidget::setType(int type, const QLCChannel *chan)
m_type = type;
}

void ClickAndGoWidget::setLevelLowLimit(int min)
{
this->m_levelLowLimit = min;
}

void ClickAndGoWidget::setLevelHighLimit(int max)
{
this->m_levelHighLimit = max;
}

int ClickAndGoWidget::getType()
{
return m_type;
Expand Down Expand Up @@ -212,7 +224,7 @@ QImage ClickAndGoWidget::getImageFromValue(uchar value)
{
foreach (PresetResource res, m_resources)
{
if (value >= res.m_min && value <= res.m_max)
if (value >= res.m_resLowLimit && value <= res.m_resHighLimit)
return res.m_thumbnail;
}
}
Expand Down Expand Up @@ -315,6 +327,8 @@ void ClickAndGoWidget::setupPresetPicker()
for (int i = 0; i < m_resources.size(); i++)
{
PresetResource res = m_resources.at(i);
if (res.m_resLowLimit > m_levelHighLimit || res.m_resHighLimit < m_levelLowLimit)
continue;
painter.setPen(Qt::black);
painter.drawRect(x, y, m_cellWidth, CELL_H);
painter.drawImage(x + 1, y + 4, res.m_thumbnail);
Expand Down Expand Up @@ -355,13 +369,13 @@ void ClickAndGoWidget::mousePressEvent(QMouseEvent *event)
if (m_hoverCellIdx >= 0 && m_hoverCellIdx < m_resources.length())
{
PresetResource res = m_resources.at(m_hoverCellIdx);
qDebug() << "Mouse press. cellW: " << m_cellBarWidth << "min: " << res.m_min << "max:" << res.m_max;
qDebug() << "Mouse press. cellW: " << m_cellBarWidth << "min: " << res.m_resLowLimit << "max:" << res.m_resHighLimit;

float f = SCALE(float(m_cellBarWidth),
float(0),
float(m_cellWidth),
float(0), float(res.m_max - res.m_min));
emit levelAndPresetChanged((uchar)f + res.m_min, res.m_thumbnail);
float(0), float(res.m_resHighLimit - res.m_resLowLimit));
emit levelAndPresetChanged((uchar)f + res.m_resLowLimit, res.m_thumbnail);
}
}
QWidget::mousePressEvent(event);
Expand Down Expand Up @@ -421,8 +435,8 @@ void ClickAndGoWidget::paintEvent(QPaintEvent *event)
ClickAndGoWidget::PresetResource::PresetResource(QString path, QString text, uchar min, uchar max)
{
m_descr = text;
m_min = min;
m_max = max;
m_resLowLimit = min;
m_resHighLimit = max;
QImage px(path);
m_thumbnail = QImage(40, 40, QImage::Format_RGB32);
m_thumbnail.fill(Qt::white);
Expand All @@ -436,8 +450,8 @@ ClickAndGoWidget::PresetResource::PresetResource(QColor color1, QColor color2,
QString text, uchar min, uchar max)
{
m_descr = text;
m_min = min;
m_max = max;
m_resLowLimit = min;
m_resHighLimit = max;
m_thumbnail = QImage(40, 40, QImage::Format_RGB32);
if (color2.isValid() == false)
m_thumbnail.fill(color1.rgb());
Expand All @@ -453,8 +467,8 @@ ClickAndGoWidget::PresetResource::PresetResource(QColor color1, QColor color2,
ClickAndGoWidget::PresetResource::PresetResource(int index, QString text, uchar min, uchar max)
{
m_descr = text;
m_min = min;
m_max = max;
m_resLowLimit = min;
m_resHighLimit = max;
m_thumbnail = QImage(40, 40, QImage::Format_RGB32);
m_thumbnail.fill(Qt::white);
QFont tfont = QApplication::font();
Expand Down
14 changes: 12 additions & 2 deletions ui/src/clickandgowidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ class ClickAndGoWidget : public QWidget
*/
int getType();

/** Set the low limits from the fader as a preset filter */
void setLevelLowLimit(int min);

/** Set the high limits from the fader as a preset filter */
void setLevelHighLimit(int max);

/**
* Returns the color at pos position.
* Used with primary colors linear gradient
Expand Down Expand Up @@ -123,8 +129,8 @@ class ClickAndGoWidget : public QWidget
public:
QImage m_thumbnail;
QString m_descr;
uchar m_min;
uchar m_max;
int m_resLowLimit;
int m_resHighLimit;
};

protected:
Expand All @@ -145,6 +151,10 @@ class ClickAndGoWidget : public QWidget
QString m_title;
QList<ClickAndGoWidget::PresetResource> m_resources;

/** Fader limits to also limit the presets */
int m_levelLowLimit;
int m_levelHighLimit;

/** Used to group all the primary colors */
bool m_linearColor;

Expand Down
10 changes: 8 additions & 2 deletions ui/src/virtualconsole/vcslider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,8 @@ QList <VCSlider::LevelChannel> VCSlider::levelChannels()
void VCSlider::setLevelLowLimit(uchar value)
{
m_levelLowLimit = value;
if (m_cngWidget != NULL)
m_cngWidget->setLevelLowLimit(value);
}

uchar VCSlider::levelLowLimit() const
Expand All @@ -582,6 +584,8 @@ uchar VCSlider::levelLowLimit() const
void VCSlider::setLevelHighLimit(uchar value)
{
m_levelHighLimit = value;
if (m_cngWidget != NULL)
m_cngWidget->setLevelHighLimit(value);
}

uchar VCSlider::levelHighLimit() const
Expand Down Expand Up @@ -762,6 +766,8 @@ void VCSlider::setupClickAndGoWidget()
{
const QLCChannel *chan = fxi->channel(lChan.channel);
m_cngWidget->setType(m_cngType, chan);
m_cngWidget->setLevelLowLimit(this->levelLowLimit());
m_cngWidget->setLevelHighLimit(this->levelHighLimit());
}
}
else
Expand Down Expand Up @@ -804,7 +810,7 @@ void VCSlider::setClickAndGoWidgetFromLevel(uchar level)

void VCSlider::slotClickAndGoLevelChanged(uchar level)
{
setSliderValue(level);
setSliderValue(level, false, false);
updateFeedback();

QColor col = m_cngWidget->getColorAt(level);
Expand Down Expand Up @@ -832,7 +838,7 @@ void VCSlider::slotClickAndGoColorChanged(QRgb color)

void VCSlider::slotClickAndGoLevelAndPresetChanged(uchar level, QImage img)
{
setSliderValue(level);
setSliderValue(level, false, false);
updateFeedback();

QPixmap px = QPixmap::fromImage(img);
Expand Down

0 comments on commit e1f5d16

Please sign in to comment.