DiffEditor: Use QtConcurrent invocation for async tasks

Change-Id: I06640837ffee830e60e8dd2a566f9388f8444010
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Jarek Kobus
2023-02-11 23:21:58 +01:00
parent a8214665fe
commit 5ff073df19
11 changed files with 114 additions and 170 deletions

View File

@@ -8,14 +8,8 @@
#include "diffeditorplugin.h"
#include "diffeditortr.h"
#include <QMenu>
#include <QPainter>
#include <QScrollBar>
#include <QTextBlock>
#include <QVBoxLayout>
#include <coreplugin/icore.h>
#include <coreplugin/find/highlightscrollbarcontroller.h>
#include <coreplugin/icore.h>
#include <coreplugin/minisplitter.h>
#include <coreplugin/progressmanager/progressmanager.h>
@@ -29,6 +23,11 @@
#include <utils/mathutils.h>
#include <utils/tooltip/tooltip.h>
#include <QMenu>
#include <QPainter>
#include <QScrollBar>
#include <QVBoxLayout>
using namespace Core;
using namespace TextEditor;
using namespace Utils;
@@ -245,7 +244,7 @@ QString SideDiffEditorWidget::plainTextFromSelection(const QTextCursor &cursor)
return TextDocument::convertToPlainText(text);
}
SideBySideDiffOutput SideDiffData::diffOutput(QFutureInterface<void> &fi, int progressMin,
SideBySideDiffOutput SideDiffData::diffOutput(QFutureInterfaceBase &fi, int progressMin,
int progressMax, const DiffEditorInput &input)
{
SideBySideDiffOutput output;
@@ -914,19 +913,15 @@ void SideBySideDiffEditorWidget::showDiff()
const DiffEditorInput input(&m_controller);
auto getDocument = [input](QFutureInterface<ShowResults> &futureInterface) {
auto cleanup = qScopeGuard([&futureInterface] {
if (futureInterface.isCanceled())
futureInterface.reportCanceled();
});
auto getDocument = [input](QPromise<ShowResults> &promise) {
const int firstPartMax = 20; // diffOutput is about 4 times quicker than filling document
const int leftPartMax = 60;
const int rightPartMax = 100;
futureInterface.setProgressRange(0, rightPartMax);
futureInterface.setProgressValue(0);
QFutureInterface<void> fi = futureInterface;
promise.setProgressRange(0, rightPartMax);
promise.setProgressValue(0);
QFutureInterfaceBase fi = QFutureInterfaceBase::get(promise.future());
const SideBySideDiffOutput output = SideDiffData::diffOutput(fi, 0, firstPartMax, input);
if (futureInterface.isCanceled())
if (promise.isCanceled())
return;
const ShowResult leftResult{TextDocumentPtr(new TextDocument("DiffEditor.SideDiffEditor")),
@@ -935,7 +930,7 @@ void SideBySideDiffEditorWidget::showDiff()
output.side[RightSide].diffData, output.side[RightSide].selections};
const ShowResults result{leftResult, rightResult};
auto propagateDocument = [&output, &fi](DiffSide side, const ShowResult &result,
auto propagateDocument = [&output, &promise](DiffSide side, const ShowResult &result,
int progressMin, int progressMax) {
// No need to store the change history
result.textDocument->document()->setUndoRedoEnabled(false);
@@ -952,8 +947,9 @@ void SideBySideDiffEditorWidget::showDiff()
const QString package = output.side[side].diffText.mid(currentPos, packageSize);
cursor.insertText(package);
currentPos += package.size();
fi.setProgressValue(MathUtils::interpolateLinear(currentPos, 0, diffSize, progressMin, progressMax));
if (fi.isCanceled())
promise.setProgressValue(MathUtils::interpolateLinear(currentPos, 0, diffSize,
progressMin, progressMax));
if (promise.isCanceled())
return;
}
@@ -968,16 +964,16 @@ void SideBySideDiffEditorWidget::showDiff()
};
propagateDocument(LeftSide, leftResult, firstPartMax, leftPartMax);
if (fi.isCanceled())
if (promise.isCanceled())
return;
propagateDocument(RightSide, rightResult, leftPartMax, rightPartMax);
if (fi.isCanceled())
if (promise.isCanceled())
return;
futureInterface.reportResult(result);
promise.addResult(result);
};
m_asyncTask->setAsyncCallData(getDocument);
m_asyncTask->setConcurrentCallData(getDocument);
m_asyncTask->start();
ProgressManager::addTask(m_asyncTask->future(), Tr::tr("Rendering diff"), "DiffEditor");
}