From 20a233150422a31f877f60c187402b0cf8157f9b Mon Sep 17 00:00:00 2001 From: WerWolv Date: Tue, 13 Sep 2022 16:05:41 +0200 Subject: [PATCH] feat: Allow task stop button to abort pattern evaluation --- lib/libimhex/include/hex/api/task.hpp | 3 +++ lib/libimhex/source/api/task.cpp | 7 +++++++ .../builtin/source/content/views/view_pattern_editor.cpp | 4 +++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/libimhex/include/hex/api/task.hpp b/lib/libimhex/include/hex/api/task.hpp index 392c294e6..06dbc1a10 100644 --- a/lib/libimhex/include/hex/api/task.hpp +++ b/lib/libimhex/include/hex/api/task.hpp @@ -40,6 +40,8 @@ namespace hex { void interrupt(); + void setInterruptCallback(std::function callback); + private: void finish(); void interruption(); @@ -51,6 +53,7 @@ namespace hex { std::string m_unlocalizedName; u64 m_currValue, m_maxValue; std::thread m_thread; + std::function m_interruptCallback; bool m_shouldInterrupt = false; diff --git a/lib/libimhex/source/api/task.cpp b/lib/libimhex/source/api/task.cpp index d0b854a36..21d7c5ae7 100644 --- a/lib/libimhex/source/api/task.cpp +++ b/lib/libimhex/source/api/task.cpp @@ -72,6 +72,13 @@ namespace hex { std::scoped_lock lock(this->m_mutex); this->m_shouldInterrupt = true; + + if (this->m_interruptCallback) + this->m_interruptCallback(); + } + + void Task::setInterruptCallback(std::function callback) { + this->m_interruptCallback = std::move(callback); } bool Task::isFinished() const { diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index 08a8c508c..ee9e4a0ca 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -822,7 +822,9 @@ namespace hex::plugin::builtin { EventManager::post(); - TaskManager::createTask("hex.builtin.view.pattern_editor.evaluating", TaskManager::NoProgress, [this, &runtime, code](auto &) { + TaskManager::createTask("hex.builtin.view.pattern_editor.evaluating", TaskManager::NoProgress, [this, &runtime, code](auto &task) { + task.setInterruptCallback([&runtime] { runtime->abort(); }); + std::map envVars; for (const auto &[id, name, value, type] : this->m_envVarEntries) envVars.insert({ name, value });