forked from qt-creator/qt-creator
DiffFilesController: Reuse task tree
Change-Id: Ia83cd81dc3dad671c7ec72cdffe882775c7e4508 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
@@ -23,6 +23,7 @@
|
|||||||
#include <texteditor/texteditor.h>
|
#include <texteditor/texteditor.h>
|
||||||
|
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
|
#include <utils/asynctask.h>
|
||||||
#include <utils/differ.h>
|
#include <utils/differ.h>
|
||||||
#include <utils/futuresynchronizer.h>
|
#include <utils/futuresynchronizer.h>
|
||||||
#include <utils/mapreduce.h>
|
#include <utils/mapreduce.h>
|
||||||
@@ -52,17 +53,17 @@ public:
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
void operator()(QFutureInterface<FileData> &futureInterface,
|
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
|
return; // We show "No difference" in this case, regardless if it's binary or not
|
||||||
|
|
||||||
Differ differ(&futureInterface);
|
Differ differ(&futureInterface);
|
||||||
|
|
||||||
FileData fileData;
|
FileData fileData;
|
||||||
if (!reloadInfo.binaryFiles) {
|
if (!reloadInput.binaryFiles) {
|
||||||
const QList<Diff> diffList = Differ::cleanupSemantics(
|
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> leftDiffList;
|
||||||
QList<Diff> rightDiffList;
|
QList<Diff> rightDiffList;
|
||||||
@@ -86,9 +87,9 @@ public:
|
|||||||
outputLeftDiffList, outputRightDiffList);
|
outputLeftDiffList, outputRightDiffList);
|
||||||
fileData = DiffUtils::calculateContextData(chunkData, m_contextLineCount, 0);
|
fileData = DiffUtils::calculateContextData(chunkData, m_contextLineCount, 0);
|
||||||
}
|
}
|
||||||
fileData.fileInfo = reloadInfo.fileInfo;
|
fileData.fileInfo = reloadInput.fileInfo;
|
||||||
fileData.fileOperation = reloadInfo.fileOperation;
|
fileData.fileOperation = reloadInput.fileOperation;
|
||||||
fileData.binaryFiles = reloadInfo.binaryFiles;
|
fileData.binaryFiles = reloadInput.binaryFiles;
|
||||||
futureInterface.reportResult(fileData);
|
futureInterface.reportResult(fileData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,50 +103,55 @@ class DiffFilesController : public DiffEditorController
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
DiffFilesController(IDocument *document);
|
DiffFilesController(IDocument *document);
|
||||||
~DiffFilesController() override { cancelReload(); }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual QList<ReloadInput> reloadInputList() const = 0;
|
virtual QList<ReloadInput> reloadInputList() const = 0;
|
||||||
|
|
||||||
private:
|
|
||||||
void reloaded();
|
|
||||||
void cancelReload();
|
|
||||||
|
|
||||||
QFutureWatcher<FileData> m_futureWatcher;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
DiffFilesController::DiffFilesController(IDocument *document)
|
DiffFilesController::DiffFilesController(IDocument *document)
|
||||||
: DiffEditorController(document)
|
: DiffEditorController(document)
|
||||||
{
|
{
|
||||||
connect(&m_futureWatcher, &QFutureWatcher<FileData>::finished,
|
setDisplayName(tr("Diff"));
|
||||||
this, &DiffFilesController::reloaded);
|
using namespace Tasking;
|
||||||
|
|
||||||
setReloader([this] {
|
const TreeStorage<QList<FileData>> storage;
|
||||||
cancelReload();
|
|
||||||
m_futureWatcher.setFuture(map(reloadInputList(),
|
|
||||||
DiffFile(ignoreWhitespace(), contextLineCount())));
|
|
||||||
|
|
||||||
Core::ProgressManager::addTask(m_futureWatcher.future(),
|
const auto setupTree = [this, storage](TaskTree &taskTree) {
|
||||||
tr("Calculating diff"), "DiffEditor");
|
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::reloaded()
|
const Group root = {
|
||||||
{
|
Storage(storage),
|
||||||
const bool success = !m_futureWatcher.future().isCanceled();
|
Tree(setupTree),
|
||||||
const QList<FileData> fileDataList = success
|
OnGroupDone(onTreeDone),
|
||||||
? m_futureWatcher.future().results() : QList<FileData>();
|
OnGroupError(onTreeError)
|
||||||
|
};
|
||||||
setDiffFiles(fileDataList);
|
setReloadRecipe(root);
|
||||||
reloadFinished(success);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DiffFilesController::cancelReload()
|
|
||||||
{
|
|
||||||
if (m_futureWatcher.future().isRunning()) {
|
|
||||||
m_futureWatcher.future().cancel();
|
|
||||||
m_futureWatcher.setFuture({});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class DiffCurrentFileController : public DiffFilesController
|
class DiffCurrentFileController : public DiffFilesController
|
||||||
|
Reference in New Issue
Block a user