patterns: Drastically improved time it takes to find favorites
This commit is contained in:
parent
b446d7fd4a
commit
ab12503f62
2
lib/external/pattern_language
vendored
2
lib/external/pattern_language
vendored
@ -1 +1 @@
|
||||
Subproject commit 3dff4201d41efc7e0ebfdebc83d355bd6a5159c5
|
||||
Subproject commit 2578faba45e5361bf369297f2be22640e42bc07c
|
@ -89,6 +89,8 @@ namespace hex::ui {
|
||||
void traversePatternTree(pl::ptrn::Pattern &pattern, std::vector<std::string> &patternPath, const std::function<void(pl::ptrn::Pattern&)> &callback);
|
||||
[[nodiscard]] std::string getDisplayName(const pl::ptrn::Pattern& pattern) const;
|
||||
|
||||
[[nodiscard]] std::vector<std::string> getPatternPath(const pl::ptrn::Pattern *pattern) const;
|
||||
|
||||
struct Filter {
|
||||
std::vector<std::string> path;
|
||||
std::optional<pl::core::Token::Literal> value;
|
||||
|
@ -396,6 +396,19 @@ namespace hex::ui {
|
||||
return pattern.getDisplayName();
|
||||
}
|
||||
|
||||
[[nodiscard]] std::vector<std::string> PatternDrawer::getPatternPath(const pl::ptrn::Pattern *pattern) const {
|
||||
std::vector<std::string> result;
|
||||
|
||||
while (pattern != nullptr) {
|
||||
result.emplace_back(pattern->getVariableName());
|
||||
pattern = pattern->getParent();
|
||||
}
|
||||
|
||||
std::reverse(result.begin(), result.end());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool PatternDrawer::createTreeNode(const pl::ptrn::Pattern& pattern, bool leaf) {
|
||||
ImGui::TableNextRow();
|
||||
|
||||
@ -1367,33 +1380,33 @@ namespace hex::ui {
|
||||
m_filtersUpdated = true;
|
||||
|
||||
if (!m_favoritesUpdateTask.isRunning()) {
|
||||
m_favoritesUpdateTask = TaskManager::createTask("hex.ui.pattern_drawer.updating"_lang, TaskManager::NoProgress, [this, patterns](auto &task) {
|
||||
m_favoritesUpdateTask = TaskManager::createTask("hex.ui.pattern_drawer.updating"_lang, TaskManager::NoProgress, [this, patterns, runtime](auto &task) {
|
||||
size_t updatedFavorites = 0;
|
||||
|
||||
const std::string favoriteAttribute = "hex::favorite";
|
||||
const std::string groupAttribute = "hex::group";
|
||||
{
|
||||
const auto favorites = runtime->getPatternsWithAttribute("hex::favorite");
|
||||
for (const auto &pattern : favorites) {
|
||||
m_favorites.insert({ getPatternPath(pattern), pattern->clone() });
|
||||
}
|
||||
|
||||
const auto groupAttribute = "hex::group";
|
||||
const auto groups = runtime->getPatternsWithAttribute(groupAttribute);
|
||||
for (const auto &pattern : groups) {
|
||||
const auto arguments = pattern->getAttributeArguments(groupAttribute);
|
||||
if (!arguments.empty()) {
|
||||
const auto &groupName = arguments.front().toString();
|
||||
if (!m_groups.contains(groupName))
|
||||
m_groups.insert({ groupName, std::vector<std::unique_ptr<pl::ptrn::Pattern>>() });
|
||||
|
||||
m_groups[groupName].push_back(pattern->clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &pattern : patterns) {
|
||||
std::vector<std::string> patternPath;
|
||||
|
||||
size_t startFavoriteCount = m_favorites.size();
|
||||
traversePatternTree(*pattern, patternPath, [&, this](const pl::ptrn::Pattern &currPattern) {
|
||||
if (currPattern.hasAttribute(favoriteAttribute))
|
||||
m_favorites.insert({ patternPath, currPattern.clone() });
|
||||
|
||||
if (const auto &args = currPattern.getAttributeArguments(groupAttribute); !args.empty()) {
|
||||
auto groupName = args.front().toString();
|
||||
|
||||
if (!m_groups.contains(groupName))
|
||||
m_groups.insert({groupName, std::vector<std::unique_ptr<pl::ptrn::Pattern>>()});
|
||||
|
||||
m_groups[groupName].push_back(currPattern.clone());
|
||||
}
|
||||
|
||||
task.update();
|
||||
});
|
||||
|
||||
task.update();
|
||||
|
||||
if (startFavoriteCount == m_favorites.size())
|
||||
continue;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user