summaryrefslogtreecommitdiff
path: root/src/plugins/diffeditor/diffeditorplugin.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2022-12-15 17:14:56 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2022-12-15 20:56:04 +0000
commitd59eca85770e1124ccfe589f534a880e55c1fbae (patch)
tree0333fe21718c07db1fb2640ccc28f80e575780f8 /src/plugins/diffeditor/diffeditorplugin.cpp
parentdf2d68eb4fe31bd6682459775f0406f39d8a3984 (diff)
downloadqt-creator-d59eca85770e1124ccfe589f534a880e55c1fbae.tar.gz
DiffFilesController: Reuse task tree
Change-Id: Ia83cd81dc3dad671c7ec72cdffe882775c7e4508 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/diffeditor/diffeditorplugin.cpp')
-rw-r--r--src/plugins/diffeditor/diffeditorplugin.cpp90
1 files changed, 48 insertions, 42 deletions
diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp
index 617c19f7b7..08493a87ae 100644
--- a/src/plugins/diffeditor/diffeditorplugin.cpp
+++ b/src/plugins/diffeditor/diffeditorplugin.cpp
@@ -23,6 +23,7 @@
#include <texteditor/texteditor.h>
#include <utils/algorithm.h>
+#include <utils/asynctask.h>
#include <utils/differ.h>
#include <utils/futuresynchronizer.h>
#include <utils/mapreduce.h>
@@ -52,17 +53,17 @@ public:
{}
void operator()(QFutureInterface<FileData> &futureInterface,
- const ReloadInput &reloadInfo) const
+ const ReloadInput &reloadInput) const
{
- if (reloadInfo.text[LeftSide] == reloadInfo.text[RightSide])
+ if (reloadInput.text[LeftSide] == reloadInput.text[RightSide])
return; // We show "No difference" in this case, regardless if it's binary or not
Differ differ(&futureInterface);
FileData fileData;
- if (!reloadInfo.binaryFiles) {
+ if (!reloadInput.binaryFiles) {
const QList<Diff> diffList = Differ::cleanupSemantics(
- differ.diff(reloadInfo.text[LeftSide], reloadInfo.text[RightSide]));
+ differ.diff(reloadInput.text[LeftSide], reloadInput.text[RightSide]));
QList<Diff> leftDiffList;
QList<Diff> rightDiffList;
@@ -86,9 +87,9 @@ public:
outputLeftDiffList, outputRightDiffList);
fileData = DiffUtils::calculateContextData(chunkData, m_contextLineCount, 0);
}
- fileData.fileInfo = reloadInfo.fileInfo;
- fileData.fileOperation = reloadInfo.fileOperation;
- fileData.binaryFiles = reloadInfo.binaryFiles;
+ fileData.fileInfo = reloadInput.fileInfo;
+ fileData.fileOperation = reloadInput.fileOperation;
+ fileData.binaryFiles = reloadInput.binaryFiles;
futureInterface.reportResult(fileData);
}
@@ -102,50 +103,55 @@ class DiffFilesController : public DiffEditorController
Q_OBJECT
public:
DiffFilesController(IDocument *document);
- ~DiffFilesController() override { cancelReload(); }
protected:
virtual QList<ReloadInput> reloadInputList() const = 0;
-
-private:
- void reloaded();
- void cancelReload();
-
- QFutureWatcher<FileData> m_futureWatcher;
};
DiffFilesController::DiffFilesController(IDocument *document)
: DiffEditorController(document)
{
- connect(&m_futureWatcher, &QFutureWatcher<FileData>::finished,
- this, &DiffFilesController::reloaded);
-
- setReloader([this] {
- cancelReload();
- m_futureWatcher.setFuture(map(reloadInputList(),
- DiffFile(ignoreWhitespace(), contextLineCount())));
-
- Core::ProgressManager::addTask(m_futureWatcher.future(),
- tr("Calculating diff"), "DiffEditor");
- });
-}
-
-void DiffFilesController::reloaded()
-{
- const bool success = !m_futureWatcher.future().isCanceled();
- const QList<FileData> fileDataList = success
- ? m_futureWatcher.future().results() : QList<FileData>();
-
- setDiffFiles(fileDataList);
- reloadFinished(success);
-}
+ setDisplayName(tr("Diff"));
+ using namespace Tasking;
+
+ const TreeStorage<QList<FileData>> storage;
+
+ const auto setupTree = [this, storage](TaskTree &taskTree) {
+ QList<FileData> *outputList = storage.activeStorage();
+
+ const auto setupDiff = [this](AsyncTask<FileData> &async, const ReloadInput &reloadInput) {
+ async.setAsyncCallData(DiffFile(ignoreWhitespace(), contextLineCount()), reloadInput);
+ async.setFutureSynchronizer(Internal::DiffEditorPlugin::futureSynchronizer());
+ };
+ const auto onDiffDone = [outputList](const AsyncTask<FileData> &async, int i) {
+ (*outputList)[i] = async.result();
+ };
+
+ const QList<ReloadInput> inputList = reloadInputList();
+ outputList->resize(inputList.size());
+
+ using namespace std::placeholders;
+ QList<TaskItem> tasks {parallel, continueOnDone};
+ for (int i = 0; i < inputList.size(); ++i) {
+ tasks.append(Async<FileData>(std::bind(setupDiff, _1, inputList.at(i)),
+ std::bind(onDiffDone, _1, i)));
+ }
+ taskTree.setupRoot(tasks);
+ };
+ const auto onTreeDone = [this, storage] {
+ setDiffFiles(*storage.activeStorage());
+ };
+ const auto onTreeError = [this, storage] {
+ setDiffFiles({});
+ };
-void DiffFilesController::cancelReload()
-{
- if (m_futureWatcher.future().isRunning()) {
- m_futureWatcher.future().cancel();
- m_futureWatcher.setFuture({});
- }
+ const Group root = {
+ Storage(storage),
+ Tree(setupTree),
+ OnGroupDone(onTreeDone),
+ OnGroupError(onTreeError)
+ };
+ setReloadRecipe(root);
}
class DiffCurrentFileController : public DiffFilesController