From a96cc1a33244ff6150173811a23839d44da2b6e1 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Fri, 9 Jul 2010 12:22:58 +0200 Subject: [PATCH] VCS[Perforce]: Add a setting to automatically open files when attempting to save a file under Perforce. Reviewed-by: con Task-number: QTCREATORBUG-1823 --- .../editormanager/editormanager.cpp | 21 +++++++++++++------ src/plugins/coreplugin/iversioncontrol.h | 15 +++++++++++++ src/plugins/perforce/perforcesettings.cpp | 19 +++++++++++++++-- src/plugins/perforce/perforcesettings.h | 3 +++ .../perforce/perforceversioncontrol.cpp | 8 +++++++ src/plugins/perforce/perforceversioncontrol.h | 1 + src/plugins/perforce/settingspage.cpp | 2 ++ src/plugins/perforce/settingspage.ui | 17 +++++++-------- src/plugins/qt4projectmanager/qt4nodes.cpp | 2 +- 9 files changed, 70 insertions(+), 18 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index a9eb40b6868..ab04d11f7ff 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1389,13 +1389,22 @@ EditorManager::ReadOnlyAction QWidget *parent, bool displaySaveAsButton) { + // Version Control: If automatic open is desired, open right away. + bool promptVCS = false; + if (versionControl && versionControl->supportsOperation(IVersionControl::OpenOperation)) { + if (versionControl->settingsFlags() & IVersionControl::AutoOpen) + return RO_OpenVCS; + promptVCS = true; + } + + // Create message box. QMessageBox msgBox(QMessageBox::Question, tr("File is Read Only"), - tr("The file %1 is read only.").arg(QDir::toNativeSeparators(fileName)), + tr("The file <i>%1</i> is read only.").arg(QDir::toNativeSeparators(fileName)), QMessageBox::Cancel, parent); - QPushButton *sccButton = 0; - if (versionControl && versionControl->supportsOperation(IVersionControl::OpenOperation)) - sccButton = msgBox.addButton(tr("Open with VCS (%1)").arg(versionControl->displayName()), QMessageBox::AcceptRole); + QPushButton *vcsButton = 0; + if (promptVCS) + vcsButton = msgBox.addButton(tr("Open with VCS (%1)").arg(versionControl->displayName()), QMessageBox::AcceptRole); QPushButton *makeWritableButton = msgBox.addButton(tr("Make writable"), QMessageBox::AcceptRole); @@ -1403,11 +1412,11 @@ EditorManager::ReadOnlyAction if (displaySaveAsButton) saveAsButton = msgBox.addButton(tr("Save as ..."), QMessageBox::ActionRole); - msgBox.setDefaultButton(sccButton ? sccButton : makeWritableButton); + msgBox.setDefaultButton(vcsButton ? vcsButton : makeWritableButton); msgBox.exec(); QAbstractButton *clickedButton = msgBox.clickedButton(); - if (clickedButton == sccButton) + if (clickedButton == vcsButton) return RO_OpenVCS; if (clickedButton == makeWritableButton) return RO_MakeWriteable; diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index 0cd29f94388..c402c1fb77c 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -34,13 +34,20 @@ #include <QtCore/QObject> #include <QtCore/QString> +#include <QtCore/QFlags> namespace Core { class CORE_EXPORT IVersionControl : public QObject { Q_OBJECT + Q_ENUMS(SettingsFlag Operation) public: + enum SettingsFlag { + AutoOpen = 0x1 + }; + Q_DECLARE_FLAGS(SettingsFlags, SettingsFlag) + enum Operation { AddOperation, DeleteOperation, OpenOperation, MoveOperation, CreateRepositoryOperation, @@ -76,6 +83,12 @@ public: */ virtual bool vcsOpen(const QString &fileName) = 0; + /*! + * Returns settings. + */ + + virtual SettingsFlags settingsFlags() const { return 0; } + /*! * Called after a file has been added to a project If the version control * needs to know which files it needs to track you should reimplement this @@ -137,6 +150,8 @@ signals: // virtual bool sccManaged(const QString &filename) = 0; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(Core::IVersionControl::SettingsFlags) + } // namespace Core #endif // IVERSIONCONTROL_H diff --git a/src/plugins/perforce/perforcesettings.cpp b/src/plugins/perforce/perforcesettings.cpp index 745f6ab1a67..7cf1f8712d3 100644 --- a/src/plugins/perforce/perforcesettings.cpp +++ b/src/plugins/perforce/perforcesettings.cpp @@ -46,6 +46,7 @@ static const char *portKeyC = "Port"; static const char *clientKeyC = "Client"; static const char *userKeyC = "User"; static const char *promptToSubmitKeyC = "PromptForSubmit"; +static const char *autoOpenKeyC = "PromptToOpen"; static const char *timeOutKeyC = "TimeOut"; static const char *logCountKeyC = "LogCount"; @@ -68,7 +69,8 @@ Settings::Settings() : logCount(defaultLogCount), defaultEnv(true), timeOutS(defaultTimeOutS), - promptToSubmit(true) + promptToSubmit(true), + autoOpen(true) { } @@ -78,7 +80,8 @@ bool Settings::equals(const Settings &rhs) const && logCount == rhs.logCount && p4Command == rhs.p4Command && p4Port == rhs.p4Port && p4Client == rhs.p4Client && p4User == rhs.p4User - && timeOutS == rhs.timeOutS && promptToSubmit == rhs.promptToSubmit; + && timeOutS == rhs.timeOutS && promptToSubmit == rhs.promptToSubmit + && autoOpen == rhs.autoOpen; }; QStringList Settings::commonP4Arguments() const @@ -115,6 +118,7 @@ void PerforceSettings::fromSettings(QSettings *settings) m_settings.timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt(); m_settings.promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool(); m_settings.logCount = settings->value(QLatin1String(logCountKeyC), int(defaultLogCount)).toInt(); + m_settings.autoOpen = settings->value(QLatin1String(autoOpenKeyC), true).toBool(); settings->endGroup(); } @@ -129,6 +133,7 @@ void PerforceSettings::toSettings(QSettings *settings) const settings->setValue(QLatin1String(timeOutKeyC), m_settings.timeOutS); settings->setValue(QLatin1String(promptToSubmitKeyC), m_settings.promptToSubmit); settings->setValue(QLatin1String(logCountKeyC), m_settings.logCount); + settings->setValue(QLatin1String(autoOpenKeyC), m_settings.autoOpen); settings->endGroup(); } @@ -180,6 +185,16 @@ void PerforceSettings::setPromptToSubmit(bool p) m_settings.promptToSubmit = p; } +bool PerforceSettings::autoOpen() const +{ + return m_settings.autoOpen; +} + +void PerforceSettings::setAutoOpen(bool b) +{ + m_settings.autoOpen = b; +} + QString PerforceSettings::topLevel() const { return m_topLevel; diff --git a/src/plugins/perforce/perforcesettings.h b/src/plugins/perforce/perforcesettings.h index 803645237fa..cdb1ee0675b 100644 --- a/src/plugins/perforce/perforcesettings.h +++ b/src/plugins/perforce/perforcesettings.h @@ -61,6 +61,7 @@ struct Settings { bool defaultEnv; int timeOutS; bool promptToSubmit; + bool autoOpen; }; inline bool operator==(const Settings &s1, const Settings &s2) { return s1.equals(s2); } @@ -122,6 +123,8 @@ public: bool defaultEnv() const; bool promptToSubmit() const; void setPromptToSubmit(bool p); + bool autoOpen() const; + void setAutoOpen(bool p); // Return basic arguments, including -d and server connection parameters. QStringList commonP4Arguments(const QString &workingDir) const; diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp index 2dc414f59cd..0f0a5e81905 100644 --- a/src/plugins/perforce/perforceversioncontrol.cpp +++ b/src/plugins/perforce/perforceversioncontrol.cpp @@ -70,6 +70,14 @@ bool PerforceVersionControl::vcsOpen(const QString &fileName) return m_plugin->vcsOpen(fi.absolutePath(), fi.fileName()); } +Core::IVersionControl::SettingsFlags PerforceVersionControl::settingsFlags() const +{ + SettingsFlags rc; + if (m_plugin->settings().autoOpen()) + rc|= AutoOpen; + return rc; +}; + bool PerforceVersionControl::vcsAdd(const QString &fileName) { const QFileInfo fi(fileName); diff --git a/src/plugins/perforce/perforceversioncontrol.h b/src/plugins/perforce/perforceversioncontrol.h index 1e14cd2810f..b3a01f7a6c0 100644 --- a/src/plugins/perforce/perforceversioncontrol.h +++ b/src/plugins/perforce/perforceversioncontrol.h @@ -50,6 +50,7 @@ public: virtual bool supportsOperation(Operation operation) const; virtual bool vcsOpen(const QString &fileName); + virtual SettingsFlags settingsFlags() const; virtual bool vcsAdd(const QString &fileName); virtual bool vcsDelete(const QString &filename); virtual bool vcsMove(const QString &from, const QString &to); diff --git a/src/plugins/perforce/settingspage.cpp b/src/plugins/perforce/settingspage.cpp index 5bdfe0f5478..47fa6c9d24b 100644 --- a/src/plugins/perforce/settingspage.cpp +++ b/src/plugins/perforce/settingspage.cpp @@ -85,6 +85,7 @@ Settings SettingsPageWidget::settings() const settings.timeOutS = m_ui.timeOutSpinBox->value(); settings.logCount = m_ui.logCountSpinBox->value(); settings.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked(); + settings.autoOpen = m_ui.autoOpenCheckBox->isChecked(); return settings; } @@ -98,6 +99,7 @@ void SettingsPageWidget::setSettings(const PerforceSettings &s) m_ui.logCountSpinBox->setValue(s.logCount()); m_ui.timeOutSpinBox->setValue(s.timeOutS()); m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit()); + m_ui.autoOpenCheckBox->setChecked(s.autoOpen()); } void SettingsPageWidget::setStatusText(const QString &t) diff --git a/src/plugins/perforce/settingspage.ui b/src/plugins/perforce/settingspage.ui index 6f270415089..e62622038ba 100644 --- a/src/plugins/perforce/settingspage.ui +++ b/src/plugins/perforce/settingspage.ui @@ -2,14 +2,6 @@ <ui version="4.0"> <class>Perforce::Internal::SettingsPage</class> <widget class="QWidget" name="Perforce::Internal::SettingsPage"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>437</width> - <height>407</height> - </rect> - </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="configGroupBox"> @@ -25,7 +17,7 @@ </widget> </item> <item row="0" column="1"> - <widget class="Utils::PathChooser" name="pathChooser"/> + <widget class="Utils::PathChooser" name="pathChooser" native="true"/> </item> </layout> </widget> @@ -134,6 +126,13 @@ </property> </widget> </item> + <item row="3" column="0" colspan="2"> + <widget class="QCheckBox" name="autoOpenCheckBox"> + <property name="text"> + <string>Automatically open files when editing</string> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 9d91bf4effd..bd2b15dc517 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -674,7 +674,7 @@ bool Qt4PriFileNode::priFileWritable(const QString &path) switch (Core::EditorManager::promptReadOnlyFile(path, versionControl, core->mainWindow(), false)) { case Core::EditorManager::RO_OpenVCS: if (!versionControl->vcsOpen(path)) { - QMessageBox::warning(core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with SCC.")); + QMessageBox::warning(core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with VCS.")); return false; } break; -- GitLab