summaryrefslogtreecommitdiffstats
path: root/src/effects/effectparameterslot.cpp
diff options
context:
space:
mode:
authorDaniel Schürmann <daschuer@mixxx.org>2014-10-09 01:16:28 +0200
committerDaniel Schürmann <daschuer@mixxx.org>2014-10-09 01:16:28 +0200
commit9d41cf0cf086f240c6713ae8bbf499e49e6bf579 (patch)
treea93bd81b295d41dbd3e420100a768d5e51b66408 /src/effects/effectparameterslot.cpp
parent93f6573baaca339cdb81f1313244c16129fc49c4 (diff)
parent4315223216c25f2dfe604952b19cf1b1bce3fb12 (diff)
Merge remote-tracking branch 'upstream/master' into rm_value_hint
Conflicts: src/effects/effectmanifestparameter.h src/effects/effectparameter.cpp src/effects/effectparameter.h src/effects/effectparameterslot.cpp src/effects/effectparameterslot.h src/effects/native/butterworth8eqeffect.cpp
Diffstat (limited to 'src/effects/effectparameterslot.cpp')
-rw-r--r--src/effects/effectparameterslot.cpp140
1 files changed, 116 insertions, 24 deletions
diff --git a/src/effects/effectparameterslot.cpp b/src/effects/effectparameterslot.cpp
index 25b6169f82..6adf13ea5c 100644
--- a/src/effects/effectparameterslot.cpp
+++ b/src/effects/effectparameterslot.cpp
@@ -14,26 +14,31 @@ EffectParameterSlot::EffectParameterSlot(const unsigned int iRackNumber,
iParameterNumber) {
QString itemPrefix = formatItemPrefix(iParameterNumber);
m_pControlLoaded = new ControlObject(
- ConfigKey(m_group, itemPrefix + QString("_loaded")));
+ ConfigKey(m_group, itemPrefix + QString("_loaded")));
m_pControlLinkType = new ControlPushButton(
- ConfigKey(m_group, itemPrefix + QString("_link_type")));
+ ConfigKey(m_group, itemPrefix + QString("_link_type")));
m_pControlLinkType->setButtonMode(ControlPushButton::TOGGLE);
m_pControlLinkType->setStates(EffectManifestParameter::NUM_LINK_TYPES);
+ m_pControlLinkInverse = new ControlPushButton(
+ ConfigKey(m_group, itemPrefix + QString("_link_inverse")));
+ m_pControlLinkInverse->setButtonMode(ControlPushButton::TOGGLE);
m_pControlValue = new ControlEffectKnob(
ConfigKey(m_group, itemPrefix));
m_pControlType = new ControlObject(
ConfigKey(m_group, itemPrefix + QString("_type")));
- connect(m_pControlLinkType, SIGNAL(valueChanged(double)),
- this, SLOT(slotLinkType(double)));
+ m_pControlLinkType->connectValueChangeRequest(
+ this, SLOT(slotLinkTypeChanged(double)));
+ connect(m_pControlLinkInverse, SIGNAL(valueChanged(double)),
+ this, SLOT(slotLinkInverseChanged(double)));
connect(m_pControlValue, SIGNAL(valueChanged(double)),
this, SLOT(slotValueChanged(double)));
// Read-only controls.
m_pControlType->connectValueChangeRequest(
- this, SLOT(slotValueType(double)), Qt::AutoConnection);
+ this, SLOT(slotValueType(double)));
m_pControlLoaded->connectValueChangeRequest(
- this, SLOT(slotLoaded(double)), Qt::AutoConnection);
+ this, SLOT(slotLoaded(double)));
m_pSoftTakeover = new SoftTakeover();
@@ -45,6 +50,8 @@ EffectParameterSlot::~EffectParameterSlot() {
//qDebug() << debugString() << "destroyed";
delete m_pControlValue;
delete m_pSoftTakeover;
+ delete m_pControlLinkType;
+ delete m_pControlLinkInverse;
}
void EffectParameterSlot::loadEffect(EffectPointer pEffect) {
@@ -69,7 +76,7 @@ void EffectParameterSlot::loadEffect(EffectPointer pEffect) {
qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks.";
}
- // qDebug() << debugString()
+ //qDebug() << debugString()
// << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6")
// .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault);
@@ -81,7 +88,14 @@ void EffectParameterSlot::loadEffect(EffectPointer pEffect) {
m_pControlType->setAndConfirm(static_cast<double>(type));
// Default loaded parameters to loaded and unlinked
m_pControlLoaded->setAndConfirm(1.0);
- m_pControlLinkType->set(m_pEffectParameter->getLinkType());
+
+ m_pControlLinkType->set(m_pEffectParameter->getDefaultLinkType());
+
+ if (m_pEffectParameter->getNeutralPointOnScale() == 1.0) {
+ m_pControlLinkInverse->set(1);
+ } else {
+ m_pControlLinkInverse->set(0);
+ }
connect(m_pEffectParameter, SIGNAL(valueChanged(double)),
this, SLOT(slotParameterValueChanged(double)));
@@ -101,45 +115,123 @@ void EffectParameterSlot::clear() {
m_pControlValue->set(0.0);
m_pControlValue->setDefaultValue(0.0);
m_pControlType->setAndConfirm(0.0);
- m_pControlLinkType->set(EffectManifestParameter::LINK_NONE);
+ m_pControlLinkType->setAndConfirm(EffectManifestParameter::LINK_NONE);
+ m_pControlLinkInverse->set(0.0);
emit(updated());
}
-EffectManifestParameter::LinkType EffectParameterSlot::getLinkType() const{
- //qDebug() << debugString() << "slotLinkType" << v;
- if (m_pEffectParameter) {
- return m_pEffectParameter->getLinkType();
- }
- return EffectManifestParameter::LINK_NONE;
-}
-
void EffectParameterSlot::slotParameterValueChanged(double value) {
//qDebug() << debugString() << "slotParameterValueChanged" << value.toDouble();
m_pControlValue->set(value);
}
+void EffectParameterSlot::slotLinkTypeChanged(double v) {
+ Q_UNUSED(v);
+ m_pSoftTakeover->ignoreNext();
+ if (v > EffectManifestParameter::LINK_LINKED) {
+ double neutral = m_pEffectParameter->getNeutralPointOnScale();
+ if (neutral > 0.0 && neutral < 1.0) {
+ // Button is already a split button
+ // Toggle back to 0
+ v = EffectManifestParameter::LINK_NONE;
+ }
+ }
+ m_pControlLinkType->setAndConfirm(v);
+}
+
+void EffectParameterSlot::slotLinkInverseChanged(double v) {
+ Q_UNUSED(v);
+ m_pSoftTakeover->ignoreNext();
+}
+
void EffectParameterSlot::onChainParameterChanged(double parameter) {
m_dChainParameter = parameter;
if (m_pEffectParameter != NULL) {
- switch (m_pEffectParameter->getLinkType()) {
- case EffectManifestParameter::LINK_INVERSE:
- parameter = 1.0 - parameter;
- // Intentional fall-through.
+ // Intermediate cast to integer is needed for VC++.
+ EffectManifestParameter::LinkType type =
+ static_cast<EffectManifestParameter::LinkType>(
+ static_cast<int>(m_pControlLinkType->get()));
+
+ bool inverse = m_pControlLinkInverse->toBool();
+
+ switch (type) {
case EffectManifestParameter::LINK_LINKED:
if (parameter < 0.0 || parameter > 1.0) {
return;
}
- if (!m_pSoftTakeover->ignore(m_pControlValue, parameter)) {
- m_pControlValue->setParameterFrom(parameter, NULL);
+ {
+ double neutral = m_pEffectParameter->getNeutralPointOnScale();
+ if (neutral > 0.0 && neutral < 1.0) {
+ if (inverse) {
+ // the neutral position must stick where it is
+ neutral = 1.0 - neutral;
+ }
+ // Button is already a split button
+ // Match to center position of Super button
+ if (parameter <= 0.5) {
+ parameter /= 0.5;
+ parameter *= neutral;
+ } else {
+ parameter -= 0.5;
+ parameter /= 0.5;
+ parameter *= 1 - neutral;
+ parameter += neutral;
+ }
+ }
+ }
+ break;
+ case EffectManifestParameter::LINK_LINKED_LEFT:
+ if (parameter >= 0.5 && parameter <= 1.0) {
+ parameter = 0;
+ } else if (parameter >= 0.0 && parameter <= 0.5) {
+ parameter *= 2;
+ parameter = 1.0 - parameter;
+ } else {
+ return;
+ }
+ break;
+ case EffectManifestParameter::LINK_LINKED_RIGHT:
+ if (parameter >= 0.5 && parameter <= 1.0) {
+ parameter -= 0.5;
+ parameter *= 2;
+ } else if (parameter >= 0.0 && parameter < 0.5) {
+ parameter = 0.0;
+ } else {
+ return;
+ }
+ break;
+ case EffectManifestParameter::LINK_LINKED_LEFT_RIGHT:
+ if (parameter >= 0.5 && parameter <= 1.0) {
+ parameter -= 0.5;
+ parameter *= 2;
+ } else if (parameter >= 0.0 && parameter < 0.5) {
+ parameter *= 2;
+ parameter = 1.0 - parameter;
+ } else {
+ return;
}
break;
case EffectManifestParameter::LINK_NONE:
default:
- break;
+ return;
+ }
+
+ if (inverse) {
+ parameter = 1.0 - parameter;
+ }
+
+ //qDebug() << "onChainParameterChanged" << parameter;
+ if (!m_pSoftTakeover->ignore(m_pControlValue, parameter)) {
+ m_pControlValue->setParameterFrom(parameter, NULL);
}
}
}
+void EffectParameterSlot::syncSofttakeover() {
+ double parameter = m_pControlValue->get();
+ m_pSoftTakeover->ignore(m_pControlValue, parameter);
+}
+
double EffectParameterSlot::getValueParameter() const {
return m_pControlValue->getParameter();
}