diff options
author | Daniel Schürmann <daschuer@mixxx.org> | 2014-10-09 01:16:28 +0200 |
---|---|---|
committer | Daniel Schürmann <daschuer@mixxx.org> | 2014-10-09 01:16:28 +0200 |
commit | 9d41cf0cf086f240c6713ae8bbf499e49e6bf579 (patch) | |
tree | a93bd81b295d41dbd3e420100a768d5e51b66408 /src/effects/effectparameterslot.cpp | |
parent | 93f6573baaca339cdb81f1313244c16129fc49c4 (diff) | |
parent | 4315223216c25f2dfe604952b19cf1b1bce3fb12 (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.cpp | 140 |
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(); } |