mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-03-27 23:37:05 -05:00
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:
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -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: |
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
if (m_runningHighlighters > 0 && !m_changesWereParsed)
|
||||
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 {
|
||||
else if (m_runningHighlighters == 0 && m_changesWereParsed && !m_changesWereColored && !m_allStepsCompleted) {
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user