1
0
mirror of synced 2025-02-08 23:09:36 +01:00

fix: Potential race condition with sorting in the pattern drawer

This commit is contained in:
WerWolv 2024-07-01 23:36:17 +02:00
parent c2f661f021
commit dd8e7025d0

View File

@ -209,6 +209,12 @@ namespace hex::ui {
void PatternDrawer::updateFilter() { void PatternDrawer::updateFilter() {
m_filteredPatterns.clear(); m_filteredPatterns.clear();
if (m_filter.path.empty()) {
m_filteredPatterns = m_sortedPatterns;
return;
}
std::vector<std::string> treePath; std::vector<std::string> treePath;
for (auto &pattern : m_sortedPatterns) { for (auto &pattern : m_sortedPatterns) {
traversePatternTree(*pattern, treePath, [this, &treePath](auto &pattern){ traversePatternTree(*pattern, treePath, [this, &treePath](auto &pattern){
@ -1131,24 +1137,26 @@ namespace hex::ui {
if (!sortSpecs->SpecsDirty && !sortedPatterns.empty()) { if (!sortSpecs->SpecsDirty && !sortedPatterns.empty()) {
return true; return true;
} }
sortedPatterns.clear();
std::transform(patterns.begin(), patterns.end(), std::back_inserter(sortedPatterns), [](const std::shared_ptr<pl::ptrn::Pattern> &pattern) {
return pattern.get();
});
std::sort(sortedPatterns.begin(), sortedPatterns.end(), [this, &sortSpecs](const pl::ptrn::Pattern *left, const pl::ptrn::Pattern *right) -> bool { if (!m_favoritesUpdateTask.isRunning()) {
return this->sortPatterns(sortSpecs, left, right); sortedPatterns.clear();
}); std::transform(patterns.begin(), patterns.end(), std::back_inserter(sortedPatterns), [](const std::shared_ptr<pl::ptrn::Pattern> &pattern) {
return pattern.get();
});
for (auto &pattern : sortedPatterns) { std::stable_sort(sortedPatterns.begin(), sortedPatterns.end(), [this, &sortSpecs](const pl::ptrn::Pattern *left, const pl::ptrn::Pattern *right) -> bool {
pattern->sort([this, &sortSpecs](const pl::ptrn::Pattern *left, const pl::ptrn::Pattern *right){
return this->sortPatterns(sortSpecs, left, right); return this->sortPatterns(sortSpecs, left, right);
}); });
for (auto &pattern : sortedPatterns) {
pattern->sort([this, &sortSpecs](const pl::ptrn::Pattern *left, const pl::ptrn::Pattern *right){
return this->sortPatterns(sortSpecs, left, right);
});
}
sortSpecs->SpecsDirty = false;
} }
sortSpecs->SpecsDirty = false;
return true; return true;
} }