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

View File

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

View File

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

View File

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