Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support updating of effect presets #4686

Merged
merged 9 commits into from Feb 28, 2022
31 changes: 27 additions & 4 deletions src/effects/presets/effectchainpresetmanager.cpp
Expand Up @@ -6,6 +6,7 @@
#include <QMessageBox>

#include "effects/backends/builtin/filtereffect.h"
#include "effects/effectchain.h"
#include "effects/effectsmanager.h"
#include "effects/presets/effectxmlelements.h"
#include "util/filename.h"
Expand Down Expand Up @@ -286,14 +287,12 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) {

int index = m_effectChainPresetsSorted.indexOf(pPreset);
if (index != -1) {
m_effectChainPresetsSorted.removeAt(index);
m_effectChainPresetsSorted.insert(index, pPreset);
m_effectChainPresetsSorted.replace(index, pPreset);
emit effectChainPresetListUpdated();
}
index = m_quickEffectChainPresetsSorted.indexOf(pPreset);
if (index != -1) {
m_quickEffectChainPresetsSorted.removeAt(index);
m_quickEffectChainPresetsSorted.insert(index, pPreset);
m_quickEffectChainPresetsSorted.replace(index, pPreset);
emit quickEffectChainPresetListUpdated();
}
}
Expand Down Expand Up @@ -407,6 +406,30 @@ void EffectChainPresetManager::savePreset(EffectChainPresetPointer pPreset) {
savePresetXml(pPreset);
}

void EffectChainPresetManager::updatePreset(EffectChainPointer pChainSlot) {
const QString name = pChainSlot->presetName();
if (name.isEmpty()) {
return;
}

auto it = m_effectChainPresets.find(name);
VERIFY_OR_DEBUG_ASSERT(it != m_effectChainPresets.end()) {
return;
}

const int index = m_effectChainPresetsSorted.indexOf(*it);
VERIFY_OR_DEBUG_ASSERT(index != -1) {
return;
}
// Effect Chain Presets don't have a copy constructor, so we have to create a new one and
// replace the existing entries in the two lists. Calling reset or swap on the iterator
// also doesn't work.
auto pPreset = EffectChainPresetPointer::create(pChainSlot.data());
m_effectChainPresetsSorted.replace(index, pPreset);
m_effectChainPresets.insert(name, pPreset);
savePresetXml(pPreset);
}

void EffectChainPresetManager::importUserPresets() {
QString savedPresetsPath(
m_pConfig->getSettingsPath() + kEffectChainPresetDirectory);
Expand Down
1 change: 1 addition & 0 deletions src/effects/presets/effectchainpresetmanager.h
Expand Up @@ -67,6 +67,7 @@ class EffectChainPresetManager : public QObject {

void savePreset(EffectChainPresetPointer pPreset);
void savePreset(EffectChainPointer pChainSlot);
void updatePreset(EffectChainPointer pChainSlot);

EffectsXmlData readEffectsXml(const QDomDocument& doc, const QStringList& deckStrings);
void saveEffectsXml(QDomDocument* pDoc, const EffectsXmlData& data);
Expand Down
19 changes: 17 additions & 2 deletions src/widget/weffectchainpresetbutton.cpp
Expand Up @@ -25,6 +25,10 @@ void WEffectChainPresetButton::setup(const QDomNode& node, const SkinContext& co
m_iChainNumber = EffectWidgetUtils::getEffectUnitNumberFromNode(node, context);
m_pChain = EffectWidgetUtils::getEffectChainFromNode(
node, context, m_pEffectsManager);
connect(m_pChain.get(),
&EffectChain::chainPresetChanged,
this,
&WEffectChainPresetButton::populateMenu);
for (const auto& pEffectSlot : m_pChain->getEffectSlots()) {
connect(pEffectSlot.data(),
&EffectSlot::effectChanged,
Expand All @@ -42,13 +46,24 @@ void WEffectChainPresetButton::populateMenu() {
m_pMenu->clear();

// Chain preset items
bool chainIsPreset = false;
for (const auto& pChainPreset : m_pChainPresetManager->getPresetsSorted()) {
m_pMenu->addAction(pChainPreset->name(), this, [this, pChainPreset]() {
QString title = pChainPreset->name();
if (title == m_pChain->presetName()) {
title = "\u2713 " + title;
chainIsPreset = true;
}
m_pMenu->addAction(title, this, [this, pChainPreset]() {
m_pChain->loadChainPreset(pChainPreset);
});
}
m_pMenu->addSeparator();
m_pMenu->addAction(tr("Save as new preset"), this, [this]() {
if (chainIsPreset) {
m_pMenu->addAction(tr("Update Preset"), this, [this]() {
m_pChainPresetManager->updatePreset(m_pChain);
});
}
m_pMenu->addAction(tr("Save As New Preset..."), this, [this]() {
m_pChainPresetManager->savePreset(m_pChain);
});

Expand Down