From 800a24b42e8487a90e5e1d41fe95ec7d34c0cb3e Mon Sep 17 00:00:00 2001 From: paxcut <53811119+paxcut@users.noreply.github.com> Date: Mon, 9 Feb 2026 20:21:51 -0700 Subject: [PATCH] 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. --- .github/workflows/build.yml | 4 +- .../content/views/view_pattern_editor.hpp | 12 +++--- .../text_highlighting/pattern_language.cpp | 6 +-- .../content/views/view_pattern_editor.cpp | 42 ++++++------------- plugins/ui/source/ui/text_editor/editor.cpp | 1 - 5 files changed, 23 insertions(+), 42 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bbe809021..23984ecca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -110,7 +110,7 @@ jobs: - name: 🕯️ Install WiX Toolkit run: | "C:/Program Files/dotnet/dotnet.exe" tool install --global wix@6.0.2 - "$(echo "$USERPROFILE" | tr '\\' '/')/.dotnet/tools/wix" extension add -g WixToolset.UI.wixext + "$(echo "$USERPROFILE" | tr '\\' '/')/.dotnet/tools/wix" extension add --global WixToolset.UI.wixext/6.0.2 - name: 🪲 Create PDBs for MSI run: | @@ -294,7 +294,7 @@ jobs: - name: 🕯️ Install WiX Toolkit run: | & "C:/Program Files/dotnet/dotnet.exe" tool install --global wix@6.0.2 - & "$($env:USERPROFILE -replace '\\','/')/.dotnet/tools/wix" extension add -g WixToolset.UI.wixext + & "$($env:USERPROFILE -replace '\\','/')/.dotnet/tools/wix" extension add --global WixToolset.UI.wixext/6.0.2 - name: 📦 Bundle MSI run: | diff --git a/plugins/builtin/include/content/views/view_pattern_editor.hpp b/plugins/builtin/include/content/views/view_pattern_editor.hpp index 05e2a0d44..90654c130 100644 --- a/plugins/builtin/include/content/views/view_pattern_editor.hpp +++ b/plugins/builtin/include/content/views/view_pattern_editor.hpp @@ -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 m_runningHighlighters = 0; PerProvider m_hasUnevaluatedChanges; - std::atomic m_changesWereParsed; - PerProvider m_hasUncoloredChanges; - std::atomic m_changesWereColored; - std::atomic m_wasInterrupted; + std::atomic m_changesWereParsed = false; + std::atomic m_changesWereColored = false; + std::atomic m_allStepsCompleted = false; std::atomic m_interrupt; std::chrono::time_point m_lastEditorChangeTime; diff --git a/plugins/builtin/source/content/text_highlighting/pattern_language.cpp b/plugins/builtin/source/content/text_highlighting/pattern_language.cpp index fa2f9ac93..fdea61e3b 100644 --- a/plugins/builtin/source/content/text_highlighting/pattern_language.cpp +++ b/plugins/builtin/source/content/text_highlighting/pattern_language.cpp @@ -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; } diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index 97ba83de3..50a2b33fc 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -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; } diff --git a/plugins/ui/source/ui/text_editor/editor.cpp b/plugins/ui/source/ui/text_editor/editor.cpp index 91647ac87..4cbe5c02f 100644 --- a/plugins/ui/source/ui/text_editor/editor.cpp +++ b/plugins/ui/source/ui/text_editor/editor.cpp @@ -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;