DiffEditor: Don't use QFutureInterfaceBase::get()

It's available only since Qt 6.3.

Amends 5ff073df19

Change-Id: I38c8c3b0bc3c94612dee15614f00e83ebc86db04
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Jarek Kobus
2023-03-10 08:54:25 +01:00
parent 0613a492f3
commit 40b0f670e1
4 changed files with 51 additions and 57 deletions

View File

@@ -244,8 +244,8 @@ QString SideDiffEditorWidget::plainTextFromSelection(const QTextCursor &cursor)
return TextDocument::convertToPlainText(text);
}
SideBySideDiffOutput SideDiffData::diffOutput(QFutureInterfaceBase &fi, int progressMin,
int progressMax, const DiffEditorInput &input)
static SideBySideDiffOutput diffOutput(QPromise<SideBySideShowResults> &promise, int progressMin,
int progressMax, const DiffEditorInput &input)
{
SideBySideDiffOutput output;
@@ -365,8 +365,8 @@ SideBySideDiffOutput SideDiffData::diffOutput(QFutureInterfaceBase &fi, int prog
diffText[RightSide].replace('\r', ' ');
output.side[LeftSide].diffText += diffText[LeftSide];
output.side[RightSide].diffText += diffText[RightSide];
fi.setProgressValue(MathUtils::interpolateLinear(++i, 0, count, progressMin, progressMax));
if (fi.isCanceled())
promise.setProgressValue(MathUtils::interpolateLinear(++i, 0, count, progressMin, progressMax));
if (promise.isCanceled())
return {};
}
output.side[LeftSide].selections = SelectableTextEditorWidget::polishedSelections(
@@ -868,7 +868,7 @@ void SideBySideDiffEditorWidget::restoreState()
void SideBySideDiffEditorWidget::showDiff()
{
m_asyncTask.reset(new AsyncTask<ShowResults>());
m_asyncTask.reset(new AsyncTask<SideBySideShowResults>());
m_asyncTask->setFutureSynchronizer(DiffEditorPlugin::futureSynchronizer());
m_controller.setBusyShowing(true);
@@ -877,7 +877,7 @@ void SideBySideDiffEditorWidget::showDiff()
for (SideDiffEditorWidget *editor : m_editor)
editor->clearAll(Tr::tr("Retrieving data failed."));
} else {
const ShowResults results = m_asyncTask->result();
const SideBySideShowResults results = m_asyncTask->result();
m_editor[LeftSide]->setDiffData(results[LeftSide].diffData);
m_editor[RightSide]->setDiffData(results[RightSide].diffData);
TextDocumentPtr leftDoc(results[LeftSide].textDocument);
@@ -913,24 +913,23 @@ void SideBySideDiffEditorWidget::showDiff()
const DiffEditorInput input(&m_controller);
auto getDocument = [input](QPromise<ShowResults> &promise) {
auto getDocument = [input](QPromise<SideBySideShowResults> &promise) {
const int firstPartMax = 20; // diffOutput is about 4 times quicker than filling document
const int leftPartMax = 60;
const int rightPartMax = 100;
promise.setProgressRange(0, rightPartMax);
promise.setProgressValue(0);
QFutureInterfaceBase fi = QFutureInterfaceBase::get(promise.future());
const SideBySideDiffOutput output = SideDiffData::diffOutput(fi, 0, firstPartMax, input);
const SideBySideDiffOutput output = diffOutput(promise, 0, firstPartMax, input);
if (promise.isCanceled())
return;
const ShowResult leftResult{TextDocumentPtr(new TextDocument("DiffEditor.SideDiffEditor")),
const SideBySideShowResult leftResult{TextDocumentPtr(new TextDocument("DiffEditor.SideDiffEditor")),
output.side[LeftSide].diffData, output.side[LeftSide].selections};
const ShowResult rightResult{TextDocumentPtr(new TextDocument("DiffEditor.SideDiffEditor")),
const SideBySideShowResult rightResult{TextDocumentPtr(new TextDocument("DiffEditor.SideDiffEditor")),
output.side[RightSide].diffData, output.side[RightSide].selections};
const ShowResults result{leftResult, rightResult};
const SideBySideShowResults result{leftResult, rightResult};
auto propagateDocument = [&output, &promise](DiffSide side, const ShowResult &result,
auto propagateDocument = [&output, &promise](DiffSide side, const SideBySideShowResult &result,
int progressMin, int progressMax) {
// No need to store the change history
result.textDocument->document()->setUndoRedoEnabled(false);

View File

@@ -40,9 +40,6 @@ class SideBySideDiffOutput;
class SideDiffData
{
public:
static SideBySideDiffOutput diffOutput(QFutureInterfaceBase &fi, int progressMin,
int progressMax, const DiffEditorInput &input);
DiffChunkInfo m_chunkInfo;
// block number, fileInfo. Set for file lines only.
QMap<int, DiffFileInfo> m_fileInfo;
@@ -60,7 +57,6 @@ public:
int blockNumberForFileIndex(int fileIndex) const;
int fileIndexForBlockNumber(int blockNumber) const;
private:
void setLineNumber(int blockNumber, int lineNumber);
void setFileInfo(int blockNumber, const DiffFileInfo &fileInfo);
void setSkippedLines(int blockNumber, int skippedLines, const QString &contextInfo = {}) {
@@ -88,6 +84,16 @@ public:
QHash<int, int> foldingIndent;
};
class SideBySideShowResult
{
public:
QSharedPointer<TextEditor::TextDocument> textDocument{};
SideDiffData diffData;
DiffSelections selections;
};
using SideBySideShowResults = std::array<SideBySideShowResult, SideCount>;
class SideBySideDiffEditorWidget : public QWidget
{
Q_OBJECT
@@ -135,15 +141,7 @@ private:
bool m_horizontalSync = false;
struct ShowResult
{
QSharedPointer<TextEditor::TextDocument> textDocument{};
SideDiffData diffData;
DiffSelections selections;
};
using ShowResults = std::array<ShowResult, SideCount>;
std::unique_ptr<Utils::AsyncTask<ShowResults>> m_asyncTask;
std::unique_ptr<Utils::AsyncTask<SideBySideShowResults>> m_asyncTask;
};
} // namespace Internal

View File

@@ -65,6 +65,14 @@ DiffEditorDocument *UnifiedDiffEditorWidget::diffDocument() const
return m_controller.document();
}
void UnifiedDiffEditorWidget::setDiff(const QList<FileData> &diffFileList)
{
const GuardLocker locker(m_controller.m_ignoreChanges);
clear(Tr::tr("Waiting for data..."));
m_controller.m_contextFileData = diffFileList;
showDiff();
}
void UnifiedDiffEditorWidget::saveState()
{
if (!m_state.isNull())
@@ -257,14 +265,6 @@ void UnifiedDiffData::setLineNumber(DiffSide side, int blockNumber, int lineNumb
m_lineNumberDigits[side] = qMax(m_lineNumberDigits[side], lineNumberString.count());
}
void UnifiedDiffEditorWidget::setDiff(const QList<FileData> &diffFileList)
{
const GuardLocker locker(m_controller.m_ignoreChanges);
clear(Tr::tr("Waiting for data..."));
m_controller.m_contextFileData = diffFileList;
showDiff();
}
QString UnifiedDiffData::setChunk(const DiffEditorInput &input, const ChunkData &chunkData,
bool lastChunk, int *blockNumber, DiffSelections *selections)
{
@@ -388,8 +388,8 @@ QString UnifiedDiffData::setChunk(const DiffEditorInput &input, const ChunkData
return diffText;
}
UnifiedDiffOutput UnifiedDiffData::diffOutput(QFutureInterfaceBase &fi, int progressMin,
int progressMax, const DiffEditorInput &input)
static UnifiedDiffOutput diffOutput(QPromise<UnifiedShowResult> &promise, int progressMin,
int progressMax, const DiffEditorInput &input)
{
UnifiedDiffOutput output;
@@ -434,8 +434,8 @@ UnifiedDiffOutput UnifiedDiffData::diffOutput(QFutureInterfaceBase &fi, int prog
output.diffData.m_chunkInfo.setChunkIndex(oldBlock, blockNumber - oldBlock, j);
}
}
fi.setProgressValue(MathUtils::interpolateLinear(++i, 0, count, progressMin, progressMax));
if (fi.isCanceled())
promise.setProgressValue(MathUtils::interpolateLinear(++i, 0, count, progressMin, progressMax));
if (promise.isCanceled())
return {};
}
@@ -451,14 +451,14 @@ void UnifiedDiffEditorWidget::showDiff()
return;
}
m_asyncTask.reset(new AsyncTask<ShowResult>());
m_asyncTask.reset(new AsyncTask<UnifiedShowResult>());
m_asyncTask->setFutureSynchronizer(DiffEditorPlugin::futureSynchronizer());
m_controller.setBusyShowing(true);
connect(m_asyncTask.get(), &AsyncTaskBase::done, this, [this] {
if (m_asyncTask->isCanceled() || !m_asyncTask->isResultAvailable()) {
setPlainText(Tr::tr("Retrieving data failed."));
} else {
const ShowResult result = m_asyncTask->result();
const UnifiedShowResult result = m_asyncTask->result();
m_data = result.diffData;
TextDocumentPtr doc(result.textDocument);
{
@@ -478,17 +478,16 @@ void UnifiedDiffEditorWidget::showDiff()
const DiffEditorInput input(&m_controller);
auto getDocument = [input](QPromise<ShowResult> &promise) {
auto getDocument = [input](QPromise<UnifiedShowResult> &promise) {
const int progressMax = 100;
const int firstPartMax = 20; // diffOutput is about 4 times quicker than filling document
promise.setProgressRange(0, progressMax);
promise.setProgressValue(0);
QFutureInterfaceBase fi = QFutureInterfaceBase::get(promise.future());
const UnifiedDiffOutput output = UnifiedDiffData::diffOutput(fi, 0, firstPartMax, input);
const UnifiedDiffOutput output = diffOutput(promise, 0, firstPartMax, input);
if (promise.isCanceled())
return;
const ShowResult result = {TextDocumentPtr(new TextDocument("DiffEditor.UnifiedDiffEditor")),
const UnifiedShowResult result = {TextDocumentPtr(new TextDocument("DiffEditor.UnifiedDiffEditor")),
output.diffData, output.selections};
// No need to store the change history
result.textDocument->document()->setUndoRedoEnabled(false);

View File

@@ -33,9 +33,6 @@ class UnifiedDiffOutput;
class UnifiedDiffData
{
public:
static UnifiedDiffOutput diffOutput(QFutureInterfaceBase &fi, int progressMin, int progressMax,
const DiffEditorInput &input);
DiffChunkInfo m_chunkInfo;
// block number, visual line number.
QMap<int, DiffFileInfoArray> m_fileInfo;
@@ -47,10 +44,10 @@ public:
int blockNumberForFileIndex(int fileIndex) const;
int fileIndexForBlockNumber(int blockNumber) const;
private:
void setLineNumber(DiffSide side, int blockNumber, int lineNumber, int rowNumberInChunk);
QString setChunk(const DiffEditorInput &input, const ChunkData &chunkData,
bool lastChunk, int *blockNumber, DiffSelections *selections);
private:
void setLineNumber(DiffSide side, int blockNumber, int lineNumber, int rowNumberInChunk);
};
class UnifiedDiffOutput
@@ -65,6 +62,14 @@ public:
DiffSelections selections;
};
class UnifiedShowResult
{
public:
QSharedPointer<TextEditor::TextDocument> textDocument;
UnifiedDiffData diffData;
DiffSelections selections;
};
class UnifiedDiffEditorWidget final : public SelectableTextEditorWidget
{
Q_OBJECT
@@ -107,14 +112,7 @@ private:
DiffEditorWidgetController m_controller;
QByteArray m_state;
struct ShowResult
{
QSharedPointer<TextEditor::TextDocument> textDocument;
UnifiedDiffData diffData;
DiffSelections selections;
};
std::unique_ptr<Utils::AsyncTask<ShowResult>> m_asyncTask;
std::unique_ptr<Utils::AsyncTask<UnifiedShowResult>> m_asyncTask;
};
} // namespace Internal