# # # patch "src/view/dialogs/FileDiff.cpp" # from [1fa30bddffcd068da2466e07d76819cb0adf45f9] # to [ed56459e0216187f0d07f2107a166f59659b58df] # # patch "src/view/dialogs/FileDiff.h" # from [752ff0409384d3e4220754274ea638604e4a278d] # to [dbb985d3ede28d6077676ddd35927bdfb03347cc] # ============================================================ --- src/view/dialogs/FileDiff.cpp 1fa30bddffcd068da2466e07d76819cb0adf45f9 +++ src/view/dialogs/FileDiff.cpp ed56459e0216187f0d07f2107a166f59659b58df @@ -77,12 +77,12 @@ FileDiff::FileDiff(QWidget * parent) connect( fileModel, SIGNAL(fileRead()), - this, SLOT(applyDiff()) + this, SLOT(fileRead()) ); connect( diffModel, SIGNAL(diffRead()), - this, SLOT(applyDiff()) + this, SLOT(diffRead()) ); ByteArrayList codecNamesAndAliases = QTextCodec::availableCodecs(); @@ -113,8 +113,7 @@ void FileDiff::forDatabase(const Databas const QString & base, const QString & target) { fileName = file; - loaded = false; - workspace = QString(); + database = db; QString encoding = "UTF-8"; if (!MonotoneUtil::getAttribute(db, base, file, "guitone:file-encoding", @@ -122,11 +121,21 @@ void FileDiff::forDatabase(const Databas { L(QString("could not query file encoding of %1, using default").arg(file)); } + + disconnect( + textEncoding, SIGNAL(currentIndexChanged(const QString &)), + this, SLOT(switchOutputEncoding(const QString &)) + ); + textEncoding->setCurrentIndex(textEncoding->findText(encoding)); + connect( + textEncoding, SIGNAL(currentIndexChanged(const QString &)), + this, SLOT(switchOutputEncoding(const QString &)) + ); + setWindowTitle(tr("Loading file differences")); - fileModel->readFileByName(db, fileName, base, encoding); diffModel->readDatabaseDiff(db, fileName, base, target, encoding); } @@ -134,7 +143,6 @@ void FileDiff::forWorkspace(const Worksp const QString & base, const QString & target) { fileName = file; - loaded = false; workspace = ws; QString encoding = "UTF-8"; @@ -148,20 +156,21 @@ void FileDiff::forWorkspace(const Worksp { encoding = attrval.first; } + + disconnect( + textEncoding, SIGNAL(currentIndexChanged(const QString &)), + this, SLOT(switchOutputEncoding(const QString &)) + ); + textEncoding->setCurrentIndex(textEncoding->findText(encoding)); + connect( + textEncoding, SIGNAL(currentIndexChanged(const QString &)), + this, SLOT(switchOutputEncoding(const QString &)) + ); + setWindowTitle(tr("Loading file differences")); - DatabaseFile db = MonotoneUtil::getDatabaseFile(ws); - if (base.isEmpty()) - { - QString workspaceParent = MonotoneUtil::getBaseWorkspaceRevision(ws); - fileModel->readFileByName(db, fileName, workspaceParent, encoding); - diffModel->readWorkspaceDiff(ws, fileName, workspaceParent, target, encoding); - return; - } - - fileModel->readFileByName(db, fileName, base, encoding); diffModel->readWorkspaceDiff(ws, fileName, base, target, encoding); } @@ -172,14 +181,49 @@ FileDiff::~FileDiff() if (diffModel) delete diffModel; } -void FileDiff::applyDiff() +void FileDiff::diffRead() { - if (!loaded) + QString base = diffModel->getBase(); + if (base.isEmpty()) { - loaded = true; - return; + I(!workspace.isEmpty()); + base = MonotoneUtil::getBaseWorkspaceRevision(workspace); } + if (database.isEmpty()) + { + I(!workspace.isEmpty()); + database = MonotoneUtil::getDatabaseFile(workspace); + } + + fileModel->readFileByName(database, fileName, base, textEncoding->currentText()); +} + +void FileDiff::fileRead() +{ + setWindowTitle(tr("File differences of \"%1\"").arg(fileName)); + + QString left = tr("workspace parent"), right = tr("workspace revision"); + QString base = diffModel->getBase(), target = diffModel->getTarget(); + + if (!base.isEmpty()) + { + left = base.left(12).append("..."); + } + + if (!target.isEmpty()) + { + right = target.left(12).append("..."); + } + + firstRevision->setText(tr("only left (%1)").arg(left)); + secondRevision->setText(tr("only right (%1)").arg(right)); + + applyDiff(); +} + +void FileDiff::applyDiff() +{ Diff * diff = diffModel->getDiff(fileName); if (diff == 0) { @@ -205,24 +249,6 @@ void FileDiff::applyDiff() return; } - setWindowTitle(tr("File differences of \"%1\"").arg(fileName)); - - QString left = tr("workspace parent"), right = tr("workspace revision"); - QString base = diffModel->getBase(), target = diffModel->getTarget(); - - if (!base.isEmpty()) - { - left = base.left(12).append("..."); - } - - if (!target.isEmpty()) - { - right = target.left(12).append("..."); - } - - firstRevision->setText(tr("only left (%1)").arg(left)); - secondRevision->setText(tr("only right (%1)").arg(right)); - fileModel->applyDiff(diff); diffStatusView->update(); } @@ -300,9 +326,6 @@ void FileDiff::switchOutputEncoding(cons void FileDiff::switchOutputEncoding(const QString & encoding) { - // if we're not yet fully loaded the models, don't do anything - if (!loaded) return; - fileModel->switchOutputEncoding(encoding); diffModel->switchOutputEncoding(encoding); ============================================================ --- src/view/dialogs/FileDiff.h 752ff0409384d3e4220754274ea638604e4a278d +++ src/view/dialogs/FileDiff.h dbb985d3ede28d6077676ddd35927bdfb03347cc @@ -36,6 +36,8 @@ private slots: void forWorkspace(const WorkspacePath &, const QString &, const QString &, const QString &); private slots: + void diffRead(); + void fileRead(); void applyDiff(); void versionToggled(); void scrollToGroup(bool); @@ -51,7 +53,7 @@ private: QModelIndex currentIndex; QString fileName; WorkspacePath workspace; - bool loaded; + DatabaseFile database; }; #endif