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"