1 | #include "PrChangeListItem.h" |
2 | |
3 | #include <DiffHelper.h> |
4 | #include <FileDiffView.h> |
5 | #include <LineNumberArea.h> |
6 | #include <AddCodeReviewDialog.h> |
7 | |
8 | #include <QGridLayout> |
9 | #include <QLabel> |
10 | |
11 | using namespace DiffHelper; |
12 | |
13 | PrChangeListItem::PrChangeListItem(DiffChange change, QWidget *parent) |
14 | : QFrame(parent) |
15 | , mNewFileStartingLine(change.newFileStartLine) |
16 | , mOldFileName(change.oldFileName) |
17 | , mNewFileName(change.newFileName) |
18 | { |
19 | setObjectName("PrChangeListItem" ); |
20 | |
21 | DiffHelper::processDiff(change.content, change.newData, change.oldData); |
22 | |
23 | const auto fileName = change.oldFileName == change.newFileName |
24 | ? change.newFileName |
25 | : QString("%1 -> %2" ).arg(change.oldFileName, change.newFileName); |
26 | |
27 | const auto fileNameLabel = new QLabel(fileName); |
28 | fileNameLabel->setObjectName("ChangeFileName" ); |
29 | |
30 | const auto = new QVBoxLayout(); |
31 | headerLayout->setContentsMargins(QMargins()); |
32 | headerLayout->addWidget(fileNameLabel); |
33 | |
34 | const auto = new QFrame(); |
35 | headerFrame->setObjectName("ChangeHeaderFrame" ); |
36 | headerFrame->setLayout(headerLayout); |
37 | |
38 | const auto mainLayout = new QVBoxLayout(this); |
39 | mainLayout->setContentsMargins(QMargins()); |
40 | mainLayout->setSpacing(0); |
41 | mainLayout->addWidget(headerFrame); |
42 | |
43 | if (!change.header.isEmpty()) |
44 | { |
45 | const auto = new QLabel(change.header); |
46 | headerLabel->setObjectName("ChangeHeader" ); |
47 | headerLayout->addWidget(headerLabel); |
48 | |
49 | mNewFileEndingLine = mNewFileStartingLine + change.newData.first.count(); |
50 | |
51 | const auto oldFile = new FileDiffView(); |
52 | const auto numberArea = new LineNumberArea(oldFile, true); |
53 | numberArea->setObjectName("LineNumberArea" ); |
54 | numberArea->setEditor(oldFile); |
55 | connect(numberArea, &LineNumberArea::addComment, this, &PrChangeListItem::openReviewDialog); |
56 | |
57 | oldFile->setStartingLine(change.oldFileStartLine - 1); |
58 | oldFile->loadDiff(change.oldData.first.join("\n" ).trimmed(), change.oldData.second); |
59 | oldFile->addNumberArea(numberArea); |
60 | oldFile->setMinimumWidth(590); |
61 | oldFile->show(); |
62 | oldFile->setMinimumHeight(oldFile->getHeight()); |
63 | |
64 | mNewFileDiff = new FileDiffView(); |
65 | mNewNumberArea = new LineNumberArea(mNewFileDiff, true); |
66 | mNewNumberArea->setObjectName("LineNumberArea" ); |
67 | mNewNumberArea->setEditor(mNewFileDiff); |
68 | connect(mNewNumberArea, &LineNumberArea::addComment, this, &PrChangeListItem::openReviewDialog); |
69 | |
70 | mNewFileDiff->setStartingLine(change.newFileStartLine - 1); |
71 | mNewFileDiff->loadDiff(change.newData.first.join("\n" ).trimmed(), change.newData.second); |
72 | mNewFileDiff->addNumberArea(mNewNumberArea); |
73 | mNewFileDiff->setMinimumWidth(590); |
74 | mNewFileDiff->show(); |
75 | mNewFileDiff->setMinimumHeight(mNewFileDiff->getHeight()); |
76 | |
77 | const auto diffLayout = new QHBoxLayout(); |
78 | diffLayout->setContentsMargins(QMargins()); |
79 | diffLayout->setSpacing(5); |
80 | diffLayout->addWidget(oldFile); |
81 | diffLayout->addWidget(mNewFileDiff); |
82 | mainLayout->addLayout(diffLayout); |
83 | |
84 | connect(mNewNumberArea, &LineNumberArea::gotoReview, this, &PrChangeListItem::gotoReview); |
85 | } |
86 | } |
87 | |
88 | void PrChangeListItem::setBookmarks(const QMap<int, int> &bookmarks) |
89 | { |
90 | mNewNumberArea->setCommentBookmarks(bookmarks); |
91 | } |
92 | |
93 | void PrChangeListItem::openReviewDialog(int line) |
94 | { |
95 | const auto path = qobject_cast<LineNumberArea *>(sender()) == mNewNumberArea ? mNewFileName : mOldFileName; |
96 | |
97 | const auto dlg = new AddCodeReviewDialog(ReviewMode::Comment); |
98 | dlg->setWindowFlag(Qt::FramelessWindowHint); |
99 | dlg->setWindowFlag(Qt::Tool); |
100 | dlg->setWindowModality(Qt::ApplicationModal); |
101 | dlg->setModal(true); |
102 | |
103 | auto pos = QCursor::pos(); |
104 | pos.setY(pos.y() + mNewFileDiff->getLineHeigth()); |
105 | |
106 | dlg->move(pos); |
107 | |
108 | connect(dlg, &AddCodeReviewDialog::accepted, this, |
109 | [this, line, path, dlg]() { emit addCodeReview(line, path, dlg->getText().trimmed()); }); |
110 | |
111 | dlg->exec(); |
112 | } |
113 | |