File indexing completed on 2025-05-04 05:17:22
0001 /* 0002 Copyright (C) 2020 Hamed Masafi <hamed.masafi@gmail.com> 0003 SPDX-License-Identifier: GPL-3.0-or-later 0004 */ 0005 0006 #include "mergewindow.h" 0007 0008 #include "dialogs/mergecloseeventdialog.h" 0009 #include "dialogs/mergeopenfilesdialog.h" 0010 // #include "settings/settingsmanager.h" 0011 #include "core/editactionsmapper.h" 0012 #include "libkommitwidgets_appdebug.h" 0013 #include "widgets/codeeditor.h" 0014 #include "widgets/segmentsmapper.h" 0015 0016 #include <KActionCollection> 0017 #include <KLocalizedString> 0018 #include <KMessageBox> 0019 0020 #include "libkommitwidgets_appdebug.h" 0021 0022 #include <QFile> 0023 #include <QFileInfo> 0024 #include <QLabel> 0025 #include <QMenu> 0026 #include <QSettings> 0027 #include <QStatusBar> 0028 #include <QTextBlock> 0029 #include <QTextEdit> 0030 0031 bool isEmpty(const QStringList &list) 0032 { 0033 if (list.isEmpty()) 0034 return true; 0035 0036 for (const auto &s : list) 0037 if (!s.trimmed().isEmpty()) 0038 return false; 0039 return true; 0040 } 0041 void compare(QTextEdit *e1, QTextEdit *e2) 0042 { 0043 auto m = qMin(e1->document()->blockCount(), e2->document()->blockCount()); 0044 for (int i = 0; i < m; ++i) { 0045 auto block1 = e1->document()->findBlock(i); 0046 auto block2 = e2->document()->findBlock(i); 0047 if (block1.text() != block2.text()) { 0048 // block1.blockFormat() 0049 } 0050 } 0051 } 0052 QString readFile(const QString &filePath) 0053 { 0054 QFile f{filePath}; 0055 if (!f.open(QIODevice::ReadOnly)) 0056 return {}; 0057 0058 const auto buf = QString(f.readAll()); 0059 f.close(); 0060 return buf; 0061 } 0062 0063 MergeWindow::MergeWindow(Git::Manager *git, Mode mode, QWidget *parent) 0064 : AppMainWindow(parent) 0065 , mGit(git) 0066 { 0067 Q_UNUSED(mode) 0068 auto w = new QWidget(this); 0069 m_ui.setupUi(w); 0070 setCentralWidget(w); 0071 0072 initActions(); 0073 init(); 0074 0075 QSettings s; 0076 s.beginGroup(QStringLiteral("MergeWindow")); 0077 if (s.value(QStringLiteral("actionType"), QStringLiteral("file")).toString() == QStringLiteral("file")) 0078 actionViewFiles_clicked(); 0079 else 0080 actionViewBlocks_clicked(); 0081 } 0082 0083 MergeWindow::~MergeWindow() 0084 { 0085 QSettings s; 0086 s.beginGroup(QStringLiteral("MergeWindow")); 0087 s.setValue(QStringLiteral("actionType"), mActionFilesView->isChecked() ? QStringLiteral("file") : QStringLiteral("block")); 0088 s.sync(); 0089 } 0090 0091 void MergeWindow::init() 0092 { 0093 auto mapper = new EditActionsMapper; 0094 mapper->init(actionCollection()); 0095 0096 mapper->addTextEdit(m_ui.plainTextEditMine); 0097 mapper->addTextEdit(m_ui.plainTextEditTheir); 0098 mapper->addTextEdit(m_ui.plainTextEditResult); 0099 0100 mMapper = new SegmentsMapper; 0101 0102 mMapper->addEditor(m_ui.plainTextEditBase); 0103 mMapper->addEditor(m_ui.plainTextEditMine); 0104 mMapper->addEditor(m_ui.plainTextEditTheir); 0105 mMapper->addEditor(m_ui.plainTextEditResult); 0106 0107 m_ui.plainTextEditMine->setContextMenuPolicy(Qt::CustomContextMenu); 0108 m_ui.plainTextEditTheir->setContextMenuPolicy(Qt::CustomContextMenu); 0109 0110 connect(m_ui.plainTextEditMine, &CodeEditor::customContextMenuRequested, this, &MergeWindow::codeEditors_customContextMenuRequested); 0111 connect(m_ui.plainTextEditTheir, &CodeEditor::customContextMenuRequested, this, &MergeWindow::codeEditors_customContextMenuRequested); 0112 // TODO: check these dulicated lines 0113 connect(m_ui.plainTextEditResult, &CodeEditor::blockSelected, this, &MergeWindow::slotPlainTextEditResultBlockSelected); 0114 connect(m_ui.plainTextEditResult, &CodeEditor::blockSelected, this, &MergeWindow::slotPlainTextEditResultBlockSelected); 0115 connect(m_ui.plainTextEditResult, &CodeEditor::blockSelected, this, &MergeWindow::slotPlainTextEditResultBlockSelected); 0116 connect(m_ui.plainTextEditResult, &CodeEditor::blockSelected, this, &MergeWindow::slotPlainTextEditResultBlockSelected); 0117 connect(m_ui.plainTextEditResult, &CodeEditor::textChanged, this, &MergeWindow::slotPlainTextEditResultTextChanged); 0118 connect(m_ui.plainTextEditResult, &CodeEditor::blockSelected, this, &MergeWindow::slotPlainTextEditResultBlockSelected); 0119 0120 mConflictsLabel = new QLabel(this); 0121 statusBar()->addPermanentWidget(mConflictsLabel); 0122 0123 actionViewBlocks_clicked(); 0124 0125 setupGUI(Default, QStringLiteral("kommitmergeui.rc")); 0126 } 0127 0128 void MergeWindow::fillSegments() 0129 { 0130 m_ui.plainTextEditMine->clearAll(); 0131 m_ui.plainTextEditBase->clearAll(); 0132 m_ui.plainTextEditTheir->clearAll(); 0133 for (const auto &d : std::as_const(mDiffs)) { 0134 auto blockSize = actionViewSameSizeBlocks->isChecked() ? qMax(d->base.size(), qMax(d->remote.size(), d->local.size())) : -1; 0135 0136 switch (d->type) { 0137 case Diff::SegmentType::SameOnBoth: { 0138 m_ui.plainTextEditMine->append(d->base, CodeEditor::Unchanged, d, blockSize); 0139 m_ui.plainTextEditTheir->append(d->base, CodeEditor::Unchanged, d, blockSize); 0140 m_ui.plainTextEditBase->append(d->base, CodeEditor::Unchanged, d, blockSize); 0141 d->mergeType = Diff::KeepLocal; 0142 break; 0143 } 0144 0145 case Diff::SegmentType::OnlyOnRight: 0146 m_ui.plainTextEditMine->append(d->local, CodeEditor::Removed, d, blockSize); 0147 m_ui.plainTextEditTheir->append(d->remote, CodeEditor::Added, d, blockSize); 0148 m_ui.plainTextEditBase->append(d->base, CodeEditor::Edited, d, blockSize); 0149 d->mergeType = Diff::KeepRemote; 0150 break; 0151 case Diff::SegmentType::OnlyOnLeft: 0152 m_ui.plainTextEditMine->append(d->local, CodeEditor::Added, d, blockSize); 0153 m_ui.plainTextEditTheir->append(d->remote, CodeEditor::Removed, d, blockSize); 0154 m_ui.plainTextEditBase->append(d->base, CodeEditor::Edited, d, blockSize); 0155 d->mergeType = Diff::KeepLocal; 0156 break; 0157 0158 case Diff::SegmentType::DifferentOnBoth: 0159 if (isEmpty(d->local)) { 0160 m_ui.plainTextEditMine->append(d->local, CodeEditor::Edited, d, blockSize); 0161 m_ui.plainTextEditTheir->append(d->remote, CodeEditor::Added, d, blockSize); 0162 // d->mergeType = Diff::KeepRemote; 0163 } else if (isEmpty(d->remote)) { 0164 m_ui.plainTextEditMine->append(d->local, CodeEditor::Added, d, blockSize); 0165 m_ui.plainTextEditTheir->append(d->remote, CodeEditor::Edited, d, blockSize); 0166 // d->mergeType = Diff::KeepLocal; 0167 } else { 0168 m_ui.plainTextEditMine->append(d->local, CodeEditor::Edited, d, blockSize); 0169 m_ui.plainTextEditTheir->append(d->remote, CodeEditor::Edited, d, blockSize); 0170 } 0171 m_ui.plainTextEditBase->append(d->base, CodeEditor::Edited, d, blockSize); 0172 d->mergeType = Diff::None; 0173 break; 0174 } 0175 } 0176 } 0177 0178 void MergeWindow::load() 0179 { 0180 m_ui.plainTextEditMine->clear(); 0181 m_ui.plainTextEditTheir->clear(); 0182 m_ui.plainTextEditResult->clear(); 0183 m_ui.plainTextEditBase->clear(); 0184 0185 auto baseList = readFile(mFilePathBase); 0186 auto localList = readFile(mFilePathLocal); 0187 auto remoteList = readFile(mFilePathRemote); 0188 0189 m_ui.plainTextEditBase->setHighlighting(mFilePathBase); 0190 m_ui.plainTextEditMine->setHighlighting(mFilePathLocal); 0191 m_ui.plainTextEditTheir->setHighlighting(mFilePathRemote); 0192 m_ui.plainTextEditResult->setHighlighting(mFilePathResult); 0193 m_ui.codeEditorMyBlock->setHighlighting(mFilePathLocal); 0194 m_ui.codeEditorTheirBlock->setHighlighting(mFilePathRemote); 0195 0196 auto result = Diff::diff3(baseList, localList, remoteList); 0197 mDiffs = result.segments; 0198 mMapper->setSegments(mDiffs); 0199 0200 fillSegments(); 0201 updateResult(); 0202 0203 QFileInfo fi; 0204 if (mFilePathResult.isEmpty()) 0205 fi.setFile(mFilePathBase); 0206 else 0207 fi.setFile(mFilePathResult); 0208 0209 setWindowTitle(fi.fileName() + QStringLiteral("[*]")); 0210 setWindowModified(true); 0211 0212 actionKeepMine->setEnabled(true); 0213 actionKeepTheir->setEnabled(true); 0214 actionKeepMineBeforeTheir->setEnabled(true); 0215 actionKeepTheirBeforeMine->setEnabled(true); 0216 actionKeepMyFile->setEnabled(true); 0217 actionKeepTheirFile->setEnabled(true); 0218 actionGotoPrevDiff->setEnabled(true); 0219 actionGotoNextDiff->setEnabled(true); 0220 } 0221 0222 void MergeWindow::updateResult() 0223 { 0224 m_ui.plainTextEditResult->clearAll(); 0225 for (const auto &d : std::as_const(mDiffs)) { 0226 auto blockSize = actionViewSameSizeBlocks->isChecked() ? qMax(d->base.size(), qMax(d->remote.size(), d->local.size())) : -1; 0227 0228 if (d->type == Diff::SegmentType::SameOnBoth) { 0229 m_ui.plainTextEditResult->append(d->base, CodeEditor::Unchanged, d, blockSize); 0230 continue; 0231 } 0232 switch (d->mergeType) { 0233 case Diff::None: { 0234 switch (d->type) { 0235 case Diff::SegmentType::SameOnBoth: 0236 m_ui.plainTextEditResult->append(d->base, CodeEditor::Unchanged, d, blockSize); 0237 break; 0238 0239 case Diff::SegmentType::OnlyOnRight: 0240 m_ui.plainTextEditResult->append(d->remote, CodeEditor::Added, d, blockSize); 0241 break; 0242 0243 case Diff::SegmentType::OnlyOnLeft: 0244 m_ui.plainTextEditResult->append(d->local, CodeEditor::Added, d, blockSize); 0245 break; 0246 0247 case Diff::SegmentType::DifferentOnBoth: 0248 if (d->local == d->remote) 0249 m_ui.plainTextEditResult->append(d->remote, CodeEditor::Added, d, blockSize); // Not changed 0250 else if (isEmpty(d->local)) 0251 m_ui.plainTextEditResult->append(d->remote, CodeEditor::Added, d, blockSize); 0252 else if (isEmpty(d->remote)) 0253 m_ui.plainTextEditResult->append(d->local, CodeEditor::Added, d, blockSize); 0254 else 0255 m_ui.plainTextEditResult->append(QStringLiteral(" "), CodeEditor::Removed, d); 0256 break; 0257 } 0258 break; 0259 } 0260 0261 case Diff::KeepLocal: 0262 m_ui.plainTextEditResult->append(d->local, CodeEditor::Edited, d, blockSize); 0263 break; 0264 0265 case Diff::KeepRemote: 0266 m_ui.plainTextEditResult->append(d->remote, CodeEditor::Edited, d, blockSize); 0267 break; 0268 0269 case Diff::KeepLocalThenRemote: 0270 m_ui.plainTextEditResult->append(d->local, CodeEditor::Edited, d, blockSize); 0271 m_ui.plainTextEditResult->append(d->remote, CodeEditor::Edited, d, blockSize); 0272 break; 0273 0274 case Diff::KeepRemoteThenLocal: 0275 m_ui.plainTextEditResult->append(d->remote, CodeEditor::Edited, d, blockSize); 0276 m_ui.plainTextEditResult->append(d->local, CodeEditor::Edited, d, blockSize); 0277 break; 0278 0279 default: 0280 m_ui.plainTextEditResult->append(QStringLiteral("***"), CodeEditor::Edited, d); 0281 break; 0282 } 0283 } 0284 mConflictsLabel->setText(i18n("Conflicts: %1", mMapper->conflicts())); 0285 } 0286 0287 void MergeWindow::initActions() 0288 { 0289 KActionCollection *actionCollection = this->actionCollection(); 0290 0291 actionKeepMine = actionCollection->addAction(QStringLiteral("keep_mine"), this, &MergeWindow::actionKeepMine_clicked); 0292 actionKeepMine->setText(i18n("Keep mine")); 0293 actionKeepMine->setIcon(QIcon::fromTheme(QStringLiteral("diff-keep-mine"))); 0294 actionCollection->setDefaultShortcut(actionKeepMine, QKeySequence(Qt::CTRL | Qt::Key_L)); 0295 0296 actionKeepTheir = actionCollection->addAction(QStringLiteral("keep_their"), this, &MergeWindow::actionKeepTheir_clicked); 0297 actionKeepTheir->setText(i18n("Keep their")); 0298 actionKeepTheir->setIcon(QIcon::fromTheme(QStringLiteral("diff-keep-their"))); 0299 actionCollection->setDefaultShortcut(actionKeepTheir, QKeySequence(Qt::CTRL | Qt::Key_R)); 0300 0301 actionKeepMineBeforeTheir = actionCollection->addAction(QStringLiteral("keep_mine_before_their"), this, &MergeWindow::actionKeepMineBeforeTheir_clicked); 0302 0303 actionKeepMineBeforeTheir->setText(i18n("Keep mine before their")); 0304 actionKeepMineBeforeTheir->setIcon(QIcon::fromTheme(QStringLiteral("diff-keep-mine-before-their"))); 0305 actionCollection->setDefaultShortcut(actionKeepMineBeforeTheir, QKeySequence(Qt::CTRL | Qt::Key_L | Qt::SHIFT)); 0306 0307 actionKeepTheirBeforeMine = actionCollection->addAction(QStringLiteral("keep_their_before_mine"), this, &MergeWindow::actionKeepTheirBeforeMine_clicked); 0308 actionKeepTheirBeforeMine->setText(i18n("Keep their before mine")); 0309 actionKeepTheirBeforeMine->setIcon(QIcon::fromTheme(QStringLiteral("diff-keep-their-before-mine"))); 0310 actionCollection->setDefaultShortcut(actionKeepTheirBeforeMine, QKeySequence(Qt::CTRL | Qt::Key_R | Qt::SHIFT)); 0311 0312 actionKeepMyFile = actionCollection->addAction(QStringLiteral("keep_my_file"), this, &MergeWindow::actionKeepMyFile_clicked); 0313 actionKeepMyFile->setText(i18n("Keep my file")); 0314 actionKeepMyFile->setIcon(QIcon::fromTheme(QStringLiteral("diff-keep-mine-file"))); 0315 actionCollection->setDefaultShortcut(actionKeepMyFile, QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_L)); 0316 0317 actionKeepTheirFile = actionCollection->addAction(QStringLiteral("keep_their_file"), this, &MergeWindow::actionKeepTheirFile_clicked); 0318 actionKeepTheirFile->setText(i18n("Keep their file")); 0319 actionKeepTheirFile->setIcon(QIcon::fromTheme(QStringLiteral("diff-keep-their-file"))); 0320 actionCollection->setDefaultShortcut(actionKeepTheirFile, QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_R)); 0321 0322 mActionBlocksView = actionCollection->addAction(QStringLiteral("view_blocks"), this, &MergeWindow::actionViewBlocks_clicked); 0323 mActionBlocksView->setText(i18n("Blocks")); 0324 mActionBlocksView->setCheckable(true); 0325 0326 mActionFilesView = actionCollection->addAction(QStringLiteral("view_files"), this, &MergeWindow::actionViewFiles_clicked); 0327 mActionFilesView->setText(i18n("Files")); 0328 mActionFilesView->setCheckable(true); 0329 0330 actionGotoPrevDiff = actionCollection->addAction(QStringLiteral("goto_prev_diff"), this, &MergeWindow::actionGotoPrevDiff_clicked); 0331 actionGotoPrevDiff->setText(i18n("Previous diff")); 0332 actionGotoPrevDiff->setIcon(QIcon::fromTheme(QStringLiteral("diff-goto-prev-diff"))); 0333 actionGotoPrevDiff->setEnabled(false); 0334 actionCollection->setDefaultShortcut(actionGotoPrevDiff, QKeySequence(Qt::Key_PageUp)); 0335 0336 actionGotoNextDiff = actionCollection->addAction(QStringLiteral("goto_next_diff"), this, &MergeWindow::actionGotoNextDiff_clicked); 0337 actionGotoNextDiff->setText(i18n("Next diff")); 0338 actionGotoNextDiff->setIcon(QIcon::fromTheme(QStringLiteral("diff-goto-next-diff"))); 0339 actionCollection->setDefaultShortcut(actionGotoNextDiff, QKeySequence(Qt::Key_PageDown)); 0340 0341 actionViewSameSizeBlocks = actionCollection->addAction(QStringLiteral("view_same_size_blocks"), this, &MergeWindow::fillSegments); 0342 actionViewSameSizeBlocks->setText(i18n("Same size blocks")); 0343 actionViewSameSizeBlocks->setCheckable(true); 0344 actionViewSameSizeBlocks->setChecked(true); 0345 0346 KStandardAction::open(this, &MergeWindow::fileOpen, actionCollection); 0347 KStandardAction::save(this, &MergeWindow::fileSave, actionCollection); 0348 KStandardAction::quit(this, &MergeWindow::close, actionCollection); 0349 0350 #ifdef UNDEF 0351 auto settingsManager = new SettingsManager(mGit, this); 0352 KStandardAction::preferences(settingsManager, &SettingsManager::show, actionCollection); 0353 #endif 0354 0355 mCodeEditorContextMenu = new QMenu(this); 0356 mCodeEditorContextMenu->addActions({actionKeepMine, actionKeepTheir}); 0357 mCodeEditorContextMenu->addSeparator(); 0358 mCodeEditorContextMenu->addActions({actionKeepMineBeforeTheir, actionKeepTheirBeforeMine}); 0359 mCodeEditorContextMenu->addSeparator(); 0360 mCodeEditorContextMenu->addActions({actionKeepMyFile, actionKeepTheirFile}); 0361 0362 actionKeepMine->setEnabled(false); 0363 actionKeepTheir->setEnabled(false); 0364 actionKeepMineBeforeTheir->setEnabled(false); 0365 actionKeepTheirBeforeMine->setEnabled(false); 0366 actionKeepMyFile->setEnabled(false); 0367 actionKeepTheirFile->setEnabled(false); 0368 actionGotoPrevDiff->setEnabled(false); 0369 actionGotoNextDiff->setEnabled(false); 0370 } 0371 0372 void MergeWindow::doMergeAction(Diff::MergeType type) 0373 { 0374 auto s = mMapper->currentSegment(); 0375 0376 if (!s) 0377 return; 0378 0379 if (s->type == Diff::SegmentType::SameOnBoth) 0380 return; 0381 0382 auto ss = static_cast<Diff::MergeSegment *>(s); 0383 ss->mergeType = type; 0384 updateResult(); 0385 // m_ui.plainTextEditResult->highlightSegment(s); 0386 0387 mMapper->setCurrentSegment(s); 0388 0389 setWindowModified(true); 0390 } 0391 0392 bool MergeWindow::isFullyResolved() const 0393 { 0394 for (const auto &d : std::as_const(mDiffs)) 0395 if (d->mergeType == Diff::None && d->type == Diff::SegmentType::DifferentOnBoth) 0396 return false; 0397 return true; 0398 } 0399 0400 void MergeWindow::closeEvent(QCloseEvent *event) 0401 { 0402 if (isWindowModified()) { 0403 MergeCloseEventDialog d(this); 0404 auto r = d.exec(); 0405 0406 switch (r) { 0407 case MergeCloseEventDialog::MarkAsResolved: 0408 fileSave(); 0409 accept(); 0410 break; 0411 case MergeCloseEventDialog::LeaveAsIs: 0412 reject(); 0413 break; 0414 case MergeCloseEventDialog::DontExit: 0415 event->ignore(); 0416 break; 0417 } 0418 } 0419 accept(); 0420 } 0421 0422 const QString &MergeWindow::filePathResult() const 0423 { 0424 return mFilePathResult; 0425 } 0426 0427 void MergeWindow::setFilePathResult(const QString &newFilePathResult) 0428 { 0429 mFilePathResult = newFilePathResult; 0430 } 0431 0432 void MergeWindow::fileSave() 0433 { 0434 QFile f(mFilePathResult); 0435 if (!f.open(QIODevice::Text | QIODevice::WriteOnly)) { 0436 KMessageBox::information(this, i18n("Unable to open the file") + mFilePathResult); 0437 return; 0438 } 0439 f.write(m_ui.plainTextEditResult->toPlainText().toUtf8()); 0440 f.close(); 0441 setWindowModified(false); 0442 } 0443 0444 void MergeWindow::fileOpen() 0445 { 0446 MergeOpenFilesDialog d; 0447 if (d.exec() == QDialog::Accepted) { 0448 setFilePathBase(d.filePathBase()); 0449 setFilePathLocal(d.filePathLocal()); 0450 setFilePathRemote(d.filePathRemote()); 0451 load(); 0452 } 0453 } 0454 0455 void MergeWindow::actionKeepMine_clicked() 0456 { 0457 doMergeAction(Diff::MergeType::KeepLocal); 0458 } 0459 0460 void MergeWindow::actionKeepTheir_clicked() 0461 { 0462 doMergeAction(Diff::MergeType::KeepRemote); 0463 } 0464 0465 void MergeWindow::actionKeepMineBeforeTheir_clicked() 0466 { 0467 doMergeAction(Diff::MergeType::KeepLocalThenRemote); 0468 } 0469 0470 void MergeWindow::actionKeepTheirBeforeMine_clicked() 0471 { 0472 doMergeAction(Diff::MergeType::KeepRemoteThenLocal); 0473 } 0474 0475 void MergeWindow::actionKeepMyFile_clicked() 0476 { 0477 m_ui.plainTextEditResult->setPlainText(m_ui.plainTextEditMine->toPlainText()); 0478 } 0479 0480 void MergeWindow::actionKeepTheirFile_clicked() 0481 { 0482 m_ui.plainTextEditResult->setPlainText(m_ui.plainTextEditTheir->toPlainText()); 0483 } 0484 0485 void MergeWindow::actionGotoPrevDiff_clicked() 0486 { 0487 mMapper->findPrevious(Diff::SegmentType::DifferentOnBoth); 0488 slotPlainTextEditResultBlockSelected(); 0489 } 0490 0491 void MergeWindow::actionGotoNextDiff_clicked() 0492 { 0493 mMapper->findNext(Diff::SegmentType::DifferentOnBoth); 0494 slotPlainTextEditResultBlockSelected(); 0495 } 0496 0497 void MergeWindow::actionViewFiles_clicked() 0498 { 0499 mActionBlocksView->setChecked(false); 0500 mActionFilesView->setChecked(true); 0501 m_ui.widgetBlockView->hide(); 0502 m_ui.widgetCodeView->show(); 0503 } 0504 0505 void MergeWindow::actionViewBlocks_clicked() 0506 { 0507 mActionBlocksView->setChecked(true); 0508 mActionFilesView->setChecked(false); 0509 m_ui.widgetBlockView->show(); 0510 m_ui.widgetCodeView->hide(); 0511 } 0512 0513 void MergeWindow::codeEditors_customContextMenuRequested(QPoint pos) 0514 { 0515 Q_UNUSED(pos) 0516 mCodeEditorContextMenu->popup(QCursor::pos()); 0517 } 0518 0519 const QString &MergeWindow::filePathBase() const 0520 { 0521 return mFilePathBase; 0522 } 0523 0524 void MergeWindow::setFilePathBase(const QString &newFilePathBase) 0525 { 0526 mFilePathBase = newFilePathBase; 0527 } 0528 0529 const QString &MergeWindow::filePathRemote() const 0530 { 0531 return mFilePathRemote; 0532 } 0533 0534 void MergeWindow::setFilePathRemote(const QString &newFilePathRemote) 0535 { 0536 mFilePathRemote = newFilePathRemote; 0537 } 0538 0539 const QString &MergeWindow::filePathLocal() const 0540 { 0541 return mFilePathLocal; 0542 } 0543 0544 void MergeWindow::setFilePathLocal(const QString &newFilePathLocal) 0545 { 0546 mFilePathLocal = newFilePathLocal; 0547 } 0548 0549 void MergeWindow::slotPlainTextEditResultTextChanged() 0550 { 0551 qCDebug(KOMMIT_WIDGETS_LOG()) << "**********************"; 0552 // auto segment = static_cast<Diff::MergeSegment *>(_mapper->currentSegment()); 0553 // if (segment) { 0554 // segment->mergeType = Diff::MergeCustom; 0555 // } 0556 } 0557 0558 void MergeWindow::slotPlainTextEditResultBlockSelected() 0559 { 0560 auto segment = static_cast<Diff::MergeSegment *>(m_ui.plainTextEditResult->currentSegment()); 0561 0562 if (!segment) 0563 return; 0564 if (segment->type == Diff::SegmentType::DifferentOnBoth) { 0565 m_ui.codeEditorMyBlock->setPlainText(segment->local.join(QStringLiteral("\n"))); 0566 m_ui.codeEditorTheirBlock->setPlainText(segment->remote.join(QStringLiteral("\n"))); 0567 } else { 0568 m_ui.codeEditorMyBlock->clear(); 0569 m_ui.codeEditorTheirBlock->clear(); 0570 } 0571 } 0572 0573 #include "moc_mergewindow.cpp"