From 2508fa03a09391957933c5d7d83b9ab80cb4ca9e Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Fri, 19 Jun 2009 16:34:38 +0200
Subject: [PATCH] Make the "prompt to submit" setting a per-plugin one.

Provide a checkable message box to be able to turn
prompting off when asked.
---
 src/libs/utils/checkablemessagebox.cpp        | 150 +++++++++++++++++
 src/libs/utils/checkablemessagebox.h          |  77 +++++++++
 src/libs/utils/checkablemessagebox.ui         | 154 ++++++++++++++++++
 src/libs/utils/utils.pro                      |   9 +-
 src/plugins/git/gitplugin.cpp                 |   8 +-
 src/plugins/git/gitsettings.cpp               |   9 +-
 src/plugins/git/gitsettings.h                 |   1 +
 src/plugins/git/settingspage.cpp              |   2 +
 src/plugins/git/settingspage.ui               |   9 +-
 src/plugins/perforce/perforceplugin.cpp       |  10 +-
 src/plugins/perforce/perforcesettings.cpp     |  29 +++-
 src/plugins/perforce/perforcesettings.h       |   4 +
 src/plugins/perforce/settingspage.cpp         |   2 +
 src/plugins/perforce/settingspage.ui          |  58 +++++--
 src/plugins/subversion/settingspage.cpp       |   2 +
 src/plugins/subversion/settingspage.ui        |  40 ++++-
 src/plugins/subversion/subversionplugin.cpp   |   5 +-
 src/plugins/subversion/subversionsettings.cpp |   9 +-
 src/plugins/subversion/subversionsettings.h   |   1 +
 src/plugins/vcsbase/vcsbasesettings.cpp       |  10 +-
 src/plugins/vcsbase/vcsbasesettings.h         |   2 -
 src/plugins/vcsbase/vcsbasesettingspage.cpp   |   2 -
 src/plugins/vcsbase/vcsbasesettingspage.ui    |   7 -
 src/plugins/vcsbase/vcsbasesubmiteditor.cpp   |  20 ++-
 src/plugins/vcsbase/vcsbasesubmiteditor.h     |   3 +
 25 files changed, 554 insertions(+), 69 deletions(-)
 create mode 100644 src/libs/utils/checkablemessagebox.cpp
 create mode 100644 src/libs/utils/checkablemessagebox.h
 create mode 100644 src/libs/utils/checkablemessagebox.ui

diff --git a/src/libs/utils/checkablemessagebox.cpp b/src/libs/utils/checkablemessagebox.cpp
new file mode 100644
index 00000000000..d72bd9e6da4
--- /dev/null
+++ b/src/libs/utils/checkablemessagebox.cpp
@@ -0,0 +1,150 @@
+#include "checkablemessagebox.h"
+#include "ui_checkablemessagebox.h"
+
+#include <QtGui/QPushButton>
+#include <QtCore/QDebug>
+
+namespace Core {
+namespace Utils {
+
+struct CheckableMessageBoxPrivate {
+    CheckableMessageBoxPrivate() : clickedButton(0) {}
+
+    Ui::CheckableMessageBox ui;
+    QAbstractButton *clickedButton;
+};
+
+CheckableMessageBox::CheckableMessageBox(QWidget *parent) :
+    QDialog(parent),
+    m_d(new CheckableMessageBoxPrivate)
+{
+    setModal(true);
+    setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
+    m_d->ui.setupUi(this);
+    m_d->ui.pixmapLabel->setVisible(false);
+    connect(m_d->ui.buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
+    connect(m_d->ui.buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
+    connect(m_d->ui.buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(slotClicked(QAbstractButton*)));
+}
+
+CheckableMessageBox::~CheckableMessageBox()
+{
+    delete m_d;
+}
+
+void CheckableMessageBox::slotClicked(QAbstractButton *b)
+{
+    m_d->clickedButton = b;
+}
+
+QAbstractButton *CheckableMessageBox::clickedButton() const
+{
+    return m_d->clickedButton;
+}
+
+QDialogButtonBox::StandardButton CheckableMessageBox::clickedStandardButton() const
+{
+    if (m_d->clickedButton)
+        return m_d->ui.buttonBox->standardButton(m_d->clickedButton);
+    return QDialogButtonBox::NoButton;
+}
+
+QString CheckableMessageBox::text() const
+{
+    return m_d->ui.messageLabel->text();
+}
+
+void CheckableMessageBox::setText(const QString &t)
+{
+    m_d->ui.messageLabel->setText(t);
+}
+
+QPixmap CheckableMessageBox::iconPixmap() const
+{
+    if (const QPixmap *p = m_d->ui.pixmapLabel->pixmap())
+        return QPixmap(*p);
+    return QPixmap();
+}
+
+void CheckableMessageBox::setIconPixmap(const QPixmap &p)
+{
+    m_d->ui.pixmapLabel->setPixmap(p);
+    m_d->ui.pixmapLabel->setVisible(!p.isNull());
+}
+
+bool CheckableMessageBox::isChecked() const
+{
+    return m_d->ui.checkBox->isChecked();
+}
+
+void CheckableMessageBox::setChecked(bool s)
+{
+    m_d->ui.checkBox->setChecked(s);
+}
+
+QString CheckableMessageBox::checkBoxText() const
+{
+    return m_d->ui.checkBox->text();
+}
+
+void CheckableMessageBox::setCheckBoxText(const QString &t)
+{
+    m_d->ui.checkBox->setText(t);
+}
+
+QDialogButtonBox::StandardButtons CheckableMessageBox::standardButtons() const
+{
+    return m_d->ui.buttonBox->standardButtons();
+}
+
+void CheckableMessageBox::setStandardButtons(QDialogButtonBox::StandardButtons s)
+{
+    m_d->ui.buttonBox->setStandardButtons(s);
+}
+
+QDialogButtonBox::StandardButton CheckableMessageBox::defaultButton() const
+{
+    foreach (QAbstractButton *b, m_d->ui.buttonBox->buttons())
+        if (QPushButton *pb = qobject_cast<QPushButton *>(b))
+            if (pb->isDefault())
+               return m_d->ui.buttonBox->standardButton(pb);
+    return QDialogButtonBox::NoButton;
+}
+
+void CheckableMessageBox::setDefaultButton(QDialogButtonBox::StandardButton s)
+{
+    if (QPushButton *b = m_d->ui.buttonBox->button(s)) {
+        b->setDefault(true);
+        b->setFocus();
+    }
+}
+
+QDialogButtonBox::StandardButton
+        CheckableMessageBox::question(QWidget *parent,
+                                      const QString &title,
+                                      const QString &question,
+                                      const QString &checkBoxText,
+                                      bool *checkBoxSetting,
+                                      QDialogButtonBox::StandardButtons buttons,
+                                      QDialogButtonBox::StandardButton defaultButton)
+{
+    CheckableMessageBox mb(parent);
+    mb.setWindowTitle(title);
+    mb.setIconPixmap(QMessageBox::standardIcon(QMessageBox::Question));
+    mb.setText(question);
+    mb.setCheckBoxText(checkBoxText);
+    mb.setChecked(*checkBoxSetting);
+    mb.setStandardButtons(buttons);
+    mb.setDefaultButton(defaultButton);
+    mb.exec();
+    *checkBoxSetting = mb.isChecked();
+    return mb.clickedStandardButton();
+}
+
+QMessageBox::StandardButton CheckableMessageBox::dialogButtonBoxToMessageBoxButton(QDialogButtonBox::StandardButton db)
+{
+    return static_cast<QMessageBox::StandardButton>(int(db));
+}
+
+} // namespace Utils
+} // namespace Core
diff --git a/src/libs/utils/checkablemessagebox.h b/src/libs/utils/checkablemessagebox.h
new file mode 100644
index 00000000000..4b57e25fa3b
--- /dev/null
+++ b/src/libs/utils/checkablemessagebox.h
@@ -0,0 +1,77 @@
+#ifndef CHECKABLEMESSAGEBOX_H
+#define CHECKABLEMESSAGEBOX_H
+
+#include "utils_global.h"
+
+#include <QtGui/QDialogButtonBox>
+#include <QtGui/QMessageBox>
+#include <QtGui/QDialog>
+
+namespace Core {
+namespace Utils {
+
+struct CheckableMessageBoxPrivate;
+
+/* A messagebox suitable for questions with a
+ * "Do not ask me again" checkbox. Emulates the QMessageBox API with
+ * static conveniences. */
+
+class QTCREATOR_UTILS_EXPORT CheckableMessageBox : public QDialog
+{
+    Q_OBJECT
+    Q_PROPERTY(QString text READ text WRITE setText)
+    Q_PROPERTY(QPixmap iconPixmap READ iconPixmap WRITE setIconPixmap)
+    Q_PROPERTY(bool isChecked READ isChecked WRITE setChecked)
+    Q_PROPERTY(QString checkBoxText READ checkBoxText WRITE setCheckBoxText)
+    Q_PROPERTY(QDialogButtonBox::StandardButtons buttons READ standardButtons WRITE setStandardButtons)
+    Q_PROPERTY(QDialogButtonBox::StandardButton defaultButton READ defaultButton WRITE setDefaultButton)
+public:
+    explicit CheckableMessageBox(QWidget *parent);
+    virtual ~CheckableMessageBox();
+
+    static QDialogButtonBox::StandardButton
+        question(QWidget *parent,
+                 const QString &title,
+                 const QString &question,
+                 const QString &checkBoxText,
+                 bool *checkBoxSetting,
+                 QDialogButtonBox::StandardButtons buttons = QDialogButtonBox::Yes|QDialogButtonBox::No,
+                 QDialogButtonBox::StandardButton defaultButton = QDialogButtonBox::No);
+
+    QString text() const;
+    void setText(const QString &);
+
+    bool isChecked() const;
+    void setChecked(bool s);
+
+    QString checkBoxText() const;
+    void setCheckBoxText(const QString &);
+
+   QDialogButtonBox::StandardButtons standardButtons() const;
+   void setStandardButtons(QDialogButtonBox::StandardButtons s);
+
+   QDialogButtonBox::StandardButton defaultButton() const;
+   void setDefaultButton(QDialogButtonBox::StandardButton s);
+
+    // see static QMessageBox::standardPixmap()
+    QPixmap iconPixmap() const;
+    void setIconPixmap (const QPixmap &p);
+
+   // Query the result
+   QAbstractButton *clickedButton() const;
+   QDialogButtonBox::StandardButton clickedStandardButton() const;
+
+   // Conversion convenience
+   static QMessageBox::StandardButton dialogButtonBoxToMessageBoxButton(QDialogButtonBox::StandardButton);
+
+private slots:
+   void slotClicked(QAbstractButton *b);
+
+private:
+   CheckableMessageBoxPrivate *m_d;
+};
+
+} // namespace Utils
+} // namespace Core
+
+#endif // CHECKABLEMESSAGEBOX_H
diff --git a/src/libs/utils/checkablemessagebox.ui b/src/libs/utils/checkablemessagebox.ui
new file mode 100644
index 00000000000..c5f6d7265b5
--- /dev/null
+++ b/src/libs/utils/checkablemessagebox.ui
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Core::Utils::CheckableMessageBox</class>
+ <widget class="QDialog" name="Core::Utils::CheckableMessageBox">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>195</width>
+    <height>107</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <item>
+        <widget class="QLabel" name="pixmapLabel"/>
+       </item>
+       <item>
+        <spacer name="pixmapSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::MinimumExpanding</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>0</width>
+           <height>5</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QLabel" name="messageLabel">
+       <property name="text">
+        <string>TextLabel</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <spacer name="checkBoxLeftSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="checkBox">
+       <property name="text">
+        <string>CheckBox</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="checkBoxRightSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="buttonSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Minimum</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>0</width>
+       <height>5</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+     <property name="centerButtons">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Core::Utils::CheckableMessageBox</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Core::Utils::CheckableMessageBox</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/libs/utils/utils.pro b/src/libs/utils/utils.pro
index a35874026bc..da5191635fa 100644
--- a/src/libs/utils/utils.pro
+++ b/src/libs/utils/utils.pro
@@ -28,7 +28,8 @@ SOURCES += reloadpromptutils.cpp \
     consoleprocess.cpp \
     uncommentselection.cpp \
     parameteraction.cpp \
-    treewidgetcolumnstretcher.cpp
+    treewidgetcolumnstretcher.cpp \
+    checkablemessagebox.cpp
 win32 { 
     SOURCES += abstractprocess_win.cpp \
         consoleprocess_win.cpp \
@@ -63,9 +64,11 @@ HEADERS += utils_global.h \
     submitfieldwidget.h \
     uncommentselection.h \
     parameteraction.h \
-    treewidgetcolumnstretcher.h
+    treewidgetcolumnstretcher.h \
+    checkablemessagebox.h
 FORMS += filewizardpage.ui \
     projectintropage.ui \
     newclasswidget.ui \
-    submiteditorwidget.ui
+    submiteditorwidget.ui \
+    checkablemessagebox.ui
 RESOURCES += utils.qrc
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 595090085cb..3919232ac0a 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -690,12 +690,14 @@ bool GitPlugin::editorAboutToClose(Core::IEditor *iEditor)
         return true;
     // Prompt user. Force a prompt unless submit was actually invoked (that
     // is, the editor was closed or shutdown).
+    GitSettings settings = m_gitClient->settings();
+    const bool wantedPrompt = settings.promptToSubmit;
     const VCSBase::VCSBaseSubmitEditor::PromptSubmitResult answer =
             editor->promptSubmit(tr("Closing git editor"),
                                  tr("Do you want to commit the change?"),
                                  tr("The commit message check failed. Do you want to commit the change?"),
-                                 !m_submitActionTriggered);
-    m_submitActionTriggered = false;
+                                 &settings.promptToSubmit, !m_submitActionTriggered);
+    m_submitActionTriggered = false;    
     switch (answer) {
     case VCSBase::VCSBaseSubmitEditor::SubmitCanceled:
         return false; // Keep editing and change file
@@ -705,6 +707,8 @@ bool GitPlugin::editorAboutToClose(Core::IEditor *iEditor)
     default:
         break;
     }
+    if (wantedPrompt != settings.promptToSubmit)
+        m_gitClient->setSettings(settings);
     // Go ahead!
     const QStringList fileList = editor->checkedFiles();
     if (Git::Constants::debug)
diff --git a/src/plugins/git/gitsettings.cpp b/src/plugins/git/gitsettings.cpp
index 460e5537df1..f35bf5b7d31 100644
--- a/src/plugins/git/gitsettings.cpp
+++ b/src/plugins/git/gitsettings.cpp
@@ -41,6 +41,7 @@ static const char *sysEnvKeyC = "SysEnv";
 static const char *pathKeyC = "Path";
 static const char *logCountKeyC = "LogCount";
 static const char *timeoutKeyC = "TimeOut";
+static const char *promptToSubmitKeyC = "PromptForSubmit";
 
 enum { defaultLogCount =  10 , defaultTimeOut = 30};
 
@@ -50,7 +51,8 @@ namespace Internal {
 GitSettings::GitSettings() :
     adoptPath(false),
     logCount(defaultLogCount),
-    timeout(defaultTimeOut)
+    timeout(defaultTimeOut),
+    promptToSubmit(true)
 {
 }
 
@@ -61,6 +63,7 @@ void GitSettings::fromSettings(QSettings *settings)
     path = settings->value(QLatin1String(pathKeyC), QString()).toString();
     logCount = settings->value(QLatin1String(logCountKeyC), defaultLogCount).toInt();
     timeout = settings->value(QLatin1String(timeoutKeyC), defaultTimeOut).toInt();
+    promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool();
     settings->endGroup();
 }
 
@@ -71,12 +74,14 @@ void GitSettings::toSettings(QSettings *settings) const
     settings->setValue(QLatin1String(pathKeyC), path);
     settings->setValue(QLatin1String(logCountKeyC), logCount);
     settings->setValue(QLatin1String(timeoutKeyC), timeout);
+    settings->setValue(QLatin1String(promptToSubmitKeyC), promptToSubmit);
     settings->endGroup();
 }
 
 bool GitSettings::equals(const GitSettings &s) const
 {
-    return adoptPath == s.adoptPath && path == s.path && logCount == s.logCount && timeout == s.timeout;
+    return adoptPath == s.adoptPath && path == s.path && logCount == s.logCount
+           && timeout == s.timeout && promptToSubmit == s.promptToSubmit;
 }
 
 QString GitSettings::gitBinaryPath(bool *ok, QString *errorMessage) const
diff --git a/src/plugins/git/gitsettings.h b/src/plugins/git/gitsettings.h
index 3bd14d458fa..666e1483e3a 100644
--- a/src/plugins/git/gitsettings.h
+++ b/src/plugins/git/gitsettings.h
@@ -55,6 +55,7 @@ struct GitSettings
     QString path;
     int logCount;
     int timeout;
+    bool promptToSubmit;
 };
 
 inline bool operator==(const GitSettings &p1, const GitSettings &p2)
diff --git a/src/plugins/git/settingspage.cpp b/src/plugins/git/settingspage.cpp
index ed192142021..2167bafa7ff 100644
--- a/src/plugins/git/settingspage.cpp
+++ b/src/plugins/git/settingspage.cpp
@@ -54,6 +54,7 @@ GitSettings SettingsPageWidget::settings() const
     rc.adoptPath = m_ui.environmentGroupBox->isChecked() && !rc.path.isEmpty();
     rc.logCount = m_ui.logCountSpinBox->value();
     rc.timeout = m_ui.timeoutSpinBox->value();
+    rc.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked();    
     return rc;
 }
 
@@ -63,6 +64,7 @@ void SettingsPageWidget::setSettings(const GitSettings &s)
     m_ui.pathLineEdit->setText(s.path);
     m_ui.logCountSpinBox->setValue(s.logCount);
     m_ui.timeoutSpinBox->setValue(s.timeout);
+    m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit);
 }
 
 void SettingsPageWidget::setSystemPath()
diff --git a/src/plugins/git/settingspage.ui b/src/plugins/git/settingspage.ui
index 02f3671a1df..13884c70d1f 100644
--- a/src/plugins/git/settingspage.ui
+++ b/src/plugins/git/settingspage.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>403</width>
+    <width>409</width>
     <height>251</height>
    </rect>
   </property>
@@ -104,6 +104,13 @@
        </property>
       </widget>
      </item>
+     <item row="2" column="0" colspan="2">
+      <widget class="QCheckBox" name="promptToSubmitCheckBox">
+       <property name="text">
+        <string>Prompt to submit</string>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
    <item>
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index 92ac232b832..f40ab02a31e 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -930,20 +930,26 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
     if (!perforceEditor)
         return true;
     QFileInfo editorFile(fileIFace->fileName());
-    QFileInfo changeFile(m_changeTmpFile->fileName());
+    QFileInfo changeFile(m_changeTmpFile->fileName());    
     if (editorFile.absoluteFilePath() == changeFile.absoluteFilePath()) {
         // Prompt the user. Force a prompt unless submit was actually invoked (that
         // is, the editor was closed or shutdown).
+        bool wantsPrompt = m_settings.promptToSubmit();
          const VCSBase::VCSBaseSubmitEditor::PromptSubmitResult answer =
             perforceEditor->promptSubmit(tr("Closing p4 Editor"),
                                          tr("Do you want to submit this change list?"),
                                          tr("The commit message check failed. Do you want to submit this change list"),
-                                         !m_submitActionTriggered);
+                                         &wantsPrompt, !m_submitActionTriggered);
          m_submitActionTriggered = false;
 
         if (answer == VCSBase::VCSBaseSubmitEditor::SubmitCanceled)
             return false;
 
+        // Set without triggering the checking mechanism
+        if (wantsPrompt != m_settings.promptToSubmit()) {
+            m_settings.setPromptToSubmit(wantsPrompt);
+            m_settings.toSettings(Core::ICore::instance()->settings());
+        }
         core->fileManager()->blockFileChange(fileIFace);
         fileIFace->save();
         core->fileManager()->unblockFileChange(fileIFace);
diff --git a/src/plugins/perforce/perforcesettings.cpp b/src/plugins/perforce/perforcesettings.cpp
index 78854dff4ca..8ee12f218bd 100644
--- a/src/plugins/perforce/perforcesettings.cpp
+++ b/src/plugins/perforce/perforcesettings.cpp
@@ -44,6 +44,7 @@ static const char *defaultKeyC = "Default";
 static const char *portKeyC = "Port";
 static const char *clientKeyC = "Client";
 static const char *userKeyC = "User";
+static const char *promptToSubmitKeyC = "PromptForSubmit";
 
 static QString defaultCommand()
 {
@@ -59,7 +60,8 @@ namespace Perforce {
 namespace Internal {
 
 Settings::Settings() :
-    defaultEnv(true)
+    defaultEnv(true),
+    promptToSubmit(true)
 {
 }
 
@@ -67,7 +69,8 @@ bool Settings::equals(const Settings &rhs) const
 {
     return defaultEnv == rhs.defaultEnv
             && p4Command == rhs.p4Command && p4Port == rhs.p4Port
-            && p4Client == rhs.p4Client && p4User == rhs.p4User;
+            && p4Client == rhs.p4Client && p4User == rhs.p4User
+            && promptToSubmit == rhs.promptToSubmit;
 };
 
 QStringList Settings::basicP4Args() const
@@ -188,6 +191,7 @@ void PerforceSettings::fromSettings(QSettings *settings)
     m_settings.p4Port = settings->value(QLatin1String(portKeyC), QString()).toString();
     m_settings.p4Client = settings->value(QLatin1String(clientKeyC), QString()).toString();
     m_settings.p4User = settings->value(QLatin1String(userKeyC), QString()).toString();
+    m_settings.promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool();
     settings->endGroup();
     m_mutex.unlock();
 
@@ -198,11 +202,12 @@ void PerforceSettings::toSettings(QSettings *settings) const
 {
     m_mutex.lock();
     settings->beginGroup(QLatin1String(groupC));
-    settings->setValue(commandKeyC, m_settings.p4Command);
-    settings->setValue(defaultKeyC, m_settings.defaultEnv);
-    settings->setValue(portKeyC, m_settings.p4Port);
-    settings->setValue(clientKeyC, m_settings.p4Client);
-    settings->setValue(userKeyC, m_settings.p4User);
+    settings->setValue(QLatin1String(commandKeyC), m_settings.p4Command);
+    settings->setValue(QLatin1String(defaultKeyC), m_settings.defaultEnv);
+    settings->setValue(QLatin1String(portKeyC), m_settings.p4Port);
+    settings->setValue(QLatin1String(clientKeyC), m_settings.p4Client);
+    settings->setValue(QLatin1String(userKeyC), m_settings.p4User);
+    settings->setValue(QLatin1String(promptToSubmitKeyC), m_settings.promptToSubmit);
     settings->endGroup();
     m_mutex.unlock();
 }
@@ -249,6 +254,16 @@ bool PerforceSettings::defaultEnv() const
     return m_settings.defaultEnv;
 }
 
+bool PerforceSettings::promptToSubmit() const
+{
+    return m_settings.promptToSubmit;
+}
+
+void PerforceSettings::setPromptToSubmit(bool p)
+{
+    m_settings.promptToSubmit = p;
+}
+
 QString PerforceSettings::errorString() const
 {
     m_mutex.lock();
diff --git a/src/plugins/perforce/perforcesettings.h b/src/plugins/perforce/perforcesettings.h
index 8eabb32cddc..ab02ae9c2ad 100644
--- a/src/plugins/perforce/perforcesettings.h
+++ b/src/plugins/perforce/perforcesettings.h
@@ -54,6 +54,7 @@ struct Settings {
     QString p4User;
     QString errorString;
     bool defaultEnv;
+    bool promptToSubmit;
 };
 
 inline bool operator==(const Settings &s1, const Settings &s2) { return s1.equals(s2); }
@@ -81,6 +82,9 @@ public:
     QString p4Client() const;
     QString p4User() const;
     bool defaultEnv() const;
+    bool promptToSubmit() const;
+    void setPromptToSubmit(bool p);
+
     QStringList basicP4Args() const;
 
     // Error code of last check
diff --git a/src/plugins/perforce/settingspage.cpp b/src/plugins/perforce/settingspage.cpp
index cc0c866786a..126a6916834 100644
--- a/src/plugins/perforce/settingspage.cpp
+++ b/src/plugins/perforce/settingspage.cpp
@@ -70,6 +70,7 @@ Settings SettingsPageWidget::settings() const
     settings.p4Port = m_ui.portLineEdit->text();
     settings.p4User = m_ui.userLineEdit->text();
     settings.p4Client=  m_ui.clientLineEdit->text();
+    settings.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked();
     return settings;
 }
 
@@ -80,6 +81,7 @@ void SettingsPageWidget::setSettings(const PerforceSettings &s)
     m_ui.portLineEdit->setText(s.p4Port());
     m_ui.clientLineEdit->setText(s.p4Client());
     m_ui.userLineEdit->setText(s.p4User());
+    m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit());
     const QString errorString = s.errorString();
     setStatusText(errorString.isEmpty(), errorString);
 }
diff --git a/src/plugins/perforce/settingspage.ui b/src/plugins/perforce/settingspage.ui
index 4ea88a436dd..5eccd25c950 100644
--- a/src/plugins/perforce/settingspage.ui
+++ b/src/plugins/perforce/settingspage.ui
@@ -6,38 +6,62 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>408</width>
+    <width>423</width>
     <height>463</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <layout class="QHBoxLayout">
-     <property name="spacing">
-      <number>6</number>
+    <layout class="QFormLayout" name="formLayout_2">
+     <item row="0" column="0" colspan="2">
+      <widget class="QCheckBox" name="promptToSubmitCheckBox">
+       <property name="text">
+        <string>Prompt to submit</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
      </property>
-     <property name="margin">
-      <number>0</number>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
      </property>
-     <item>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <layout class="QFormLayout" name="formLayout">
+     <property name="fieldGrowthPolicy">
+      <enum>QFormLayout::ExpandingFieldsGrow</enum>
+     </property>
+     <item row="0" column="0">
       <widget class="QLabel" name="commandLabel">
        <property name="text">
         <string>P4 Command:</string>
        </property>
       </widget>
      </item>
-     <item>
-      <widget class="Core::Utils::PathChooser" name="pathChooser" native="true"/>
+     <item row="0" column="1">
+      <widget class="Core::Utils::PathChooser" name="pathChooser"/>
+     </item>
+     <item row="1" column="0" colspan="2">
+      <widget class="QCheckBox" name="defaultCheckBox">
+       <property name="text">
+        <string>Use default P4 environment variables</string>
+       </property>
+      </widget>
      </item>
     </layout>
    </item>
-   <item>
-    <widget class="QCheckBox" name="defaultCheckBox">
-     <property name="text">
-      <string>Use default P4 environment variables</string>
-     </property>
-    </widget>
-   </item>
    <item>
     <widget class="QGroupBox" name="groupBox">
      <property name="enabled">
@@ -129,7 +153,7 @@
    <item>
     <widget class="QLabel" name="errorLabel">
      <property name="text">
-      <string extracomment="Placeholder" notr="true">errorLabel: blah blubb</string>
+      <string notr="true" extracomment="Placeholder">errorLabel: blah blubb</string>
      </property>
     </widget>
    </item>
diff --git a/src/plugins/subversion/settingspage.cpp b/src/plugins/subversion/settingspage.cpp
index c39e54597dd..1b0a64d2336 100644
--- a/src/plugins/subversion/settingspage.cpp
+++ b/src/plugins/subversion/settingspage.cpp
@@ -59,6 +59,7 @@ SubversionSettings SettingsPageWidget::settings() const
     rc.password = m_ui.passwordLineEdit->text();
     if (rc.user.isEmpty())
         rc.useAuthentication = false;
+    rc.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked();
     return rc;
 }
 
@@ -68,6 +69,7 @@ void SettingsPageWidget::setSettings(const SubversionSettings &s)
     m_ui.usernameLineEdit->setText(s.user);
     m_ui.passwordLineEdit->setText(s.password);
     m_ui.userGroupBox->setChecked(s.useAuthentication);
+    m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit);
 }
 
 SettingsPage::SettingsPage()
diff --git a/src/plugins/subversion/settingspage.ui b/src/plugins/subversion/settingspage.ui
index 007026bab86..b4b8d93b7e1 100644
--- a/src/plugins/subversion/settingspage.ui
+++ b/src/plugins/subversion/settingspage.ui
@@ -6,30 +6,54 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>427</width>
-    <height>280</height>
+    <width>575</width>
+    <height>437</height>
    </rect>
   </property>
   <layout class="QHBoxLayout" name="horizontalLayout">
    <item>
     <layout class="QVBoxLayout" name="verticalLayout">
      <item>
-      <layout class="QHBoxLayout" name="commandHBox">
-       <property name="spacing">
-        <number>6</number>
+      <layout class="QFormLayout" name="formLayout_3">
+       <item row="0" column="0" colspan="2">
+        <widget class="QCheckBox" name="promptToSubmitCheckBox">
+         <property name="text">
+          <string>Prompt to submit</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <spacer name="topverticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
        </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Fixed</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <layout class="QFormLayout" name="formLayout_2">
        <property name="margin">
         <number>0</number>
        </property>
-       <item>
+       <item row="0" column="0">
         <widget class="QLabel" name="commandLabel">
          <property name="text">
           <string>Subversion Command:</string>
          </property>
         </widget>
        </item>
-       <item>
-        <widget class="Core::Utils::PathChooser" name="pathChooser" native="true"/>
+       <item row="0" column="1">
+        <widget class="Core::Utils::PathChooser" name="pathChooser"/>
        </item>
       </layout>
      </item>
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 1c794e84a75..a9101e4d905 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -480,11 +480,12 @@ bool SubversionPlugin::editorAboutToClose(Core::IEditor *iEditor)
 
     // Prompt user. Force a prompt unless submit was actually invoked (that
     // is, the editor was closed or shutdown).
+    SubversionSettings newSettings = m_settings;
     const VCSBase::VCSBaseSubmitEditor::PromptSubmitResult answer =
             editor->promptSubmit(tr("Closing Subversion Editor"),
                                  tr("Do you want to commit the change?"),
                                  tr("The commit message check failed. Do you want to commit the change?"),
-                                 !m_submitActionTriggered);
+                                 &newSettings.promptToSubmit, !m_submitActionTriggered);
     m_submitActionTriggered = false;
     switch (answer) {
     case VCSBase::VCSBaseSubmitEditor::SubmitCanceled:
@@ -495,7 +496,7 @@ bool SubversionPlugin::editorAboutToClose(Core::IEditor *iEditor)
     default:
         break;
     }
-
+    setSettings(newSettings); // in case someone turned prompting off
     const QStringList fileList = editor->checkedFiles();
     bool closeEditor = true;
     if (!fileList.empty()) {
diff --git a/src/plugins/subversion/subversionsettings.cpp b/src/plugins/subversion/subversionsettings.cpp
index 277238cd066..8df4853667f 100644
--- a/src/plugins/subversion/subversionsettings.cpp
+++ b/src/plugins/subversion/subversionsettings.cpp
@@ -40,6 +40,7 @@ static const char *authenticationKeyC = "Authentication";
 
 static const char *userNameOptionC = "--username";
 static const char *passwordOptionC = "--password";
+static const char *promptToSubmitKeyC = "PromptForSubmit";
 
 static QString defaultCommand()
 {
@@ -55,7 +56,8 @@ using namespace Subversion::Internal;
 
 SubversionSettings::SubversionSettings() :
     svnCommand(defaultCommand()),
-    useAuthentication(false)
+    useAuthentication(false),
+    promptToSubmit(true)
 {
 }
 
@@ -66,6 +68,7 @@ void SubversionSettings::fromSettings(QSettings *settings)
     useAuthentication = settings->value(QLatin1String(authenticationKeyC), QVariant(false)).toBool();
     user = settings->value(QLatin1String(userKeyC), QString()).toString();
     password =  settings->value(QLatin1String(passwordKeyC), QString()).toString();
+    promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool();
     settings->endGroup();
 }
 
@@ -76,6 +79,7 @@ void SubversionSettings::toSettings(QSettings *settings) const
     settings->setValue(QLatin1String(authenticationKeyC), QVariant(useAuthentication));
     settings->setValue(QLatin1String(userKeyC), user);
     settings->setValue(QLatin1String(passwordKeyC), password);
+    settings->setValue(QLatin1String(promptToSubmitKeyC), promptToSubmit);
     settings->endGroup();
 }
 
@@ -84,7 +88,8 @@ bool SubversionSettings::equals(const SubversionSettings &s) const
     return svnCommand        == s.svnCommand
         && useAuthentication == s.useAuthentication
         && user              == s.user
-        && password          == s.password;
+        && password          == s.password
+        && promptToSubmit   == s.promptToSubmit;
 }
 
 QStringList SubversionSettings::addOptions(const QStringList &args) const
diff --git a/src/plugins/subversion/subversionsettings.h b/src/plugins/subversion/subversionsettings.h
index eb00c49dcc8..963c2a5fa43 100644
--- a/src/plugins/subversion/subversionsettings.h
+++ b/src/plugins/subversion/subversionsettings.h
@@ -59,6 +59,7 @@ struct SubversionSettings
     bool useAuthentication;
     QString user;
     QString password;
+    bool promptToSubmit;
 };
 
 inline bool operator==(const SubversionSettings &p1, const SubversionSettings &p2)
diff --git a/src/plugins/vcsbase/vcsbasesettings.cpp b/src/plugins/vcsbase/vcsbasesettings.cpp
index 9036262704f..c40561173c1 100644
--- a/src/plugins/vcsbase/vcsbasesettings.cpp
+++ b/src/plugins/vcsbase/vcsbasesettings.cpp
@@ -35,7 +35,6 @@
 static const char *settingsGroupC = "VCS";
 static const char *nickNameMailMapKeyC = "NickNameMailMap";
 static const char *nickNameFieldListFileKeyC = "NickNameFieldListFile";
-static const char *promptForSubmitKeyC = "PromptForSubmit";
 static const char *submitMessageCheckScriptKeyC = "SubmitMessageCheckScript";
 static const char *lineWrapKeyC = "LineWrap";
 static const char *lineWrapWidthKeyC = "LineWrapWidth";
@@ -47,7 +46,6 @@ namespace VCSBase {
 namespace Internal {
 
 VCSBaseSettings::VCSBaseSettings() :
-    promptForSubmit(true),
     lineWrap(lineWrapDefault),
     lineWrapWidth(lineWrapWidthDefault)
 {
@@ -59,7 +57,6 @@ void VCSBaseSettings::toSettings(QSettings *s) const
     s->setValue(QLatin1String(nickNameMailMapKeyC), nickNameMailMap);
     s->setValue(QLatin1String(nickNameFieldListFileKeyC), nickNameFieldListFile);
     s->setValue(QLatin1String(submitMessageCheckScriptKeyC), submitMessageCheckScript);
-    s->setValue(QLatin1String(promptForSubmitKeyC), promptForSubmit);
     s->setValue(QLatin1String(lineWrapKeyC), lineWrap);
     s->setValue(QLatin1String(lineWrapWidthKeyC), lineWrapWidth);
     s->endGroup();
@@ -71,7 +68,6 @@ void VCSBaseSettings::fromSettings(QSettings *s)
     nickNameMailMap = s->value(QLatin1String(nickNameMailMapKeyC), QString()).toString();
     nickNameFieldListFile = s->value(QLatin1String(nickNameFieldListFileKeyC), QString()).toString();
     submitMessageCheckScript = s->value(QLatin1String(submitMessageCheckScriptKeyC), QString()).toString();
-    promptForSubmit = s->value(QLatin1String(promptForSubmitKeyC), QVariant(true)).toBool();
     lineWrap = s->value(QLatin1String(lineWrapKeyC), lineWrapDefault).toBool();
     lineWrapWidth = s->value(QLatin1String(lineWrapWidthKeyC), lineWrapWidthDefault).toInt();
     s->endGroup();
@@ -79,8 +75,7 @@ void VCSBaseSettings::fromSettings(QSettings *s)
 
 bool VCSBaseSettings::equals(const VCSBaseSettings &rhs) const
 {
-    return promptForSubmit == rhs.promptForSubmit
-           && lineWrap == rhs.lineWrap
+    return lineWrap == rhs.lineWrap
            && lineWrapWidth == rhs.lineWrapWidth
            && nickNameMailMap == rhs.nickNameMailMap
            && nickNameFieldListFile == rhs.nickNameFieldListFile
@@ -89,8 +84,7 @@ bool VCSBaseSettings::equals(const VCSBaseSettings &rhs) const
 
 QDebug operator<<(QDebug d,const VCSBaseSettings& s)
 {
-    d.nospace() << "promptForSubmit=" << s.promptForSubmit
-            << " lineWrap=" << s.lineWrap
+    d.nospace() << " lineWrap=" << s.lineWrap
             << " lineWrapWidth=" <<  s.lineWrapWidth
             << " nickNameMailMap='" <<  s.nickNameMailMap
             << "' nickNameFieldListFile='" << s.nickNameFieldListFile
diff --git a/src/plugins/vcsbase/vcsbasesettings.h b/src/plugins/vcsbase/vcsbasesettings.h
index fcf6f54df76..7f7d36328cd 100644
--- a/src/plugins/vcsbase/vcsbasesettings.h
+++ b/src/plugins/vcsbase/vcsbasesettings.h
@@ -45,8 +45,6 @@ namespace Internal {
 struct VCSBaseSettings {
     VCSBaseSettings();
 
-    bool promptForSubmit;
-
     QString nickNameMailMap;
     QString nickNameFieldListFile;
 
diff --git a/src/plugins/vcsbase/vcsbasesettingspage.cpp b/src/plugins/vcsbase/vcsbasesettingspage.cpp
index 24782d9e0d7..bfa6f8891be 100644
--- a/src/plugins/vcsbase/vcsbasesettingspage.cpp
+++ b/src/plugins/vcsbase/vcsbasesettingspage.cpp
@@ -66,7 +66,6 @@ VCSBaseSettings VCSBaseSettingsWidget::settings() const
     rc.nickNameMailMap = m_ui->nickNameMailMapChooser->path();
     rc.nickNameFieldListFile = m_ui->nickNameFieldsFileChooser->path();
     rc.submitMessageCheckScript = m_ui->submitMessageCheckScriptChooser->path();
-    rc.promptForSubmit = m_ui->promptForSubmitCheckBox->isChecked();
     rc.lineWrap= m_ui->lineWrapCheckBox->isChecked();
     rc.lineWrapWidth = m_ui->lineWrapSpinBox->value();
     return rc;
@@ -77,7 +76,6 @@ void VCSBaseSettingsWidget::setSettings(const VCSBaseSettings &s)
     m_ui->nickNameMailMapChooser->setPath(s.nickNameMailMap);
     m_ui->nickNameFieldsFileChooser->setPath(s.nickNameFieldListFile);
     m_ui->submitMessageCheckScriptChooser->setPath(s.submitMessageCheckScript);
-    m_ui->promptForSubmitCheckBox->setChecked(s.promptForSubmit);
     m_ui->lineWrapCheckBox->setChecked(s.lineWrap);
     m_ui->lineWrapSpinBox->setValue(s.lineWrapWidth);
 }
diff --git a/src/plugins/vcsbase/vcsbasesettingspage.ui b/src/plugins/vcsbase/vcsbasesettingspage.ui
index 50aa9cf94bd..b4c7e233160 100644
--- a/src/plugins/vcsbase/vcsbasesettingspage.ui
+++ b/src/plugins/vcsbase/vcsbasesettingspage.ui
@@ -21,13 +21,6 @@
        <layout class="QVBoxLayout" name="verticalLayout_2">
         <item>
          <layout class="QVBoxLayout" name="verticalLayout">
-          <item>
-           <widget class="QCheckBox" name="promptForSubmitCheckBox">
-            <property name="text">
-             <string>Prompt to submit</string>
-            </property>
-           </widget>
-          </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout">
             <item>
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index b54b1442480..05cb5708473 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -40,6 +40,7 @@
 #include <coreplugin/uniqueidmanager.h>
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <utils/submiteditorwidget.h>
+#include <utils/checkablemessagebox.h>
 #include <utils/submitfieldwidget.h>
 #include <find/basetextfind.h>
 #include <texteditor/fontsettings.h>
@@ -433,12 +434,13 @@ VCSBaseSubmitEditor::PromptSubmitResult
         VCSBaseSubmitEditor::promptSubmit(const QString &title,
                                           const QString &question,
                                           const QString &checkFailureQuestion,
+                                          bool *promptSetting,
                                           bool forcePrompt) const
 {
     QString errorMessage;
     QMessageBox::StandardButton answer = QMessageBox::Yes;
 
-    const bool prompt = forcePrompt || Internal::VCSBasePlugin::instance()->settings().promptForSubmit;
+    const bool prompt = forcePrompt || *promptSetting;
 
     QWidget *parent = Core::ICore::instance()->mainWindow();
     // Pop up a message depending on whether the check succeeded and the
@@ -446,9 +448,19 @@ VCSBaseSubmitEditor::PromptSubmitResult
     if (checkSubmitMessage(&errorMessage)) {
         // Check ok, do prompt?
         if (prompt) {
-            answer = QMessageBox::question(parent, title, question,
-                                  QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,
-                                  QMessageBox::Yes);
+            // Provide check box to turn off prompt ONLY if it was not forced
+            if (*promptSetting && !forcePrompt) {
+                const QDialogButtonBox::StandardButton danswer =
+                        Core::Utils::CheckableMessageBox::question(parent, title, question,
+                                                                   tr("Prompt to submit"), promptSetting,
+                                                                   QDialogButtonBox::Yes|QDialogButtonBox::No|QDialogButtonBox::Cancel,
+                                                                   QDialogButtonBox::Yes);
+                answer = Core::Utils::CheckableMessageBox::dialogButtonBoxToMessageBoxButton(danswer);
+            } else {
+                answer = QMessageBox::question(parent, title, question,
+                                               QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,
+                                               QMessageBox::Yes);
+            }
         }
     } else {
         // Check failed.
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h
index 7bade2dd334..a43a35befae 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.h
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h
@@ -112,9 +112,12 @@ public:
     // Runs checks on the message and prompts according to configuration.
     // Force prompt should be true if it is invoked by closing an editor
     // as opposed to invoking the "Submit" button.
+    // 'promptSetting' points to a bool variable containing the plugin's
+    // prompt setting. The user can uncheck it from the message box.
     enum PromptSubmitResult { SubmitConfirmed, SubmitCanceled, SubmitDiscarded };
     PromptSubmitResult promptSubmit(const QString &title, const QString &question,
                                     const QString &checkFailureQuestion,
+                                    bool *promptSetting,
                                     bool forcePrompt = false) const;
 
     int fileNameColumn() const;
-- 
GitLab