Move diff calculation to the separate thread

It doesn't freeze creator anymore.

Task-number: QTCREATORBUG-14255
Change-Id: I3d06ea7a848e321c6072e00a73b96e9ea9770b6a
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2016-11-18 16:06:27 +01:00
parent 6d1d1a4416
commit 2144fb5949
3 changed files with 176 additions and 82 deletions

View File

@@ -38,6 +38,7 @@ publication by Neil Fraser: http://neil.fraser.name/writing/diff/
#include <QMap>
#include <QPair>
#include <QCoreApplication>
#include <QFutureInterfaceBase>
namespace DiffEditor {
@@ -985,9 +986,10 @@ QString Diff::toString() const
///////////////
Differ::Differ()
Differ::Differ(QFutureInterfaceBase *jobController)
: m_diffMode(Differ::LineMode),
m_currentDiffMode(Differ::LineMode)
m_currentDiffMode(Differ::LineMode),
m_jobController(jobController)
{
}
@@ -1124,6 +1126,11 @@ QList<Diff> Differ::diffMyers(const QString &text1, const QString &text2)
int kMinReverse = -D;
int kMaxReverse = D;
for (int d = 0; d <= D; d++) {
if (m_jobController && m_jobController->isCanceled()) {
delete [] forwardV;
delete [] reverseV;
return QList<Diff>();
}
// going forward
for (int k = qMax(-d, kMinForward + qAbs(d + kMinForward) % 2);
k <= qMin(d, kMaxForward - qAbs(d + kMaxForward) % 2);
@@ -1237,7 +1244,18 @@ QList<Diff> Differ::diffNonCharMode(const QString &text1, const QString &text2)
QString lastDelete;
QString lastInsert;
QList<Diff> newDiffList;
if (m_jobController) {
m_jobController->setProgressRange(0, diffList.count());
m_jobController->setProgressValue(0);
}
for (int i = 0; i <= diffList.count(); i++) {
if (m_jobController) {
if (m_jobController->isCanceled()) {
m_currentDiffMode = diffMode;
return QList<Diff>();
}
m_jobController->setProgressValue(i + 1);
}
const Diff diffItem = i < diffList.count()
? diffList.at(i)
: Diff(Diff::Equal); // dummy, ensure we process to the end