| 1 | #include <SourceCodeReview.h> |
|---|---|
| 2 | |
| 3 | #include <FileDiffView.h> |
| 4 | #include <LineNumberArea.h> |
| 5 | |
| 6 | #include <QLabel> |
| 7 | #include <QVBoxLayout> |
| 8 | |
| 9 | SourceCodeReview::SourceCodeReview(const QString &filePath, const QString &sourceCode, int commentLine, QWidget *parent) |
| 10 | : QFrame(parent) |
| 11 | { |
| 12 | auto lines = sourceCode.split("\n"); |
| 13 | const auto hunkDescription = lines.takeFirst(); |
| 14 | auto hunkRemoved = false; |
| 15 | |
| 16 | #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) |
| 17 | const auto flag = Qt::SkipEmptyParts; |
| 18 | #else |
| 19 | const auto flag = QString::SkipEmptyParts; |
| 20 | #endif |
| 21 | |
| 22 | if (hunkDescription.split("@@", flag).count() == 1) |
| 23 | { |
| 24 | --commentLine; |
| 25 | hunkRemoved = true; |
| 26 | } |
| 27 | |
| 28 | auto linesCount = 0; |
| 29 | QString summary; |
| 30 | |
| 31 | for (auto i = 0, j = lines.count() - 1; i <= 4 && j >= 0; ++i, --j) |
| 32 | { |
| 33 | if (!lines[j].isEmpty() && lines[j].count() > 1) |
| 34 | { |
| 35 | ++linesCount; |
| 36 | summary.prepend(lines[j] + QString::fromUtf8("\n")); |
| 37 | |
| 38 | if (lines[j].startsWith("-")) |
| 39 | --i; |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | if (!hunkRemoved) |
| 44 | { |
| 45 | ++linesCount; |
| 46 | summary.prepend(hunkDescription + QString::fromUtf8("\n")); |
| 47 | } |
| 48 | |
| 49 | const auto diff = new FileDiffView(); |
| 50 | diff->addNumberArea(new LineNumberArea(diff)); |
| 51 | diff->setStartingLine(commentLine - linesCount + 1); |
| 52 | diff->setUnifiedDiff(true); |
| 53 | diff->loadDiff(summary.trimmed()); |
| 54 | diff->setTextInteractionFlags(Qt::NoTextInteraction); |
| 55 | diff->setMinimumWidth(800); |
| 56 | diff->show(); |
| 57 | |
| 58 | const auto height = diff->getHeight(); |
| 59 | diff->setFixedHeight(height + 10); |
| 60 | |
| 61 | const auto mainLayout = new QVBoxLayout(this); |
| 62 | mainLayout->setContentsMargins(QMargins()); |
| 63 | mainLayout->setSpacing(0); |
| 64 | mainLayout->addWidget(new QLabel(filePath)); |
| 65 | mainLayout->addWidget(diff); |
| 66 | } |
| 67 |