From c7142affef4b4ea78306254b62da13d66f9be0af Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 4 Oct 2010 15:37:15 +0200 Subject: [PATCH] Git: Only allow commit if author information is valid Check author information to be valid before enableing the commit button. Task-number: QTCREATORBUG-2410 --- src/libs/utils/submiteditorwidget.cpp | 43 +++++---- src/libs/utils/submiteditorwidget.h | 7 +- src/plugins/git/gitsubmiteditorwidget.cpp | 39 +++++++- src/plugins/git/gitsubmiteditorwidget.h | 15 ++++ src/plugins/git/gitsubmitpanel.ui | 105 ++++++++++++++++------ 5 files changed, 160 insertions(+), 49 deletions(-) diff --git a/src/libs/utils/submiteditorwidget.cpp b/src/libs/utils/submiteditorwidget.cpp index 0c8aa30a1c4..10cade5c2e1 100644 --- a/src/libs/utils/submiteditorwidget.cpp +++ b/src/libs/utils/submiteditorwidget.cpp @@ -139,7 +139,6 @@ struct SubmitEditorWidgetPrivate Ui::SubmitEditorWidget m_ui; bool m_filesSelected; - bool m_filesChecked; int m_fileNameColumn; int m_activatedRow; bool m_emptyFileListEnabled; @@ -148,16 +147,18 @@ struct SubmitEditorWidgetPrivate QVBoxLayout *m_fieldLayout; QList m_fieldWidgets; int m_lineWidth; + + bool m_commitEnabled; }; SubmitEditorWidgetPrivate::SubmitEditorWidgetPrivate() : m_filesSelected(false), - m_filesChecked(false), m_fileNameColumn(1), m_activatedRow(-1), m_emptyFileListEnabled(false), m_fieldLayout(0), - m_lineWidth(defaultLineWidth) + m_lineWidth(defaultLineWidth), + m_commitEnabled(false) { } @@ -209,10 +210,10 @@ void SubmitEditorWidget::registerActions(QAction *editorUndoAction, QAction *edi int count = 0; if (const QAbstractItemModel *model = m_d->m_ui.fileView->model()) count = model->rowCount(); - qDebug() << Q_FUNC_INFO << submitAction << count << "items" << m_d->m_filesChecked; + qDebug() << Q_FUNC_INFO << submitAction << count << "items"; } - submitAction->setEnabled(m_d->m_filesChecked); - connect(this, SIGNAL(fileCheckStateChanged(bool)), submitAction, SLOT(setEnabled(bool))); + m_d->m_commitEnabled = !canSubmit(); + connect(this, SIGNAL(submitActionEnabledChanged(bool)), submitAction, SLOT(setEnabled(bool))); // Wire setText via QActionSetTextSlotHelper. QActionSetTextSlotHelper *actionSlotHelper = submitAction->findChild(); if (!actionSlotHelper) @@ -243,7 +244,7 @@ void SubmitEditorWidget::unregisterActions(QAction *editorUndoAction, QAction * } if (submitAction) { - disconnect(this, SIGNAL(fileCheckStateChanged(bool)), submitAction, SLOT(setEnabled(bool))); + disconnect(this, SIGNAL(submitActionEnabledChanged(bool)), submitAction, SLOT(setEnabled(bool))); // Just deactivate the QActionSetTextSlotHelper on the action disconnect(this, SIGNAL(submitActionTextChanged(QString)), 0, 0); } @@ -448,18 +449,20 @@ void SubmitEditorWidget::updateActions() void SubmitEditorWidget::updateSubmitAction() { const unsigned checkedCount = checkedFilesCount(); - const bool newFilesCheckedState = m_d->m_emptyFileListEnabled || checkedCount > 0; + const bool newCommitState = canSubmit(); // Emit signal to update action - if (m_d->m_filesChecked != newFilesCheckedState) { - m_d->m_filesChecked = newFilesCheckedState; - emit fileCheckStateChanged(m_d->m_filesChecked); + if (m_d->m_commitEnabled != newCommitState) { + m_d->m_commitEnabled = newCommitState; + emit submitActionEnabledChanged(m_d->m_commitEnabled); + } + if (m_d->m_ui.fileView && m_d->m_ui.fileView->model()) { + // Update button text. + const int fileCount = m_d->m_ui.fileView->model()->rowCount(); + const QString msg = checkedCount ? + tr("Commit %1/%n Files", 0, fileCount).arg(checkedCount) : + tr("Commit"); + emit submitActionTextChanged(msg); } - // Update button text. - const int fileCount = m_d->m_ui.fileView->model()->rowCount(); - const QString msg = checkedCount ? - tr("Commit %1/%n Files", 0, fileCount).arg(checkedCount) : - tr("Commit"); - emit submitActionTextChanged(msg); } // Enable diff depending on selected files @@ -509,6 +512,12 @@ void SubmitEditorWidget::insertTopWidget(QWidget *w) m_d->m_ui.vboxLayout->insertWidget(0, w); } +bool SubmitEditorWidget::canSubmit() const +{ + const unsigned checkedCount = checkedFilesCount(); + return m_d->m_emptyFileListEnabled || checkedCount > 0; +} + void SubmitEditorWidget::addSubmitFieldWidget(SubmitFieldWidget *f) { if (!m_d->m_fieldLayout) { diff --git a/src/libs/utils/submiteditorwidget.h b/src/libs/utils/submiteditorwidget.h index 457783a9d7f..37d1c8b0bd9 100644 --- a/src/libs/utils/submiteditorwidget.h +++ b/src/libs/utils/submiteditorwidget.h @@ -129,8 +129,8 @@ public: signals: void diffSelected(const QStringList &); void fileSelectionChanged(bool someFileSelected); - void fileCheckStateChanged(bool someFileChecked); void submitActionTextChanged(const QString &); + void submitActionEnabledChanged(const bool); public slots: void checkAll(); @@ -139,13 +139,16 @@ public slots: protected: virtual void changeEvent(QEvent *e); void insertTopWidget(QWidget *w); + virtual bool canSubmit() const; + +protected slots: + void updateSubmitAction(); private slots: void triggerDiffSelected(); void diffActivated(const QModelIndex &index); void diffActivatedDelayed(); void updateActions(); - void updateSubmitAction(); void updateDiffAction(); void editorCustomContextMenuRequested(const QPoint &); void fileListCustomContextMenuRequested(const QPoint & pos); diff --git a/src/plugins/git/gitsubmiteditorwidget.cpp b/src/plugins/git/gitsubmiteditorwidget.cpp index 1a02f4a8a18..5014a8b20f8 100644 --- a/src/plugins/git/gitsubmiteditorwidget.cpp +++ b/src/plugins/git/gitsubmiteditorwidget.cpp @@ -34,10 +34,13 @@ #include #include +#include +#include #include #include #include +#include #include namespace Git { @@ -116,11 +119,19 @@ GitSubmitEditorWidget::GitSubmitEditorWidget(QWidget *parent) : m_gitSubmitPanelUi.setupUi(m_gitSubmitPanel); insertTopWidget(m_gitSubmitPanel); new GitSubmitHighlighter(descriptionEdit()); + + m_emailValidator = new QRegExpValidator(QRegExp(QLatin1String("[^@ ]+@[^@ ]+\\.[a-zA-Z]+")), this); + + m_gitSubmitPanelUi.emailLineEdit->setValidator(m_emailValidator); + connect(m_gitSubmitPanelUi.authorLineEdit, SIGNAL(textChanged(QString)), + this, SLOT(authorInformationChanged())); + connect(m_gitSubmitPanelUi.emailLineEdit, SIGNAL(textChanged(QString)), + this, SLOT(authorInformationChanged())); } void GitSubmitEditorWidget::setPanelInfo(const GitSubmitEditorPanelInfo &info) { - m_gitSubmitPanelUi.repositoryLabel->setText(info.repository); + m_gitSubmitPanelUi.repositoryLabel->setText(QDir::toNativeSeparators(info.repository)); m_gitSubmitPanelUi.branchLabel->setText(info.branch); } @@ -136,6 +147,32 @@ void GitSubmitEditorWidget::setPanelData(const GitSubmitEditorPanelData &data) { m_gitSubmitPanelUi.authorLineEdit->setText(data.author); m_gitSubmitPanelUi.emailLineEdit->setText(data.email); + authorInformationChanged(); +} + +bool GitSubmitEditorWidget::canSubmit() const +{ + if (m_gitSubmitPanelUi.authorLineEdit->text().isEmpty() + || !emailIsValid()) + return false; + return SubmitEditorWidget::canSubmit(); +} + +void GitSubmitEditorWidget::authorInformationChanged() +{ + m_gitSubmitPanelUi.invalidAuthorLabel-> + setVisible(m_gitSubmitPanelUi.authorLineEdit->text().isEmpty()); + m_gitSubmitPanelUi.invalidEmailLabel-> + setVisible(!emailIsValid()); + + updateSubmitAction(); +} + +bool GitSubmitEditorWidget::emailIsValid() const +{ + int pos = m_gitSubmitPanelUi.emailLineEdit->cursorPosition(); + return m_emailValidator->validate(m_gitSubmitPanelUi.emailLineEdit->text(), pos) + == QValidator::Acceptable; } } // namespace Internal diff --git a/src/plugins/git/gitsubmiteditorwidget.h b/src/plugins/git/gitsubmiteditorwidget.h index 40d744641fd..64e4c5aac3c 100644 --- a/src/plugins/git/gitsubmiteditorwidget.h +++ b/src/plugins/git/gitsubmiteditorwidget.h @@ -31,8 +31,13 @@ #define GITSUBMITEDITORWIDGET_H #include "ui_gitsubmitpanel.h" + #include +QT_BEGIN_NAMESPACE +class QValidator; +QT_END_NAMESPACE + namespace Git { namespace Internal { @@ -49,6 +54,7 @@ struct GitSubmitEditorPanelData; class GitSubmitEditorWidget : public Utils::SubmitEditorWidget { + Q_OBJECT public: explicit GitSubmitEditorWidget(QWidget *parent = 0); @@ -59,9 +65,18 @@ public: void setPanelInfo(const GitSubmitEditorPanelInfo &info); +protected: + bool canSubmit() const; + +private slots: + void authorInformationChanged(); + private: + bool emailIsValid() const; + QWidget *m_gitSubmitPanel; Ui::GitSubmitPanel m_gitSubmitPanelUi; + QValidator *m_emailValidator; }; } // namespace Internal diff --git a/src/plugins/git/gitsubmitpanel.ui b/src/plugins/git/gitsubmitpanel.ui index 7dfa9b3ba0f..c790299aa11 100644 --- a/src/plugins/git/gitsubmitpanel.ui +++ b/src/plugins/git/gitsubmitpanel.ui @@ -6,8 +6,8 @@ 0 0 - 374 - 229 + 364 + 172 @@ -59,49 +59,96 @@ Commit Information - - - - - - - Author: - - - - - - - - - - Email: - - - - - - - + + + + + Author: + + - + + + + + 150 + 0 + + + + + + + + + 20 + 20 + + + + + + + :/projectexplorer/images/compile_error.png + + + + Qt::Horizontal + + QSizePolicy::MinimumExpanding + - 161 + 5 20 + + + + Email: + + + + + + + + 150 + 0 + + + + + + + + + 20 + 20 + + + + + + + :/projectexplorer/images/compile_error.png + + + - + + +