From fc0a6dc29eb486db8d4ff98f5786ca93fbfcb472 Mon Sep 17 00:00:00 2001 From: Christof Date: Thu, 15 Aug 2024 16:21:34 +0200 Subject: [PATCH] [auto fill banks] Allow building also auto filling synth banks from the current filtered list --- The-Orm/PatchListTree.cpp | 26 ++++++++++++++++++-------- The-Orm/PatchView.cpp | 33 ++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/The-Orm/PatchListTree.cpp b/The-Orm/PatchListTree.cpp index 2f3e365f..06070f4b 100644 --- a/The-Orm/PatchListTree.cpp +++ b/The-Orm/PatchListTree.cpp @@ -125,16 +125,17 @@ PatchListTree::PatchListTree(midikraft::PatchDatabase& db, std::vector list, CreateListDialog::TFillParameters fillParameters) { if (list) { - spdlog::info("Create new user list named {}", list->name()); if (onPatchListFill) { onPatchListFill(list, fillParameters, [this, list]() { db_.putPatchList(list); regenerateUserLists([]() {}); + spdlog::info("Create new user list named {}", list->name()); }); } else { db_.putPatchList(list); regenerateUserLists([]() {}); + spdlog::info("Create new user list named {}", list->name()); } } }, nullptr); @@ -407,15 +408,24 @@ TreeViewNode* PatchListTree::newTreeViewItemForStoredBanks(std::shared_ptr list, CreateListDialog::TFillParameters fillParameters) { if (list) { - if (fillParameters.fillMode != CreateListDialog::None) { - + if (onPatchListFill) { + onPatchListFill(list, fillParameters, [this, synthBanksNode, list]() { + db_.putPatchList(list); + spdlog::info("Created new user bank named {}", list->name()); + MessageManager::callAsync([this, synthBanksNode]() { + synthBanksNode->regenerate(); + regenerateUserLists([]() {}); + }); + }); } - db_.putPatchList(list); - spdlog::info("Create new user bank named {}", list->name()); - MessageManager::callAsync([this, synthBanksNode]() { - synthBanksNode->regenerate(); - regenerateUserLists([]() {}); + else { + db_.putPatchList(list); + spdlog::info("Created new user bank named {}", list->name()); + MessageManager::callAsync([this, synthBanksNode]() { + synthBanksNode->regenerate(); + regenerateUserLists([]() {}); }); + } } }, [synthBanksNode](std::shared_ptr result) { ignoreUnused(result); diff --git a/The-Orm/PatchView.cpp b/The-Orm/PatchView.cpp index c81caca6..cd888eca 100644 --- a/The-Orm/PatchView.cpp +++ b/The-Orm/PatchView.cpp @@ -1078,17 +1078,28 @@ void PatchView::fillList(std::shared_ptr list, CreateListD if (fillParameters.fillMode == CreateListDialog::TListFillMode::None) { finishedCallback(); } - else if (fillParameters.fillMode == CreateListDialog::TListFillMode::Top) { - loadPage(0, fillParameters.number, currentFilter(), [list, finishedCallback](std::vector patches) { - list->setPatches(patches); - finishedCallback(); - }); - } - else if (fillParameters.fillMode == CreateListDialog::TListFillMode::Random) { - loadPage(0, -1, currentFilter(), [list, fillParameters, finishedCallback](std::vector patches) { - list->setPatches(getRandomSubset(patches, fillParameters.number)); - finishedCallback(); - }); + else { + auto filter = currentFilter(); + auto synthBank = std::dynamic_pointer_cast(list); + int patchesDesired = fillParameters.number; + if (synthBank) { + // This is a synth bank, restrict the filter to deliver only patches for the synth that the bank is for + filter.synths.clear(); + filter.synths[synthBank->synth()->getName()] = synthBank->synth(); + patchesDesired = synthBank->patchCapacity(); + } + if (fillParameters.fillMode == CreateListDialog::TListFillMode::Top) { + loadPage(0, patchesDesired, filter, [list, finishedCallback](std::vector patches) { + list->setPatches(patches); + finishedCallback(); + }); + } + else if (fillParameters.fillMode == CreateListDialog::TListFillMode::Random) { + loadPage(0, -1, filter, [list, patchesDesired, finishedCallback](std::vector patches) { + list->setPatches(getRandomSubset(patches, patchesDesired)); + finishedCallback(); + }); + } } }