diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index 0d3dda3250dd..0df63a6342f1 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -50,7 +50,8 @@ EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { EffectChainPreset::EffectChainPreset(const EffectChain* chain) : m_name(chain->presetName()), m_mixMode(chain->mixMode()), - m_dSuper(chain->getSuperParameter()) { + m_dSuper(chain->getSuperParameter()), + m_readOnly(false) { for (const auto& pEffectSlot : chain->getEffectSlots()) { m_effectPresets.append(EffectPresetPointer(new EffectPreset(pEffectSlot))); } @@ -59,14 +60,16 @@ EffectChainPreset::EffectChainPreset(const EffectChain* chain) EffectChainPreset::EffectChainPreset(EffectManifestPointer pManifest) : m_name(pManifest->displayName()), m_mixMode(EffectChainMixMode::DrySlashWet), - m_dSuper(pManifest->metaknobDefault()) { + m_dSuper(pManifest->metaknobDefault()), + m_readOnly(false) { m_effectPresets.append(EffectPresetPointer(new EffectPreset(pManifest))); } EffectChainPreset::EffectChainPreset(EffectPresetPointer pEffectPreset) : m_name(pEffectPreset->id()), m_mixMode(EffectChainMixMode::DrySlashWet), - m_dSuper(pEffectPreset->metaParameter()) { + m_dSuper(pEffectPreset->metaParameter()), + m_readOnly(false) { m_effectPresets.append(pEffectPreset); } diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 3a6ea9265152..a9965ff8e560 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -104,13 +104,14 @@ EffectChainPresetPointer EffectChainPresetManager::quickEffectPresetAtIndex( return m_quickEffectChainPresetsSorted.at(index); } -void EffectChainPresetManager::importPreset() { +bool EffectChainPresetManager::importPreset() { QStringList fileNames = QFileDialog::getOpenFileNames(nullptr, tr("Import effect chain preset"), QDir::homePath(), tr("Mixxx Effect Chain Presets") + QStringLiteral(" (*") + kXmlFileExtension + QStringLiteral(")")); + bool presetsImported = false; QString importFailedText = tr("Error importing effect chain preset"); QString importFailedInformativeText = tr("Error importing effect chain preset \"%1\""); for (int i = 0; i < fileNames.size(); ++i) { @@ -186,11 +187,13 @@ void EffectChainPresetManager::importPreset() { m_quickEffectChainPresetsSorted.append(pPreset); emit effectChainPresetListUpdated(); emit quickEffectChainPresetListUpdated(); + presetsImported = true; } else { QMessageBox::critical( nullptr, importFailedText, importFailedInformativeText.arg(filePath)); } } + return presetsImported; } void EffectChainPresetManager::exportPreset(const QString& chainPresetName) { @@ -242,9 +245,9 @@ void EffectChainPresetManager::exportPreset(const QString& chainPresetName) { file.close(); } -void EffectChainPresetManager::renamePreset(const QString& oldName) { +bool EffectChainPresetManager::renamePreset(const QString& oldName) { VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(oldName)) { - return; + return false; } if (m_effectChainPresets.value(oldName)->isReadOnly()) { QMessageBox msgBox; @@ -254,7 +257,7 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { .arg(oldName)); msgBox.setIcon(QMessageBox::Warning); msgBox.exec(); - return; + return false; } QString newName; @@ -272,7 +275,7 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { &okay) .trimmed(); if (!okay) { - return; + return false; } if (newName.isEmpty()) { @@ -299,7 +302,7 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { m_effectChainPresets.take(newName); pPreset->setName(oldName); m_effectChainPresets.insert(oldName, pPreset); - return; + return false; } QString directoryPath = m_pConfig->getSettingsPath() + kEffectChainPresetDirectory; @@ -328,6 +331,7 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { m_quickEffectChainPresetsSorted.replace(index, pPreset); emit quickEffectChainPresetListUpdated(); } + return true; } bool EffectChainPresetManager::deletePreset(const QString& chainPresetName) { diff --git a/src/effects/presets/effectchainpresetmanager.h b/src/effects/presets/effectchainpresetmanager.h index e01abbd2b516..8bd326b96616 100644 --- a/src/effects/presets/effectchainpresetmanager.h +++ b/src/effects/presets/effectchainpresetmanager.h @@ -51,9 +51,9 @@ class EffectChainPresetManager : public QObject { int quickEffectPresetIndex(EffectChainPresetPointer pChainPreset) const; EffectChainPresetPointer quickEffectPresetAtIndex(int index) const; - void importPreset(); + bool importPreset(); void exportPreset(const QString& chainPresetName); - void renamePreset(const QString& oldName); + bool renamePreset(const QString& oldName); bool deletePreset(const QString& chainPresetName); void resetToDefaults(); diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index fbf2cc72d6bd..d66a30a74a96 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -86,9 +86,9 @@ void DlgPrefEffects::setupChainListView(QListView* pListView) { //TODO: prevent drops of duplicate items pListView->setDefaultDropAction(Qt::CopyAction); connect(pListView->selectionModel(), - &QItemSelectionModel::currentRowChanged, + &QItemSelectionModel::selectionChanged, this, - &DlgPrefEffects::slotChainPresetSelected); + &DlgPrefEffects::slotChainPresetSelectionChanged); pListView->installEventFilter(this); } @@ -205,19 +205,20 @@ void DlgPrefEffects::effectsTableItemSelected(const QModelIndex& selected) { effectType->setText(EffectsBackend::translatedBackendName(pManifest->backendType())); } -void DlgPrefEffects::slotChainPresetSelected(const QModelIndex& selected) { +void DlgPrefEffects::slotChainPresetSelectionChanged(const QItemSelection& selected) { VERIFY_OR_DEBUG_ASSERT(m_pFocusedChainList) { return; } // Clear the info box and return if the index is invalid, e.g. after clearCurrentIndex() // in eventFilter() - if (!selected.isValid() || - m_pFocusedChainList->selectionModel()->selectedRows(0).count() > 1) { + auto* pSelModel = m_pFocusedChainList->selectionModel(); + auto selIndices = pSelModel->selectedIndexes(); + if (selIndices.count() != 1) { clearChainInfoDisableButtons(); return; } - QString chainPresetName = selected.model()->data(selected).toString(); + QString chainPresetName = selIndices.first().data().toString(); EffectChainPresetPointer pChainPreset = m_pChainPresetManager->getPreset(chainPresetName); if (pChainPreset == nullptr || pChainPreset->isEmpty()) { return; @@ -246,8 +247,9 @@ void DlgPrefEffects::slotChainPresetSelected(const QModelIndex& selected) { } void DlgPrefEffects::slotImportPreset() { - m_pChainPresetManager->importPreset(); - loadChainPresetLists(); + if (m_pChainPresetManager->importPreset()) { + loadChainPresetLists(); + } } void DlgPrefEffects::slotExportPreset() { @@ -266,12 +268,17 @@ void DlgPrefEffects::slotRenamePreset() { return; } saveChainPresetLists(); + bool presetsRenamed = false; const auto& selectedIndices = m_pFocusedChainList->selectionModel()->selectedIndexes(); for (const auto& index : selectedIndices) { const QString& selectedPresetName = m_pFocusedChainList->model()->data(index).toString(); - m_pChainPresetManager->renamePreset(selectedPresetName); + if (m_pChainPresetManager->renamePreset(selectedPresetName)) { + presetsRenamed = true; + } + } + if (presetsRenamed) { + loadChainPresetLists(); } - loadChainPresetLists(); } void DlgPrefEffects::slotDeletePreset() { @@ -293,6 +300,7 @@ void DlgPrefEffects::slotDeletePreset() { pUnfocusedChainList->model()); auto unfocusedChainStringList = pUnfocusedModel->stringList(); + bool updateAndSavePresetLists = false; const auto& selectedIndices = m_pFocusedChainList->selectionModel()->selectedIndexes(); for (const auto& index : selectedIndices) { QString selectedPresetName = @@ -300,14 +308,18 @@ void DlgPrefEffects::slotDeletePreset() { if (!unfocusedChainStringList.contains(selectedPresetName)) { if (m_pChainPresetManager->deletePreset(selectedPresetName)) { focusedChainStringList.removeAll(selectedPresetName); + updateAndSavePresetLists = true; } } else { focusedChainStringList.removeAll(selectedPresetName); + updateAndSavePresetLists = true; } } - pFocusedModel->setStringList(focusedChainStringList); - saveChainPresetLists(); + if (updateAndSavePresetLists) { + pFocusedModel->setStringList(focusedChainStringList); + saveChainPresetLists(); + } } bool DlgPrefEffects::eventFilter(QObject* object, QEvent* event) { @@ -343,7 +355,6 @@ bool DlgPrefEffects::eventFilter(QObject* object, QEvent* event) { currIndex, QItemSelectionModel::ClearAndSelect); } - return true; } else if (pEffectList) { m_pFocusedEffectList = pEffectList; unfocusedEffectList()->selectionModel()->clearSelection(); @@ -355,7 +366,6 @@ bool DlgPrefEffects::eventFilter(QObject* object, QEvent* event) { pEffectList->selectionModel()->clearCurrentIndex(); pEffectList->selectRow(currIndex.row()); } - return true; } } return DlgPreferencePage::eventFilter(object, event); diff --git a/src/preferences/dialog/dlgprefeffects.h b/src/preferences/dialog/dlgprefeffects.h index 64b4c62f02f1..d21824d3c132 100644 --- a/src/preferences/dialog/dlgprefeffects.h +++ b/src/preferences/dialog/dlgprefeffects.h @@ -24,7 +24,7 @@ class DlgPrefEffects : public DlgPreferencePage, public Ui::DlgPrefEffectsDlg { private slots: void effectsTableItemSelected(const QModelIndex& selected); - void slotChainPresetSelected(const QModelIndex& selected); + void slotChainPresetSelectionChanged(const QItemSelection& selected); void slotImportPreset(); void slotExportPreset(); void slotRenamePreset(); diff --git a/src/widget/weffectchainpresetbutton.cpp b/src/widget/weffectchainpresetbutton.cpp index 4026ffc181f7..3941259464ab 100644 --- a/src/widget/weffectchainpresetbutton.cpp +++ b/src/widget/weffectchainpresetbutton.cpp @@ -93,6 +93,11 @@ void WEffectChainPresetButton::populateMenu() { m_pChainPresetManager->updatePreset(m_pChain); }); } + if (!presetIsReadOnly && !m_pChain->presetName().isEmpty()) { + m_pMenu->addAction(tr("Rename Preset"), this, [this]() { + m_pChainPresetManager->renamePreset(m_pChain->presetName()); + }); + } m_pMenu->addAction(tr("Save As New Preset..."), this, [this]() { m_pChainPresetManager->savePresetAndReload(m_pChain); });