File indexing completed on 2024-04-14 05:34:11

0001 /*
0002     SPDX-FileCopyrightText: 2010 Sebastian Doerner <sebastian@sebastian-doerner.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "commitdialog.h"
0008 #include "fileviewgitpluginsettings.h"
0009 #include "gitwrapper.h"
0010 
0011 #include <KConfigGroup>
0012 #include <KLocalizedString>
0013 #include <ktextedit.h>
0014 
0015 #include <QDialogButtonBox>
0016 #include <QGroupBox>
0017 #include <QCheckBox>
0018 #include <QPushButton>
0019 #include <QTextCodec>
0020 #include <QVBoxLayout>
0021 
0022 CommitDialog::CommitDialog (QWidget* parent ):
0023     QDialog (parent, Qt::Dialog),
0024     m_localCodec(QTextCodec::codecForLocale())
0025 {
0026     this->setWindowTitle(xi18nc("@title:window", "<application>Git</application> Commit"));
0027     m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
0028     QWidget *mainWidget = new QWidget(this);
0029     QVBoxLayout *mainLayout = new QVBoxLayout;
0030     this->setLayout(mainLayout);
0031     mainLayout->addWidget(mainWidget);
0032     QPushButton *okButton = m_buttonBox->button(QDialogButtonBox::Ok);
0033     okButton->setDefault(true);
0034     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0035     this->connect(m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
0036     this->connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
0037     okButton->setText(i18nc("@action:button", "Commit"));
0038 
0039     QWidget* boxWidget = new QWidget(this);
0040     QVBoxLayout* boxLayout = new QVBoxLayout(boxWidget);
0041     mainLayout->addWidget(boxWidget);
0042 
0043     QGroupBox* messageGroupBox = new QGroupBox(boxWidget);
0044     mainLayout->addWidget(messageGroupBox);
0045     boxLayout->addWidget(messageGroupBox);
0046     messageGroupBox->setTitle(i18nc("@title:group", "Commit message"));
0047 
0048     mainLayout->addWidget(m_buttonBox);
0049 
0050     QVBoxLayout * messageVBox = new QVBoxLayout(messageGroupBox);
0051     messageGroupBox->setLayout(messageVBox);
0052 
0053     m_commitMessageTextEdit = new KTextEdit(messageGroupBox);
0054     m_commitMessageTextEdit->setLineWrapMode(QTextEdit::FixedColumnWidth);
0055     m_commitMessageTextEdit->setLineWrapColumnOrWidth(72);
0056     messageVBox->addWidget(m_commitMessageTextEdit);
0057     setOkButtonState();
0058     connect(m_commitMessageTextEdit, &QTextEdit::textChanged, this, &CommitDialog::setOkButtonState);
0059 
0060     QHBoxLayout* messageHBox = new QHBoxLayout();
0061     messageVBox->addLayout(messageHBox);
0062 
0063     m_amendCheckBox = new QCheckBox(i18nc("@option:check", "Amend last commit"), messageGroupBox);
0064     messageHBox->addWidget(m_amendCheckBox);
0065     //read last commit message
0066     m_alternativeMessage = GitWrapper::instance()->lastCommitMessage();
0067     if (m_alternativeMessage.isNull()) {
0068         m_amendCheckBox->setEnabled(false);
0069         m_amendCheckBox->setToolTip(i18nc("@info:tooltip", "There is nothing to amend."));
0070     } else {
0071         connect(m_amendCheckBox, &QCheckBox::stateChanged,
0072                 this, &CommitDialog::amendCheckBoxStateChanged);
0073     }
0074 
0075     QPushButton * signOffButton = new QPushButton(
0076         i18nc("@action:button Add Signed-Off line to the message widget", "Sign off"),messageGroupBox);
0077     signOffButton->setToolTip(i18nc("@info:tooltip", "Add Signed-off-by line at the end of the commit message."));
0078     messageHBox->addStretch();
0079     messageHBox->addWidget(signOffButton);
0080 
0081     //restore dialog size
0082     FileViewGitPluginSettings* settings = FileViewGitPluginSettings::self();
0083     this->resize(QSize(settings->commitDialogWidth(), settings->commitDialogHeight()));
0084 
0085     connect(this, &QDialog::finished, this, &CommitDialog::saveDialogSize);
0086     connect(signOffButton, &QAbstractButton::clicked, this, &CommitDialog::signOffButtonClicked);
0087 }
0088 
0089 void CommitDialog::signOffButtonClicked()
0090 {
0091     if (m_userName.isNull()) {
0092         GitWrapper * gitWrapper= GitWrapper::instance();
0093         m_userName = gitWrapper->userName();
0094         m_userEmail = gitWrapper->userEmail();
0095     }
0096     //append Signed-off line
0097     QString lastline = m_commitMessageTextEdit->document()->lastBlock().text();
0098     bool noNewLine = lastline.startsWith(QLatin1String("Signed-off")) || lastline.isEmpty();
0099     m_commitMessageTextEdit->append((noNewLine ? QLatin1String() : QLatin1String("\n")) + QLatin1String("Signed-off-by: ")
0100             + m_userName + QLatin1String(" <") + m_userEmail + QLatin1Char('>'));
0101 }
0102 
0103 QByteArray CommitDialog::commitMessage() const
0104 {
0105     return m_localCodec->fromUnicode(m_commitMessageTextEdit->toPlainText());
0106 }
0107 
0108 bool CommitDialog::amend() const
0109 {
0110     return m_amendCheckBox->isChecked();
0111 }
0112 
0113 void CommitDialog::amendCheckBoxStateChanged()
0114 {
0115     QString tmp = m_commitMessageTextEdit->toPlainText();
0116     m_commitMessageTextEdit->setText(m_alternativeMessage);
0117     m_alternativeMessage = tmp;
0118 }
0119 
0120 void CommitDialog::saveDialogSize()
0121 {
0122     FileViewGitPluginSettings* settings = FileViewGitPluginSettings::self();
0123     settings->setCommitDialogHeight(this->height());
0124     settings->setCommitDialogWidth(this->width());
0125     settings->save();
0126 }
0127 
0128 void CommitDialog::setOkButtonState()
0129 {
0130     bool enable = !m_commitMessageTextEdit->toPlainText().isEmpty();
0131     QPushButton *okButton = m_buttonBox->button(QDialogButtonBox::Ok);
0132     okButton->setEnabled(enable);
0133     okButton->setToolTip(enable ?
0134             QString() : i18nc("@info:tooltip", "You must enter a commit message first."));
0135 }
0136 
0137 
0138 #include "moc_commitdialog.cpp"