From 880568cc604786d4cadfccbd70ca61f6efe093cb Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 17 Mar 2023 11:32:08 +0100 Subject: [PATCH] impr: Better find view result filter speeds --- .../include/content/views/view_find.hpp | 2 +- .../builtin/source/content/views/view_find.cpp | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/plugins/builtin/include/content/views/view_find.hpp b/plugins/builtin/include/content/views/view_find.hpp index e2ca92eae..f2fb4f033 100644 --- a/plugins/builtin/include/content/views/view_find.hpp +++ b/plugins/builtin/include/content/views/view_find.hpp @@ -96,7 +96,7 @@ namespace hex::plugin::builtin { std::map m_occurrenceTree; std::map m_currFilter; - TaskHolder m_searchTask; + TaskHolder m_searchTask, m_filterTask; bool m_settingsValid = false; private: diff --git a/plugins/builtin/source/content/views/view_find.cpp b/plugins/builtin/source/content/views/view_find.cpp index af29bdb28..1151ac808 100644 --- a/plugins/builtin/source/content/views/view_find.cpp +++ b/plugins/builtin/source/content/views/view_find.cpp @@ -786,12 +786,22 @@ namespace hex::plugin::builtin { auto &currOccurrences = this->m_sortedOccurrences[provider]; ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x); + auto prevFilterLength = this->m_currFilter[provider].length(); if (ImGui::InputTextWithHint("##filter", "hex.builtin.common.filter"_lang, this->m_currFilter[provider])) { - this->m_sortedOccurrences[provider] = this->m_foundOccurrences[provider]; + if (prevFilterLength > this->m_currFilter[provider].length()) + this->m_sortedOccurrences[provider] = this->m_foundOccurrences[provider]; - currOccurrences.erase(std::remove_if(currOccurrences.begin(), currOccurrences.end(), [this, provider](const auto ®ion) { - return !hex::containsIgnoreCase(this->decodeValue(provider, region), this->m_currFilter[provider]); - }), currOccurrences.end()); + if (this->m_filterTask.isRunning()) + this->m_filterTask.interrupt(); + + if (!this->m_currFilter[provider].empty()) { + this->m_filterTask = TaskManager::createTask("Filtering", 0, [this, provider, &currOccurrences](Task &task) { + currOccurrences.erase(std::remove_if(currOccurrences.begin(), currOccurrences.end(), [this, provider, &task](const auto ®ion) { + task.update(); + return !hex::containsIgnoreCase(this->decodeValue(provider, region), this->m_currFilter[provider]); + }), currOccurrences.end()); + }); + } } ImGui::PopItemWidth();