summaryrefslogtreecommitdiff
path: root/src/plugins/diffeditor/differ.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2016-11-18 16:06:27 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2016-11-21 15:43:03 +0000
commit2144fb5949f5bc18f92c58217a422b0a3abd8463 (patch)
tree32a73adf9a2e9a2834811e90873c7a79073b9de3 /src/plugins/diffeditor/differ.cpp
parent6d1d1a4416fb0c4d13942a69eba1b00e6f043ff1 (diff)
downloadqt-creator-2144fb5949f5bc18f92c58217a422b0a3abd8463.tar.gz
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>
Diffstat (limited to 'src/plugins/diffeditor/differ.cpp')
-rw-r--r--src/plugins/diffeditor/differ.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/plugins/diffeditor/differ.cpp b/src/plugins/diffeditor/differ.cpp
index 97c69f7c5a..2ebdff108b 100644
--- a/src/plugins/diffeditor/differ.cpp
+++ b/src/plugins/diffeditor/differ.cpp
@@ -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