diff --git a/The-Orm/PatchListTree.cpp b/The-Orm/PatchListTree.cpp index 3cba8993..5da6a973 100644 --- a/The-Orm/PatchListTree.cpp +++ b/The-Orm/PatchListTree.cpp @@ -116,7 +116,6 @@ PatchListTree::PatchListTree(midikraft::PatchDatabase& db, std::vector result; auto userLists = db_.allPatchLists(); userLists = sortLists(userLists, [](const midikraft::ListInfo& info) { return info.name; }); - userLists_.clear(); for (auto const& list : userLists) { result.push_back(newTreeViewItemForPatchList(list)); } @@ -236,19 +235,6 @@ void PatchListTree::refreshAllUserLists(std::function onFinished) }); } -void PatchListTree::refreshUserList(std::string list_id, std::function onFinished) -{ - if (userLists_.find(list_id) != userLists_.end()) { - MessageManager::callAsync([node = userLists_[list_id], onFinished]() { - node->regenerate(); - onFinished(); - }); - } - else { - jassertfalse; - } -} - void PatchListTree::refreshAllImports(std::function onFinished) { MessageManager::callAsync([this, onFinished]() { @@ -257,39 +243,62 @@ void PatchListTree::refreshAllImports(std::function onFinished) }); } -void PatchListTree::refreshParentOfListId(std::string const& list_id, std::function onFinished) { +TreeViewNode* PatchListTree::findNodeForListID(std::string const& list_id) { + // Walk the tree and find the node for the given list id + std::deque items; + items.push_back(treeView_->getRootItem()); + while (!items.empty()) { + TreeViewItem* node = items.front(); + items.pop_front(); + // Check if this is a node for the list we're looking for + auto treeviewnode = dynamic_cast(node); + if (treeviewnode && (treeviewnode->id().toStdString() == list_id)) { + return treeviewnode; + } + + // Inspect the children + for (int i = 0; i < node->getNumSubItems(); i++) { + items.push_back(node->getSubItem(i)); + } + } + return nullptr; +} + +void PatchListTree::refreshChildrenOfListId(std::string const& list_id, std::function onFinished) { MessageManager::callAsync([this, list_id, onFinished] { - // Walk the tree and find the node for the given list id - std::deque items; - items.push_back(treeView_->getRootItem()); - while (!items.empty()) { - TreeViewItem* node = items.front(); - items.pop_front(); - // Check if this is a node for the list we're looking for - auto treeviewnode = dynamic_cast(node); - if (treeviewnode) { - if (treeviewnode->id().toStdString() == list_id) { - // Found, fresh the parent - auto parent = treeviewnode->getParentItem(); - auto parentitem = dynamic_cast(parent); - if (parentitem) { - parentitem->regenerate(); - onFinished(); - return; - } - else { - spdlog::error("Program error: Parent has no regenerate capability, failed to refresh tree view"); - return; - } - } - } + auto node = findNodeForListID(list_id); + if (node != nullptr) { + node->regenerate(); + onFinished(); + } + else + { + spdlog::error("Program error: Did not find node for list ID {}, failed to refresh tree view", list_id); + }; + }); +} - // Inspect the children - for (int i = 0; i < node->getNumSubItems(); i++) { - items.push_back(node->getSubItem(i)); - } +void PatchListTree::refreshParentOfListId(std::string const& list_id, std::function onFinished) { + MessageManager::callAsync([this, list_id, onFinished] { + auto node = findNodeForListID(list_id); + if (node != nullptr) { + // Found, fresh the parent + auto parent = node->getParentItem(); + auto parentitem = dynamic_cast(parent); + if (parentitem) { + parentitem->regenerate(); + onFinished(); + return; } + else { + spdlog::error("Program error: Parent has no regenerate capability, failed to refresh tree view"); + return; + } + } + else + { spdlog::error("Program error: Did not find node for list ID {}, failed to refresh tree view", list_id); + }; }); } @@ -560,7 +569,6 @@ TreeViewNode* PatchListTree::newTreeViewItemForImports(std::shared_ptr synth, TreeViewNode *parent, midikraft::ListInfo list) { auto node = new TreeViewNode(list.name, list.id); - userLists_[list.id] = node; node->onSelected = [this, list, synth](String clicked) { juce::ignoreUnused(clicked); UIModel::instance()->multiMode_.setMultiSynthMode(false); @@ -604,7 +612,6 @@ TreeViewNode* PatchListTree::newTreeViewItemForUserBank(std::shared_ptronGenerateChildren = [this, list]() { auto patchList = db_.getPatchList(list, synths_); std::vector result; diff --git a/The-Orm/PatchListTree.h b/The-Orm/PatchListTree.h index 46b782da..3b99e0db 100644 --- a/The-Orm/PatchListTree.h +++ b/The-Orm/PatchListTree.h @@ -38,8 +38,8 @@ class PatchListTree : public Component, private ChangeListener { virtual void resized() override; void refreshAllUserLists(std::function onFinished); - void refreshUserList(std::string list_id, std::function onFinished); void refreshAllImports(std::function onFinished); + void refreshChildrenOfListId(std::string const& list_id, std::function onFinished); void refreshParentOfListId(std::string const& list_id, std::function onFinished); void selectAllIfNothingIsSelected(); @@ -55,6 +55,7 @@ class PatchListTree : public Component, private ChangeListener { std::string getSelectedSynth() const; bool isUserListSelected() const; std::list pathOfSelectedItem() const; + TreeViewNode* findNodeForListID(std::string const& list_id); TreeViewNode* newTreeViewItemForPatch(midikraft::ListInfo list, midikraft::PatchHolder patchHolder, int index); TreeViewNode* newTreeViewItemForSynthBanks(std::shared_ptr synth); @@ -73,6 +74,5 @@ class PatchListTree : public Component, private ChangeListener { std::unique_ptr treeView_; TreeViewNode* allPatchesItem_; TreeViewNode* userListsItem_; - std::map userLists_; }; diff --git a/The-Orm/PatchView.cpp b/The-Orm/PatchView.cpp index dc2d08ef..685d614f 100644 --- a/The-Orm/PatchView.cpp +++ b/The-Orm/PatchView.cpp @@ -502,7 +502,7 @@ void PatchView::deleteSomething(nlohmann::json const& infos) std::string list_name = infos["list_name"]; database_.removePatchFromList(list_id, infos["synth"], infos["md5"], infos["order_num"]); spdlog::info("Removed patch {} from list {}", patch_name, list_name); - patchListTree_.refreshUserList(list_id, []() {}); + patchListTree_.refreshChildrenOfListId(list_id, []() {}); if (listFilterID_ == list_id) { retrieveFirstPageFromDatabase(); }