Skip to content

Commit

Permalink
Refactored the refresh to only use the new mode of refreshing, removi…
Browse files Browse the repository at this point in the history
…ng the need for the secondary index structure. This is slower, but safer.
  • Loading branch information
christofmuc committed Oct 21, 2024
1 parent 1fb022d commit 8d9fbe6
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 48 deletions.
97 changes: 52 additions & 45 deletions The-Orm/PatchListTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ PatchListTree::PatchListTree(midikraft::PatchDatabase& db, std::vector<midikraft
std::vector<TreeViewItem*> result;
auto userLists = db_.allPatchLists();
userLists = sortLists<midikraft::ListInfo>(userLists, [](const midikraft::ListInfo& info) { return info.name; });
userLists_.clear();
for (auto const& list : userLists) {
result.push_back(newTreeViewItemForPatchList(list));
}
Expand Down Expand Up @@ -236,19 +235,6 @@ void PatchListTree::refreshAllUserLists(std::function<void()> onFinished)
});
}

void PatchListTree::refreshUserList(std::string list_id, std::function<void()> 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<void()> onFinished)
{
MessageManager::callAsync([this, onFinished]() {
Expand All @@ -257,39 +243,62 @@ void PatchListTree::refreshAllImports(std::function<void()> onFinished)
});
}

void PatchListTree::refreshParentOfListId(std::string const& list_id, std::function<void()> onFinished) {
TreeViewNode* PatchListTree::findNodeForListID(std::string const& list_id) {
// Walk the tree and find the node for the given list id
std::deque<juce::TreeViewItem*> 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<TreeViewNode*>(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<void()> onFinished) {
MessageManager::callAsync([this, list_id, onFinished] {
// Walk the tree and find the node for the given list id
std::deque<juce::TreeViewItem*> 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<TreeViewNode*>(node);
if (treeviewnode) {
if (treeviewnode->id().toStdString() == list_id) {
// Found, fresh the parent
auto parent = treeviewnode->getParentItem();
auto parentitem = dynamic_cast<TreeViewNode*>(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<void()> 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<TreeViewNode*>(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);
};
});
}

Expand Down Expand Up @@ -560,7 +569,6 @@ TreeViewNode* PatchListTree::newTreeViewItemForImports(std::shared_ptr<midikraft

TreeViewNode* PatchListTree::newTreeViewItemForUserBank(std::shared_ptr<midikraft::Synth> 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);
Expand Down Expand Up @@ -604,7 +612,6 @@ TreeViewNode* PatchListTree::newTreeViewItemForUserBank(std::shared_ptr<midikraf

TreeViewNode* PatchListTree::newTreeViewItemForPatchList(midikraft::ListInfo list) {
auto node = new TreeViewNode(list.name, list.id);
userLists_[list.id] = node;
node->onGenerateChildren = [this, list]() {
auto patchList = db_.getPatchList(list, synths_);
std::vector<TreeViewItem*> result;
Expand Down
4 changes: 2 additions & 2 deletions The-Orm/PatchListTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ class PatchListTree : public Component, private ChangeListener {
virtual void resized() override;

void refreshAllUserLists(std::function<void()> onFinished);
void refreshUserList(std::string list_id, std::function<void()> onFinished);
void refreshAllImports(std::function<void()> onFinished);
void refreshChildrenOfListId(std::string const& list_id, std::function<void()> onFinished);
void refreshParentOfListId(std::string const& list_id, std::function<void()> onFinished);

void selectAllIfNothingIsSelected();
Expand All @@ -55,6 +55,7 @@ class PatchListTree : public Component, private ChangeListener {
std::string getSelectedSynth() const;
bool isUserListSelected() const;
std::list<std::string> pathOfSelectedItem() const;
TreeViewNode* findNodeForListID(std::string const& list_id);

TreeViewNode* newTreeViewItemForPatch(midikraft::ListInfo list, midikraft::PatchHolder patchHolder, int index);
TreeViewNode* newTreeViewItemForSynthBanks(std::shared_ptr<midikraft::SimpleDiscoverableDevice> synth);
Expand All @@ -73,6 +74,5 @@ class PatchListTree : public Component, private ChangeListener {
std::unique_ptr<TreeView> treeView_;
TreeViewNode* allPatchesItem_;
TreeViewNode* userListsItem_;
std::map<std::string, TreeViewNode*> userLists_;
};

2 changes: 1 addition & 1 deletion The-Orm/PatchView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down

0 comments on commit 8d9fbe6

Please sign in to comment.