diff --git a/src/plugins/diffeditor/diffeditorplugin.h b/src/plugins/diffeditor/diffeditorplugin.h index e3ec8924f47..19ec16fd165 100644 --- a/src/plugins/diffeditor/diffeditorplugin.h +++ b/src/plugins/diffeditor/diffeditorplugin.h @@ -3,18 +3,11 @@ #pragma once -#include "diffeditor_global.h" - #include #include namespace Utils { class FutureSynchronizer; } -QT_BEGIN_NAMESPACE -template -class QFuture; -QT_END_NAMESPACE - namespace DiffEditor { namespace Internal { diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index 9870baccfd1..27d14830193 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -25,8 +25,7 @@ #include #include -#include -#include +#include #include using namespace Core; @@ -781,13 +780,7 @@ SideBySideDiffEditorWidget::SideBySideDiffEditorWidget(QWidget *parent) setFocusProxy(m_editor[LeftSide]); } -SideBySideDiffEditorWidget::~SideBySideDiffEditorWidget() -{ - if (m_watcher) { - m_watcher->cancel(); - DiffEditorPlugin::futureSynchronizer()->addFuture(m_watcher->future()); - } -} +SideBySideDiffEditorWidget::~SideBySideDiffEditorWidget() = default; TextEditorWidget *SideBySideDiffEditorWidget::sideEditorWidget(DiffSide side) const { @@ -815,10 +808,8 @@ void SideBySideDiffEditorWidget::clear(const QString &message) setDiff({}); for (SideDiffEditorWidget *editor : m_editor) editor->clearAll(message); - if (m_watcher) { - m_watcher->cancel(); - DiffEditorPlugin::futureSynchronizer()->addFuture(m_watcher->future()); - m_watcher.reset(); + if (m_asyncTask) { + m_asyncTask.reset(); m_controller.setBusyShowing(false); } } @@ -878,15 +869,16 @@ void SideBySideDiffEditorWidget::restoreState() void SideBySideDiffEditorWidget::showDiff() { - m_watcher.reset(new QFutureWatcher()); + m_asyncTask.reset(new AsyncTask()); + m_asyncTask->setFutureSynchronizer(DiffEditorPlugin::futureSynchronizer()); m_controller.setBusyShowing(true); - connect(m_watcher.get(), &QFutureWatcherBase::finished, this, [this] { - if (m_watcher->isCanceled()) { + connect(m_asyncTask.get(), &AsyncTaskBase::done, this, [this] { + if (m_asyncTask->isCanceled()) { for (SideDiffEditorWidget *editor : m_editor) editor->clearAll(tr("Retrieving data failed.")); } else { - const ShowResults results = m_watcher->result(); + const ShowResults results = m_asyncTask->result(); m_editor[LeftSide]->setDiffData(results[LeftSide].diffData); m_editor[RightSide]->setDiffData(results[RightSide].diffData); TextDocumentPtr leftDoc(results[LeftSide].textDocument); @@ -916,7 +908,7 @@ void SideBySideDiffEditorWidget::showDiff() m_editor[RightSide]->setSelections(results[RightSide].selections); setCurrentDiffFileIndex(m_controller.currentDiffFileIndex()); } - m_watcher.release()->deleteLater(); + m_asyncTask.release()->deleteLater(); m_controller.setBusyShowing(false); }); @@ -985,8 +977,9 @@ void SideBySideDiffEditorWidget::showDiff() futureInterface.reportResult(result); }; - m_watcher->setFuture(runAsync(getDocument)); - ProgressManager::addTask(m_watcher->future(), tr("Rendering diff"), "DiffEditor"); + m_asyncTask->setAsyncCallData(getDocument); + m_asyncTask->start(); + ProgressManager::addTask(m_asyncTask->future(), tr("Rendering diff"), "DiffEditor"); } void SideBySideDiffEditorWidget::setFontSettings(const FontSettings &fontSettings) diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.h b/src/plugins/diffeditor/sidebysidediffeditorwidget.h index 2c1e30f4d11..79c3085d67a 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.h +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.h @@ -7,7 +7,7 @@ #include "diffeditorwidgetcontroller.h" #include "selectabletexteditorwidget.h" // TODO: we need DiffSelections here only -#include +#include #include namespace Core { class IContext; } @@ -17,6 +17,11 @@ class FontSettings; class TextEditorWidget; } +namespace Utils { +template +class AsyncTask; +} + QT_BEGIN_NAMESPACE class QMenu; class QSplitter; @@ -138,7 +143,7 @@ private: }; using ShowResults = std::array; - std::unique_ptr> m_watcher; + std::unique_ptr> m_asyncTask; }; } // namespace Internal diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index 663e53166f0..3f902f25183 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -21,9 +21,8 @@ #include #include -#include +#include #include -#include #include using namespace Core; @@ -54,13 +53,7 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent) Core::ICore::addContextObject(context); } -UnifiedDiffEditorWidget::~UnifiedDiffEditorWidget() -{ - if (m_watcher) { - m_watcher->cancel(); - DiffEditorPlugin::futureSynchronizer()->addFuture(m_watcher->future()); - } -} +UnifiedDiffEditorWidget::~UnifiedDiffEditorWidget() = default; void UnifiedDiffEditorWidget::setDocument(DiffEditorDocument *document) { @@ -203,10 +196,8 @@ void UnifiedDiffEditorWidget::clear(const QString &message) { m_data = {}; setSelections({}); - if (m_watcher) { - m_watcher->cancel(); - DiffEditorPlugin::futureSynchronizer()->addFuture(m_watcher->future()); - m_watcher.reset(); + if (m_asyncTask) { + m_asyncTask.reset(); m_controller.setBusyShowing(false); } @@ -462,13 +453,14 @@ void UnifiedDiffEditorWidget::showDiff() return; } - m_watcher.reset(new QFutureWatcher()); + m_asyncTask.reset(new AsyncTask()); + m_asyncTask->setFutureSynchronizer(DiffEditorPlugin::futureSynchronizer()); m_controller.setBusyShowing(true); - connect(m_watcher.get(), &QFutureWatcherBase::finished, this, [this] { - if (m_watcher->isCanceled()) { + connect(m_asyncTask.get(), &AsyncTaskBase::done, this, [this] { + if (m_asyncTask->isCanceled()) { setPlainText(tr("Retrieving data failed.")); } else { - const ShowResult result = m_watcher->result(); + const ShowResult result = m_asyncTask->result(); m_data = result.diffData; TextDocumentPtr doc(result.textDocument); { @@ -482,7 +474,7 @@ void UnifiedDiffEditorWidget::showDiff() setSelections(result.selections); setCurrentDiffFileIndex(m_controller.currentDiffFileIndex()); } - m_watcher.release()->deleteLater(); + m_asyncTask.release()->deleteLater(); m_controller.setBusyShowing(false); }); @@ -535,8 +527,9 @@ void UnifiedDiffEditorWidget::showDiff() futureInterface.reportResult(result); }; - m_watcher->setFuture(runAsync(getDocument)); - ProgressManager::addTask(m_watcher->future(), tr("Rendering diff"), "DiffEditor"); + m_asyncTask->setAsyncCallData(getDocument); + m_asyncTask->start(); + ProgressManager::addTask(m_asyncTask->future(), tr("Rendering diff"), "DiffEditor"); } void UnifiedDiffEditorWidget::jumpToOriginalFile(const QTextCursor &cursor) diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.h b/src/plugins/diffeditor/unifieddiffeditorwidget.h index 4555ac2081f..43645d84303 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.h +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.h @@ -6,12 +6,17 @@ #include "diffeditorwidgetcontroller.h" #include "selectabletexteditorwidget.h" -#include +#include namespace Core { class IContext; } namespace TextEditor { class FontSettings; } +namespace Utils { +template +class AsyncTask; +} + namespace DiffEditor { class ChunkData; @@ -107,7 +112,7 @@ private: DiffSelections selections; }; - std::unique_ptr> m_watcher; + std::unique_ptr> m_asyncTask; }; } // namespace Internal