From 21ce1c555679d88a54dd008de9dfeaf6978a80d4 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 15 Aug 2022 22:49:22 +0200 Subject: [PATCH 01/14] WEffectChainPresetSelector: use Qt::ToolTipRole data for tooltip --- src/widget/weffectchainpresetselector.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/widget/weffectchainpresetselector.cpp b/src/widget/weffectchainpresetselector.cpp index ce5d4b7bf0f..a60f411d9fe 100644 --- a/src/widget/weffectchainpresetselector.cpp +++ b/src/widget/weffectchainpresetselector.cpp @@ -84,7 +84,6 @@ void WEffectChainPresetSelector::populate() { } void WEffectChainPresetSelector::slotEffectChainPresetSelected(int index) { - Q_UNUSED(index); m_pChain->loadChainPreset( m_pChainPresetManager->getPreset(currentData().toString())); setBaseTooltip(itemData(index, Qt::ToolTipRole).toString()); @@ -97,7 +96,7 @@ void WEffectChainPresetSelector::slotEffectChainPresetSelected(int index) { void WEffectChainPresetSelector::slotChainPresetChanged(const QString& name) { setCurrentIndex(findData(name)); - setBaseTooltip(name); + setBaseTooltip(itemData(currentIndex(), Qt::ToolTipRole).toString()); } bool WEffectChainPresetSelector::event(QEvent* pEvent) { From 265d9f915fa7d0e120d8752386decd1210db69c8 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Fri, 2 Sep 2022 14:21:18 +0200 Subject: [PATCH 02/14] Effects: add/improve comments on chain presets --- src/effects/effectsmanager.cpp | 2 ++ src/effects/effectsmanager.h | 1 + src/effects/presets/effectchainpresetmanager.cpp | 6 ++++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 36c107e344d..78dda509165 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -177,6 +177,8 @@ void EffectsManager::readEffectsXml() { } file.close(); + // QuickEffect chains are created only for existing main decks, so read + // the configured presets only for those QStringList deckStrings; for (auto it = m_quickEffectChains.begin(); it != m_quickEffectChains.end(); it++) { deckStrings << it.key(); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 2e45b256405..5594e1a36a3 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -88,6 +88,7 @@ class EffectsManager { QList m_standardEffectChains; OutputEffectChainPointer m_outputEffectChain; + // These two store QHash m_equalizerEffectChains; QHash m_quickEffectChains; diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index ff637695d01..6e2a8d913cc 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -591,7 +591,7 @@ EffectsXmlData EffectChainPresetManager::readEffectsXml( quickEffectPresets.insert(deckString, defaultQuickEffectChainPreset); } - // Reload state of standard chains + // Read state of standard chains QDomElement root = doc.documentElement(); QDomElement rackElement = XmlParse::selectElement(root, EffectXml::kRack); QDomElement chainsElement = @@ -671,7 +671,7 @@ EffectsXmlData EffectChainPresetManager::readEffectsXml( emit effectChainPresetListUpdated(); emit quickEffectChainPresetListUpdated(); - // Reload presets that were loaded into QuickEffects on last shutdown + // Read names of presets that were loaded into QuickEffects on last shutdown QDomElement quickEffectPresetsElement = XmlParse::selectElement(root, EffectXml::kQuickEffectChainPresets); QDomNodeList quickEffectNodeList = @@ -683,6 +683,8 @@ EffectsXmlData EffectChainPresetManager::readEffectsXml( QString deckGroup = presetNameElement.attribute(QStringLiteral("group")); auto pPreset = m_effectChainPresets.value(presetNameElement.text()); if (pPreset != nullptr) { + // Replace defaultQuickEffectChainPreset with pPreset + // for this deck group quickEffectPresets.insert(deckGroup, pPreset); } } From 7895beef1ece5b1677da6b255ad364ea71bbc00a Mon Sep 17 00:00:00 2001 From: ronso0 Date: Fri, 2 Sep 2022 14:45:17 +0200 Subject: [PATCH 03/14] DlgPrefEQ: remove '---' hack from QuickEffect selectors --- src/preferences/dialog/dlgprefeq.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index b6df75433c3..0976f86ced9 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -302,10 +302,7 @@ void DlgPrefEQ::populateDeckQuickEffectBoxList( QString deckGroupName = PlayerManager::groupForDeck(deck); QString unitGroup = QuickEffectChain::formatEffectChainGroup(deckGroupName); EffectChainPointer pChain = m_pEffectsManager->getEffectChain(unitGroup); - - // Add empty item at the top: no effect - box->addItem(kNoEffectString); - int i = 1; + int i = 0; for (const auto& pChainPreset : presetList) { box->addItem(pChainPreset->name()); if (pChain->presetName() == pChainPreset->name()) { @@ -492,8 +489,8 @@ void DlgPrefEQ::slotQuickEffectChangedOnDeck(int effectIndex) { EffectChainPointer pChain = m_pEffectsManager->getEffectChain(unitGroup); QList presetList = m_pChainPresetManager->getQuickEffectPresetsSorted(); - if (pChain && effectIndex > 0 && effectIndex <= presetList.size()) { - pChain->loadChainPreset(presetList[effectIndex - 1]); + if (pChain && effectIndex >= 0 && effectIndex < presetList.size()) { + pChain->loadChainPreset(presetList[effectIndex]); } } From 1f72db7f82514a71edfcf709136596e0851966e1 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Tue, 16 Aug 2022 23:57:54 +0200 Subject: [PATCH 04/14] Effects: allow clearing QuickEffect chains via '---' item in preset selectors --- .../presets/effectchainpresetmanager.cpp | 58 ++++++++++++++++++- src/preferences/dialog/dlgprefeffects.cpp | 6 ++ src/widget/weffectchainpresetselector.cpp | 2 + 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 6e2a8d913cc..d2e8f2a7e4e 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -123,6 +123,12 @@ void EffectChainPresetManager::importPreset() { EffectChainPresetPointer pPreset( new EffectChainPreset(doc.documentElement())); if (!pPreset->isEmpty() && !pPreset->name().isEmpty()) { + // Don't allow '---' because that's the name of the internal empty preset + if (pPreset->name() == kNoEffectString) { + pPreset->setName(pPreset->name() + + QLatin1String(" (") + tr("imported") + QLatin1String(")")); + } + while (m_effectChainPresets.contains(pPreset->name())) { pPreset->setName(pPreset->name() + QLatin1String(" (") + tr("duplicate") + QLatin1String(")")); @@ -227,10 +233,16 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(oldName)) { return; } + // Don't allow renaming the internal empty '---' preset + VERIFY_OR_DEBUG_ASSERT(oldName != kNoEffectString) { + return; + } QString newName; QString errorText; - while (newName.isEmpty() || m_effectChainPresets.contains(newName)) { + // Don't allow '---' as new name either + while (newName.isEmpty() || m_effectChainPresets.contains(newName) || + newName == kNoEffectString) { bool okay = false; newName = QInputDialog::getText(nullptr, tr("Rename effect chain preset"), @@ -246,6 +258,8 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { if (newName.isEmpty()) { errorText = tr("Effect chain preset name must not be empty.") + QStringLiteral("\n"); + } else if (newName == kNoEffectString) { + errorText = tr("Invalid name \"%1\"").arg(newName) + QStringLiteral("\n"); } else if (m_effectChainPresets.contains(newName)) { errorText = tr("An effect chain preset named \"%1\" already exists.") @@ -373,13 +387,19 @@ void EffectChainPresetManager::savePresetAndReload(EffectChainPointer pChainSlot bool EffectChainPresetManager::savePreset(EffectChainPresetPointer pPreset) { QString name; QString errorText; - while (name.isEmpty() || m_effectChainPresets.contains(name)) { + // Don't allow '---' because that's the name of the internal empty preset + // Clear initial name to avoid confusion. + QString presetName; + if (pPreset->name() != kNoEffectString) { + presetName = pPreset->name(); + } + while (name.isEmpty() || m_effectChainPresets.contains(name) || name == kNoEffectString) { bool okay = false; name = QInputDialog::getText(nullptr, tr("Save preset for effect chain"), errorText + "\n" + tr("Name for new effect chain preset:"), QLineEdit::Normal, - pPreset->name(), + presetName, &okay) .trimmed(); if (!okay) { @@ -388,6 +408,8 @@ bool EffectChainPresetManager::savePreset(EffectChainPresetPointer pPreset) { if (name.isEmpty()) { errorText = tr("Effect chain preset name must not be empty.") + QStringLiteral("\n"); + } else if (name == kNoEffectString) { + errorText = tr("Invalid name \"%1\"").arg(name) + QStringLiteral("\n"); } else if (m_effectChainPresets.contains(name)) { errorText = tr("An effect chain preset named \"%1\" already exists.") @@ -447,6 +469,11 @@ void EffectChainPresetManager::importUserPresets() { EffectChainPresetPointer pEffectChainPreset = loadPresetFromFile( savedPresetsPath + kFolderDelimiter + filePath); if (pEffectChainPreset && !pEffectChainPreset->isEmpty()) { + // Don't allow '---' because that's the name of the internal empty preset + if (pEffectChainPreset->name() == kNoEffectString) { + pEffectChainPreset->setName(pEffectChainPreset->name() + + QLatin1String(" (") + tr("imported") + QLatin1String(")")); + } m_effectChainPresets.insert( pEffectChainPreset->name(), pEffectChainPreset); } @@ -542,6 +569,11 @@ void EffectChainPresetManager::resetToDefaults() { } bool EffectChainPresetManager::savePresetXml(EffectChainPresetPointer pPreset) { + // Don't store the empty '---' preset in effects/chains. + // Shouldn't be possible via GUI anyway because the 'Update Preset' button + // is not shown in WEffectChainPresetButton if this preset is loaded. + DEBUG_ASSERT(pPreset->name() != kNoEffectString); + QString path(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); QDir effectsChainsDir(path); if (!effectsChainsDir.exists()) { @@ -668,6 +700,22 @@ EffectsXmlData EffectChainPresetManager::readEffectsXml( prependRemainingPresetsToLists(); + // Create the empty '---' chain preset on each start. + // Its sole purpose is to eject the current QuickEffect chain presets via GUI. + // It will not be saved to effects/chains nor written to effects.xml + // except as identifier for QuickEffect chains. + // It will not be visible in the effects preferences. + EffectManifestPointer pEmptyChainManifest(new EffectManifest()); + pEmptyChainManifest->setName(kNoEffectString); + pEmptyChainManifest->setShortName(kNoEffectString); + + auto pEmptyChainPreset = + EffectChainPresetPointer(new EffectChainPreset(pEmptyChainManifest)); + pEmptyChainPreset->setName(pEmptyChainManifest->name()); + + m_effectChainPresets.insert(pEmptyChainPreset->name(), pEmptyChainPreset); + m_quickEffectChainPresetsSorted.prepend(pEmptyChainPreset); + emit effectChainPresetListUpdated(); emit quickEffectChainPresetListUpdated(); @@ -719,6 +767,10 @@ void EffectChainPresetManager::saveEffectsXml(QDomDocument* pDoc, const EffectsX QDomElement quickEffectChainPresetListElement = pDoc->createElement(EffectXml::kQuickEffectList); for (const auto& pPreset : std::as_const(m_quickEffectChainPresetsSorted)) { + // Don't store the empty '---' in the QuickEffect preset list + if (pPreset->name() == kNoEffectString) { + continue; + } XmlParse::addElement(*pDoc, quickEffectChainPresetListElement, EffectXml::kChainPresetName, diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index bec3eeeabe2..feb5a640be6 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -170,6 +170,12 @@ void DlgPrefEffects::loadChainPresetLists() { QStringList quickEffectChainPresetNames; for (const auto& pChainPreset : m_pChainPresetManager->getQuickEffectPresetsSorted()) { + // Don't show the empty '---' preset. + // After pushing the changed preferences list back to the preset manager + // it is re-added to the root list. + if (pChainPreset->name() == kNoEffectString) { + continue; + } quickEffectChainPresetNames << pChainPreset->name(); } pModel = dynamic_cast(quickEffectListView->model()); diff --git a/src/widget/weffectchainpresetselector.cpp b/src/widget/weffectchainpresetselector.cpp index a60f411d9fe..658a89d4215 100644 --- a/src/widget/weffectchainpresetselector.cpp +++ b/src/widget/weffectchainpresetselector.cpp @@ -86,6 +86,8 @@ void WEffectChainPresetSelector::populate() { void WEffectChainPresetSelector::slotEffectChainPresetSelected(int index) { m_pChain->loadChainPreset( m_pChainPresetManager->getPreset(currentData().toString())); + // TODO(ronso0) Clean up. This is set again in slotChainPresetChanged + // after the new preset was actually loaded. setBaseTooltip(itemData(index, Qt::ToolTipRole).toString()); // After selecting an effect move focus to the tracks table in order // to immediately allow keyboard shortcuts again. From e261d2432e6d5298067e9e1e53660089d0f1c425 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Sat, 3 Sep 2022 15:16:33 +0200 Subject: [PATCH 05/14] add EffectChainPreset::isReadOnly --- src/effects/presets/effectchainpreset.cpp | 2 ++ src/effects/presets/effectchainpreset.h | 7 ++++++ .../presets/effectchainpresetmanager.cpp | 24 +++++++++++++++---- src/widget/weffectchainpresetbutton.cpp | 9 ++++--- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index 69eb59a2bef..a344a3cff6c 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -28,6 +28,8 @@ EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { m_dSuper = XmlParse::selectNodeDouble(chainElement, EffectXml::kChainSuperParameter); + m_readOnly = false; + QDomElement effectsElement = XmlParse::selectElement(chainElement, EffectXml::kEffectsRoot); QDomNodeList effectList = effectsElement.childNodes(); diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index 38c30955019..587cbef90bc 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -40,6 +40,12 @@ class EffectChainPreset { double superKnob() const { return m_dSuper; } + void setReadOnly() { + m_readOnly = true; + } + bool isReadOnly() const { + return m_readOnly; + } const QList& effectPresets() const { return m_effectPresets; @@ -50,4 +56,5 @@ class EffectChainPreset { EffectChainMixMode::Type m_mixMode; double m_dSuper; QList m_effectPresets; + bool m_readOnly = false; }; diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index d2e8f2a7e4e..34e8c934483 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -233,8 +233,14 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(oldName)) { return; } - // Don't allow renaming the internal empty '---' preset - VERIFY_OR_DEBUG_ASSERT(oldName != kNoEffectString) { + if (m_effectChainPresets.value(oldName)->isReadOnly()) { + QMessageBox msgBox; + msgBox.setText(tr("Effect chain preset can not be renamed")); + msgBox.setInformativeText( + tr("Effect chain preset \"%1\" is read-only and can not be renamed.") + .arg(oldName)); + msgBox.setIcon(QMessageBox::Warning); + msgBox.exec(); return; } @@ -315,6 +321,16 @@ bool EffectChainPresetManager::deletePreset(const QString& chainPresetName) { VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { return false; } + if (m_effectChainPresets.value(chainPresetName)->isReadOnly()) { + QMessageBox msgBox; + msgBox.setText(tr("Effect chain preset can not be deleted")); + msgBox.setInformativeText( + tr("Effect chain preset \"%1\" is read-only and can not be deleted.") + .arg(chainPresetName)); + msgBox.setIcon(QMessageBox::Warning); + msgBox.exec(); + return false; + } auto pressedButton = QMessageBox::question(nullptr, tr("Remove effect chain preset"), tr("Are you sure you want to delete the effect chain preset " @@ -707,11 +723,11 @@ EffectsXmlData EffectChainPresetManager::readEffectsXml( // It will not be visible in the effects preferences. EffectManifestPointer pEmptyChainManifest(new EffectManifest()); pEmptyChainManifest->setName(kNoEffectString); + // Required for the QuickEffect selector in DlgPrefEQ pEmptyChainManifest->setShortName(kNoEffectString); - auto pEmptyChainPreset = EffectChainPresetPointer(new EffectChainPreset(pEmptyChainManifest)); - pEmptyChainPreset->setName(pEmptyChainManifest->name()); + pEmptyChainPreset->setReadOnly(); m_effectChainPresets.insert(pEmptyChainPreset->name(), pEmptyChainPreset); m_quickEffectChainPresetsSorted.prepend(pEmptyChainPreset); diff --git a/src/widget/weffectchainpresetbutton.cpp b/src/widget/weffectchainpresetbutton.cpp index ed5d33da02f..ff589516bab 100644 --- a/src/widget/weffectchainpresetbutton.cpp +++ b/src/widget/weffectchainpresetbutton.cpp @@ -46,20 +46,23 @@ void WEffectChainPresetButton::populateMenu() { m_pMenu->clear(); // Chain preset items - bool chainIsPreset = false; + bool allowUpdatingPreset = false; for (const auto& pChainPreset : m_pChainPresetManager->getPresetsSorted()) { QString title = pChainPreset->name(); if (title == m_pChain->presetName()) { title = QChar(0x2713) + // CHECK MARK QChar(' ') + title; - chainIsPreset = true; + allowUpdatingPreset = !pChainPreset->isReadOnly(); } m_pMenu->addAction(title, this, [this, pChainPreset]() { m_pChain->loadChainPreset(pChainPreset); }); } m_pMenu->addSeparator(); - if (chainIsPreset) { + // This prevents showing the Update button for the empty '---' preset, in case + // WEffectChainPresetButton and effect slot controls of a QuickEffect chain are + // exposed in a custom skin. + if (allowUpdatingPreset) { m_pMenu->addAction(tr("Update Preset"), this, [this]() { m_pChainPresetManager->updatePreset(m_pChain); }); From f40484a1d9bba0a8bc7d31b8ebe26b52c4082beb Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 7 Sep 2022 00:25:41 +0200 Subject: [PATCH 06/14] Effects: always keep '---' at the top of preset lists --- src/effects/presets/effectchainpresetmanager.cpp | 16 ++++++++++++++++ src/effects/presets/effectchainpresetmanager.h | 1 + 2 files changed, 17 insertions(+) diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 34e8c934483..b3c2a1622a4 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -389,10 +389,26 @@ void EffectChainPresetManager::setQuickEffectPresetOrder( m_quickEffectChainPresetsSorted.append( m_effectChainPresets.value(chainPresetName)); } + prependEmptyPreset(m_quickEffectChainPresetsSorted); emit quickEffectChainPresetListUpdated(); } +void EffectChainPresetManager::prependEmptyPreset( + QList& pPresetList) const { + // Ensure empty '---' preset is the first list item + const auto& pEmptyPreset = m_effectChainPresets.value(kNoEffectString); + VERIFY_OR_DEBUG_ASSERT(pEmptyPreset) { + return; + } + int index = pPresetList.indexOf(pEmptyPreset); + if (index == -1) { // not in list, re-add it + pPresetList.prepend(pEmptyPreset); + } else if (index != 0) { // not first item, move to top + pPresetList.move(index, 0); + } +} + void EffectChainPresetManager::savePresetAndReload(EffectChainPointer pChainSlot) { auto pPreset = EffectChainPresetPointer::create(pChainSlot.data()); if (savePreset(pPreset)) { diff --git a/src/effects/presets/effectchainpresetmanager.h b/src/effects/presets/effectchainpresetmanager.h index e01abbd2b51..c23c38c59d5 100644 --- a/src/effects/presets/effectchainpresetmanager.h +++ b/src/effects/presets/effectchainpresetmanager.h @@ -60,6 +60,7 @@ class EffectChainPresetManager : public QObject { void setPresetOrder(const QStringList& chainPresetList); void setQuickEffectPresetOrder(const QStringList& chainPresetList); + void prependEmptyPreset(QList& pPresetList) const; EffectChainPresetPointer getPreset(const QString& name) const { return m_effectChainPresets.value(name); From 52c841722813b4cf252b64d3daed226b077beb33 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 7 Sep 2022 00:29:53 +0200 Subject: [PATCH 07/14] Effects: 'next/prev_chain_preset' reuse 'chain_preset_selector' --- src/effects/effectchain.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/effects/effectchain.cpp b/src/effects/effectchain.cpp index 7d29850fea2..da725ea6d60 100644 --- a/src/effects/effectchain.cpp +++ b/src/effects/effectchain.cpp @@ -356,13 +356,13 @@ void EffectChain::setControlLoadedPresetIndex(uint index) { void EffectChain::slotControlNextChainPreset(double value) { if (value > 0) { - loadChainPreset(presetAtIndex(presetIndex() + 1)); + slotControlChainPresetSelector(1); } } void EffectChain::slotControlPrevChainPreset(double value) { if (value > 0) { - loadChainPreset(presetAtIndex(presetIndex() - 1)); + slotControlChainPresetSelector(-1); } } From 5ede2d5a852a568c94e9ddeb1ff336b78584a13b Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 7 Sep 2022 00:31:11 +0200 Subject: [PATCH 08/14] WEffectChainPresetSelector: use qobject_cast to test if it's a QuickEffect chain --- src/widget/weffectchainpresetselector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/weffectchainpresetselector.cpp b/src/widget/weffectchainpresetselector.cpp index 658a89d4215..0ddc75b19b8 100644 --- a/src/widget/weffectchainpresetselector.cpp +++ b/src/widget/weffectchainpresetselector.cpp @@ -36,7 +36,7 @@ void WEffectChainPresetSelector::setup(const QDomNode& node, const SkinContext& } auto chainPresetListUpdateSignal = &EffectChainPresetManager::effectChainPresetListUpdated; - auto pQuickEffectChain = dynamic_cast(m_pChain.data()); + auto pQuickEffectChain = qobject_cast(m_pChain.data()); if (pQuickEffectChain) { chainPresetListUpdateSignal = &EffectChainPresetManager::quickEffectChainPresetListUpdated; m_bQuickEffectChain = true; From 72a02909c0fb05b12b3f2657dfc11af50812f0e7 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 19 Sep 2022 21:58:15 +0200 Subject: [PATCH 09/14] WEffectChainPresetSelector: remove redundant setBaseTooltip() --- src/widget/weffectchainpresetselector.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/widget/weffectchainpresetselector.cpp b/src/widget/weffectchainpresetselector.cpp index 0ddc75b19b8..0aa3ea3677f 100644 --- a/src/widget/weffectchainpresetselector.cpp +++ b/src/widget/weffectchainpresetselector.cpp @@ -86,9 +86,6 @@ void WEffectChainPresetSelector::populate() { void WEffectChainPresetSelector::slotEffectChainPresetSelected(int index) { m_pChain->loadChainPreset( m_pChainPresetManager->getPreset(currentData().toString())); - // TODO(ronso0) Clean up. This is set again in slotChainPresetChanged - // after the new preset was actually loaded. - setBaseTooltip(itemData(index, Qt::ToolTipRole).toString()); // After selecting an effect move focus to the tracks table in order // to immediately allow keyboard shortcuts again. // TODO(ronso0) switch to previously focused (library?) widget instead From 864e658ca52eb7500c99fca57232265080d9cba0 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 21 Sep 2022 21:34:20 +0200 Subject: [PATCH 10/14] EffectsManager: clarify comment in readEffectsXml() --- src/effects/effectsmanager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 78dda509165..12cc1470bb6 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -177,8 +177,8 @@ void EffectsManager::readEffectsXml() { } file.close(); - // QuickEffect chains are created only for existing main decks, so read - // the configured presets only for those + // Note: QuickEffect chains are created only for existing main decks + // thus only for those the configured presets are requested QStringList deckStrings; for (auto it = m_quickEffectChains.begin(); it != m_quickEffectChains.end(); it++) { deckStrings << it.key(); From 701a29a6b1e620cc3ca4b393f5c075c741d07c0b Mon Sep 17 00:00:00 2001 From: ronso0 Date: Thu, 22 Sep 2022 10:12:24 +0200 Subject: [PATCH 11/14] WEffectChainPresetButton: revert logic for showing Update button --- src/widget/weffectchainpresetbutton.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/widget/weffectchainpresetbutton.cpp b/src/widget/weffectchainpresetbutton.cpp index ff589516bab..64b20672782 100644 --- a/src/widget/weffectchainpresetbutton.cpp +++ b/src/widget/weffectchainpresetbutton.cpp @@ -46,13 +46,13 @@ void WEffectChainPresetButton::populateMenu() { m_pMenu->clear(); // Chain preset items - bool allowUpdatingPreset = false; + bool presetIsReadOnly = true; for (const auto& pChainPreset : m_pChainPresetManager->getPresetsSorted()) { QString title = pChainPreset->name(); if (title == m_pChain->presetName()) { title = QChar(0x2713) + // CHECK MARK QChar(' ') + title; - allowUpdatingPreset = !pChainPreset->isReadOnly(); + presetIsReadOnly = pChainPreset->isReadOnly(); } m_pMenu->addAction(title, this, [this, pChainPreset]() { m_pChain->loadChainPreset(pChainPreset); @@ -62,7 +62,7 @@ void WEffectChainPresetButton::populateMenu() { // This prevents showing the Update button for the empty '---' preset, in case // WEffectChainPresetButton and effect slot controls of a QuickEffect chain are // exposed in a custom skin. - if (allowUpdatingPreset) { + if (!presetIsReadOnly) { m_pMenu->addAction(tr("Update Preset"), this, [this]() { m_pChainPresetManager->updatePreset(m_pChain); }); From c36575b1669dbaa658e544ee76ac5efb215213cb Mon Sep 17 00:00:00 2001 From: ronso0 Date: Fri, 9 Dec 2022 01:58:29 +0100 Subject: [PATCH 12/14] EffectChainPresetManager: QStringLiteral instead of QLatin1 --- src/effects/presets/effectchainpresetmanager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index b3c2a1622a4..9ad0afcbdd4 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -126,12 +126,12 @@ void EffectChainPresetManager::importPreset() { // Don't allow '---' because that's the name of the internal empty preset if (pPreset->name() == kNoEffectString) { pPreset->setName(pPreset->name() + - QLatin1String(" (") + tr("imported") + QLatin1String(")")); + QStringLiteral(" (") + tr("imported") + QStringLiteral(")")); } while (m_effectChainPresets.contains(pPreset->name())) { pPreset->setName(pPreset->name() + - QLatin1String(" (") + tr("duplicate") + QLatin1String(")")); + QStringLiteral(" (") + tr("duplicate") + QStringLiteral(")")); } // An imported chain preset might contain an LV2 plugin that the user does not From 4fa6e9a50b84c2102520a68f8714abb66bb1b780 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Fri, 9 Dec 2022 02:02:43 +0100 Subject: [PATCH 13/14] EffectChainPreset: init m_readOnly in constructor --- src/effects/presets/effectchainpreset.cpp | 3 ++- src/effects/presets/effectchainpreset.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index a344a3cff6c..0d3dda3250d 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -7,7 +7,8 @@ EffectChainPreset::EffectChainPreset() : m_name(kNoEffectString), m_mixMode(EffectChainMixMode::DrySlashWet), - m_dSuper(0.0) { + m_dSuper(0.0), + m_readOnly(false) { } EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index 587cbef90bc..890e380923c 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -56,5 +56,5 @@ class EffectChainPreset { EffectChainMixMode::Type m_mixMode; double m_dSuper; QList m_effectPresets; - bool m_readOnly = false; + bool m_readOnly; }; From 1b7b29fea4691bbc33d4858cfef576d56b1167ef Mon Sep 17 00:00:00 2001 From: ronso0 Date: Fri, 9 Dec 2022 02:07:48 +0100 Subject: [PATCH 14/14] EffectChainPresetManager: prepend empty 'clear' item in setQuickEffectPresetOrder --- src/effects/presets/effectchainpresetmanager.cpp | 14 +++++--------- src/effects/presets/effectchainpresetmanager.h | 1 - 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 9ad0afcbdd4..6f132bbeef3 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -389,24 +389,20 @@ void EffectChainPresetManager::setQuickEffectPresetOrder( m_quickEffectChainPresetsSorted.append( m_effectChainPresets.value(chainPresetName)); } - prependEmptyPreset(m_quickEffectChainPresetsSorted); - emit quickEffectChainPresetListUpdated(); -} - -void EffectChainPresetManager::prependEmptyPreset( - QList& pPresetList) const { // Ensure empty '---' preset is the first list item const auto& pEmptyPreset = m_effectChainPresets.value(kNoEffectString); VERIFY_OR_DEBUG_ASSERT(pEmptyPreset) { return; } - int index = pPresetList.indexOf(pEmptyPreset); + int index = m_quickEffectChainPresetsSorted.indexOf(pEmptyPreset); if (index == -1) { // not in list, re-add it - pPresetList.prepend(pEmptyPreset); + m_quickEffectChainPresetsSorted.prepend(pEmptyPreset); } else if (index != 0) { // not first item, move to top - pPresetList.move(index, 0); + m_quickEffectChainPresetsSorted.move(index, 0); } + + emit quickEffectChainPresetListUpdated(); } void EffectChainPresetManager::savePresetAndReload(EffectChainPointer pChainSlot) { diff --git a/src/effects/presets/effectchainpresetmanager.h b/src/effects/presets/effectchainpresetmanager.h index c23c38c59d5..e01abbd2b51 100644 --- a/src/effects/presets/effectchainpresetmanager.h +++ b/src/effects/presets/effectchainpresetmanager.h @@ -60,7 +60,6 @@ class EffectChainPresetManager : public QObject { void setPresetOrder(const QStringList& chainPresetList); void setQuickEffectPresetOrder(const QStringList& chainPresetList); - void prependEmptyPreset(QList& pPresetList) const; EffectChainPresetPointer getPreset(const QString& name) const { return m_effectChainPresets.value(name);