From bfcd8dc1fbccbed2a0a3a97ef89bf8d6e8b51c35 Mon Sep 17 00:00:00 2001 From: Petr Mironychev <9195189+Palm1r@users.noreply.github.com> Date: Thu, 28 May 2026 16:00:18 +0200 Subject: [PATCH] fix: Prevent crash on cancelling quick refactor via progress widget --- QuickRefactorHandler.cpp | 32 ++++++++++++++++---------------- widgets/ProgressWidget.cpp | 8 +++++--- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/QuickRefactorHandler.cpp b/QuickRefactorHandler.cpp index aacd78c..fe70e45 100644 --- a/QuickRefactorHandler.cpp +++ b/QuickRefactorHandler.cpp @@ -385,25 +385,25 @@ void QuickRefactorHandler::handleLLMResponse( void QuickRefactorHandler::cancelRequest() { - if (m_isRefactoringInProgress) { - auto id = m_lastRequestId; + if (!m_isRefactoringInProgress) + return; - for (auto it = m_activeRequests.begin(); it != m_activeRequests.end(); ++it) { - if (it.key() == id) { - const RequestContext &ctx = it.value(); - ctx.provider->cancelRequest(id); - m_activeRequests.erase(it); - break; - } - } + const auto id = m_lastRequestId; + m_isRefactoringInProgress = false; + m_lastRequestId = {}; - m_isRefactoringInProgress = false; - - RefactorResult result; - result.success = false; - result.errorMessage = "Refactoring request was cancelled"; - emit refactoringCompleted(result); + auto it = m_activeRequests.find(id); + if (it != m_activeRequests.end()) { + auto provider = it.value().provider; + m_activeRequests.erase(it); + if (provider) + provider->cancelRequest(id); } + + RefactorResult result; + result.success = false; + result.errorMessage = "Refactoring request was cancelled"; + emit refactoringCompleted(result); } void QuickRefactorHandler::handleFullResponse(const QString &requestId, const QString &fullText) diff --git a/widgets/ProgressWidget.cpp b/widgets/ProgressWidget.cpp index 33dc394..f12c6e2 100644 --- a/widgets/ProgressWidget.cpp +++ b/widgets/ProgressWidget.cpp @@ -142,10 +142,12 @@ void ProgressWidget::leaveEvent(QEvent *event) void ProgressWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton && m_isHovered) { + event->accept(); + auto callback = m_cancelCallback; emit cancelRequested(); - if (m_cancelCallback) { - m_cancelCallback(); - } + if (callback) + callback(); + return; } QWidget::mousePressEvent(event); }