forked from qt-creator/qt-creator
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:
@@ -244,8 +244,8 @@ 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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,8 +388,8 @@ 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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user