fix: Dirty projects on load. (#2649)

When a project is loaded it is set to dirty without any changes so that
it goes through the steps that patterns with changes go through. The fix
uses a different starting step that doesn't set the dirty flags when
changing providers or loading projects.
This commit is contained in:
paxcut
2026-02-09 20:21:51 -07:00
committed by GitHub
parent a5008722aa
commit 800a24b42e
5 changed files with 23 additions and 42 deletions

View File

@@ -56,9 +56,8 @@ namespace hex::plugin::builtin {
enum class DangerousFunctionPerms : u8 { Ask, Allow, Deny };
void drawHelpText() override;
void setWasInterrupted(bool wasInterrupted) { m_wasInterrupted = wasInterrupted; }
bool wasInterrupted() const { return m_wasInterrupted;}
void resetInterrupt() { m_wasInterrupted = false; m_interrupt = false;}
bool interrupted() const { return m_interrupt;}
void resetInterrupt() { m_interrupt = false;}
void interrupt() { m_interrupt = true; }
private:
@@ -112,10 +111,9 @@ namespace hex::plugin::builtin {
std::atomic<u32> m_runningHighlighters = 0;
PerProvider<bool> m_hasUnevaluatedChanges;
std::atomic<bool> m_changesWereParsed;
PerProvider<bool> m_hasUncoloredChanges;
std::atomic<bool> m_changesWereColored;
std::atomic<bool> m_wasInterrupted;
std::atomic<bool> m_changesWereParsed = false;
std::atomic<bool> m_changesWereColored = false;
std::atomic<bool> m_allStepsCompleted = false;
std::atomic<bool> m_interrupt;
std::chrono::time_point<std::chrono::steady_clock> m_lastEditorChangeTime;

View File

@@ -68,7 +68,7 @@ namespace hex::plugin::builtin {
}
void TextHighlighter::next(i32 count) {
if (m_viewPatternEditor->wasInterrupted()) {
if (m_viewPatternEditor->interrupted()) {
m_viewPatternEditor->resetInterrupt();
throw std::out_of_range("Highlights were deliberately interrupted");
}
@@ -2510,7 +2510,7 @@ namespace hex::plugin::builtin {
m_viewPatternEditor->resetInterrupt();
ON_SCOPE_EXIT {
m_viewPatternEditor->incrementRunningHighlighters(-1);
m_viewPatternEditor->setChangesWereColored(!m_viewPatternEditor->wasInterrupted());
m_viewPatternEditor->setChangesWereColored(!m_viewPatternEditor->interrupted());
};
try {
m_viewPatternEditor->incrementRunningHighlighters(1);
@@ -2556,7 +2556,7 @@ namespace hex::plugin::builtin {
}
} catch (const std::out_of_range &e) {
log::debug("TextHighlighter::highlightSourceCode: Out of range error: {}", e.what());
m_viewPatternEditor->setWasInterrupted(true);
m_viewPatternEditor->interrupt();
return;
}

View File

@@ -1457,7 +1457,9 @@ namespace hex::plugin::builtin {
if (m_hasUnevaluatedChanges.get(provider) && m_runningEvaluators == 0 && m_runningParsers == 0 &&
(std::chrono::steady_clock::now() - m_lastEditorChangeTime) > std::chrono::seconds(1ll)) {
m_changesWereParsed = false;
m_changesWereColored = false;
m_allStepsCompleted = false;
auto code = m_textEditor.get(provider).getText();
EventPatternEditorChanged::post(code);
TaskManager::createBackgroundTask("hex.builtin.task.parsing_pattern", [this, code = std::move(code), provider](auto &){
@@ -1473,35 +1475,15 @@ namespace hex::plugin::builtin {
this->evaluatePattern(m_textEditor.get(provider).getText(), provider);
}
TaskHolder coloringTaskHolder;
if (m_changesWereParsed || m_wasInterrupted || m_hasUnevaluatedChanges.get(provider)) {
if (coloringTaskHolder.isRunning())
interrupt();
if (m_wasInterrupted)
resetInterrupt();
m_changesWereParsed = false;
if(!m_hasUnevaluatedChanges.get(provider)) {
m_hasUncoloredChanges.get(provider) = true;
m_changesWereColored = false;
} else
m_hasUncoloredChanges.get(provider) = false;
}
if (m_hasUncoloredChanges.get(provider) && (m_runningHighlighters + m_runningEvaluators == 0)) {
try {
m_textHighlighter.get(provider).setViewPatternEditor(this);
m_textHighlighter.get(provider).updateRequiredInputs();
coloringTaskHolder = TaskManager::createBackgroundTask("HighlightSourceCode", [this,provider](auto &) { m_textHighlighter.get(provider).highlightSourceCode(); });
m_hasUncoloredChanges.get(provider) = false;
} catch (const std::out_of_range&) {
interrupt();
}
} else if (m_changesWereColored) {
if (m_runningHighlighters > 0 && !m_changesWereParsed)
interrupt();
else if (m_runningHighlighters == 0 && m_changesWereParsed && !m_changesWereColored && !m_allStepsCompleted) {
m_textHighlighter.get(provider).setViewPatternEditor(this);
m_textHighlighter.get(provider).updateRequiredInputs();
TaskManager::createBackgroundTask("HighlightSourceCode", [this,provider](auto &) { m_textHighlighter.get(provider).highlightSourceCode(); });
} else if (m_changesWereColored && !m_allStepsCompleted) {
m_textHighlighter.get(provider).setRequestedIdentifierColors();
m_changesWereColored = false;
m_allStepsCompleted = true;
}
if (m_dangerousFunctionCalled && !ImGui::IsPopupOpen(ImGuiID(0), ImGuiPopupFlags_AnyPopup)) {
@@ -1713,6 +1695,8 @@ namespace hex::plugin::builtin {
}
m_changesWereParsed = true;
m_changesWereColored = false;
m_allStepsCompleted = false;
m_runningParsers -= 1;
}

View File

@@ -259,7 +259,6 @@ namespace hex::ui {
if (u.m_addedRange.m_start == Invalid || u.m_addedRange.m_end == Invalid)
return;
}
m_textChanged = true;
m_scrollToTop = true;
if (!m_readOnly && undo) {
u.m_after = m_state;