diff --git a/src/plugins/mercurial/clonewizard.cpp b/src/plugins/mercurial/clonewizard.cpp index 8f257ee8de3d9f340f14510d828826bfd6284ae4..6dc14b532e3dfa53f66eba8d58dde33bcbfd3321 100644 --- a/src/plugins/mercurial/clonewizard.cpp +++ b/src/plugins/mercurial/clonewizard.cpp @@ -76,15 +76,15 @@ QSharedPointer<VCSBase::AbstractCheckoutJob> CloneWizard::createJob(const QList< if (!page) return QSharedPointer<VCSBase::AbstractCheckoutJob>(); - MercurialSettings *settings = MercurialPlugin::instance()->settings(); + const MercurialSettings &settings = MercurialPlugin::instance()->settings(); - QStringList args = settings->standardArguments(); + QStringList args = settings.standardArguments(); QString path = page->path(); QString directory = page->directory(); args << QLatin1String("clone") << page->repository() << directory; *checkoutPath = path + QLatin1Char('/') + directory; - return QSharedPointer<VCSBase::AbstractCheckoutJob>(new VCSBase::ProcessCheckoutJob(settings->binary(), + return QSharedPointer<VCSBase::AbstractCheckoutJob>(new VCSBase::ProcessCheckoutJob(settings.binary(), args, path)); } diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index bf7d7b67d965746876fe12c2dbbb86383a15df89..aa54e079259d3ec9934585fd51ed760e8d44469a 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -60,11 +60,10 @@ inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property return 0; } -MercurialClient::MercurialClient() - : core(Core::ICore::instance()) +MercurialClient::MercurialClient() : + jobManager(0), + core(Core::ICore::instance()) { - jobManager = new MercurialJobRunner(); - jobManager->start(); } MercurialClient::~MercurialClient() @@ -118,9 +117,9 @@ bool MercurialClient::executeHgSynchronously(const QFileInfo &file, const QStrin QProcess hgProcess; hgProcess.setWorkingDirectory(file.isDir() ? file.absoluteFilePath() : file.absolutePath()); - const MercurialSettings *settings = MercurialPlugin::instance()->settings(); - const QString binary = settings->binary(); - const QStringList arguments = MercurialPlugin::instance()->standardArguments() + args; + const MercurialSettings &settings = MercurialPlugin::instance()->settings(); + const QString binary = settings.binary(); + const QStringList arguments = settings.standardArguments() + args; VCSBase::VCSBaseOutputWindow *outputWindow = VCSBase::VCSBaseOutputWindow::instance(); outputWindow->appendCommand(MercurialJobRunner::msgExecute(binary, arguments)); @@ -134,9 +133,9 @@ bool MercurialClient::executeHgSynchronously(const QFileInfo &file, const QStrin hgProcess.closeWriteChannel(); - if (!hgProcess.waitForFinished(settings->timeout())) { + if (!hgProcess.waitForFinished(settings.timeoutMilliSeconds())) { hgProcess.terminate(); - outputWindow->appendError(MercurialJobRunner::msgTimeout(settings->timeout())); + outputWindow->appendError(MercurialJobRunner::msgTimeout(settings.timeoutSeconds())); return false; } @@ -170,7 +169,7 @@ void MercurialClient::annotate(const QFileInfo &file) "annotate", file.absoluteFilePath()); QSharedPointer<HgTask> job(new HgTask(file.absolutePath(), args, editor)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::diff(const QFileInfo &fileOrDir) @@ -198,7 +197,7 @@ void MercurialClient::diff(const QFileInfo &fileOrDir) "diff", id); QSharedPointer<HgTask> job(new HgTask(workingPath, args, editor)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::log(const QFileInfo &fileOrDir) @@ -223,7 +222,7 @@ void MercurialClient::log(const QFileInfo &fileOrDir) "log", id); QSharedPointer<HgTask> job(new HgTask(workingDir, args, editor)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision) @@ -239,7 +238,7 @@ void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() : fileOrDir.absolutePath(), args, false)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::status(const QFileInfo &fileOrDir) @@ -250,7 +249,7 @@ void MercurialClient::status(const QFileInfo &fileOrDir) QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() : fileOrDir.absolutePath(), args, false)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::statusWithSignal(const QFileInfo &repositoryRoot) @@ -261,7 +260,7 @@ void MercurialClient::statusWithSignal(const QFileInfo &repositoryRoot) connect(job.data(), SIGNAL(rawData(QByteArray)), this, SLOT(statusParser(QByteArray))); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::statusParser(const QByteArray &data) @@ -302,7 +301,7 @@ void MercurialClient::import(const QFileInfo &repositoryRoot, const QStringList args += files; QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repository) @@ -312,7 +311,7 @@ void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repos args.append(repository); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::push(const QFileInfo &repositoryRoot, const QString &repository) @@ -322,7 +321,7 @@ void MercurialClient::push(const QFileInfo &repositoryRoot, const QString &repos args.append(repository); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::incoming(const QFileInfo &repositoryRoot, const QString &repository) @@ -341,7 +340,7 @@ void MercurialClient::incoming(const QFileInfo &repositoryRoot, const QString &r true, "incoming", id); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::outgoing(const QFileInfo &repositoryRoot) @@ -358,7 +357,7 @@ void MercurialClient::outgoing(const QFileInfo &repositoryRoot) "outgoing", id); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::view(const QString &source, const QString &id) @@ -374,7 +373,7 @@ void MercurialClient::view(const QString &source, const QString &id) true, "view", id); QSharedPointer<HgTask> job(new HgTask(source, args, editor)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &revision) @@ -384,7 +383,7 @@ void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &rev args << revision; QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); - jobManager->enqueueJob(job); + enqueueJob(job); } void MercurialClient::commit(const QFileInfo &repositoryRoot, const QStringList &files, @@ -395,7 +394,7 @@ void MercurialClient::commit(const QFileInfo &repositoryRoot, const QStringList args << QLatin1String("-u") << committerInfo; args << QLatin1String("-l") << commitMessageFile << files; QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); - jobManager->enqueueJob(job); + enqueueJob(job); } QString MercurialClient::findTopLevelForFile(const QFileInfo &file) @@ -443,3 +442,12 @@ VCSBase::VCSBaseEditor *MercurialClient::createVCSEditor(const QString &kind, QS core->editorManager()->activateEditor(outputEditor); return baseEditor; } + +void MercurialClient::enqueueJob(const QSharedPointer<HgTask> &job) +{ + if (!jobManager) { + jobManager = new MercurialJobRunner(); + jobManager->start(); + } + jobManager->enqueueJob(job); +} diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h index a6894e5ba1bd769b2d5ea869a4b95abd3ecd7a8c..bd0c9f8771e0d5db0cfa10e313bb282b681e84ba 100644 --- a/src/plugins/mercurial/mercurialclient.h +++ b/src/plugins/mercurial/mercurialclient.h @@ -32,6 +32,7 @@ #include <QtCore/QObject> #include <QtCore/QPair> +#include <QtCore/QSharedPointer> QT_BEGIN_NAMESPACE class QFileInfo; @@ -49,6 +50,7 @@ namespace Mercurial { namespace Internal { class MercurialJobRunner; +class HgTask; class MercurialClient : public QObject { @@ -90,6 +92,7 @@ private slots: private: bool executeHgSynchronously(const QFileInfo &file, const QStringList &args, QByteArray *output=0) const; + void enqueueJob(const QSharedPointer<HgTask> &); MercurialJobRunner *jobManager; Core::ICore *core; diff --git a/src/plugins/mercurial/mercurialjobrunner.cpp b/src/plugins/mercurial/mercurialjobrunner.cpp index eda9f806d7915cfe22900751fd784f58eca8a81b..3b27594f339b9a21be2c60bf89ee1b7fcf8b2d00 100644 --- a/src/plugins/mercurial/mercurialjobrunner.cpp +++ b/src/plugins/mercurial/mercurialjobrunner.cpp @@ -97,10 +97,10 @@ void MercurialJobRunner::restart() void MercurialJobRunner::getSettings() { - const MercurialSettings *settings = MercurialPlugin::instance()->settings(); - binary = settings->binary(); - timeout = settings->timeout(); - standardArguments = settings->standardArguments(); + const MercurialSettings &settings = MercurialPlugin::instance()->settings(); + binary = settings.binary(); + timeout = settings.timeoutMilliSeconds(); + standardArguments = settings.standardArguments(); } void MercurialJobRunner::enqueueJob(const QSharedPointer<HgTask> &job) @@ -142,9 +142,9 @@ QString MercurialJobRunner::msgStartFailed(const QString &binary, const QString return tr("Unable to start mercurial process '%1': %2").arg(binary, why); } -QString MercurialJobRunner::msgTimeout(int timeoutMS) +QString MercurialJobRunner::msgTimeout(int timeoutSeconds) { - return tr("Timed out after %1ms waiting for mercurial process to finish.").arg(timeoutMS); + return tr("Timed out after %1s waiting for mercurial process to finish.").arg(timeoutSeconds); } void MercurialJobRunner::task(const QSharedPointer<HgTask> &job) @@ -192,7 +192,7 @@ void MercurialJobRunner::task(const QSharedPointer<HgTask> &job) if (!hgProcess.waitForFinished(timeout)) { hgProcess.terminate(); - emit error(msgTimeout(timeout)); + emit error(msgTimeout(timeout / 1000)); return; } diff --git a/src/plugins/mercurial/mercurialjobrunner.h b/src/plugins/mercurial/mercurialjobrunner.h index 8f477abd88305441ca703a8059e8302ba97c9a00..bac9c650d57a92c1db523cc62d0d141e66b21dea 100644 --- a/src/plugins/mercurial/mercurialjobrunner.h +++ b/src/plugins/mercurial/mercurialjobrunner.h @@ -83,7 +83,7 @@ public: static QString msgExecute(const QString &binary, const QStringList &args); static QString msgStartFailed(const QString &binary, const QString &why); - static QString msgTimeout(int timeoutMS); + static QString msgTimeout(int timeoutSeconds); protected: void run(); diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp index c3a020a95d9a7753b206ed300314c1b939562cf8..97f8df943765d6c6302615c0303476fe64dfea5b 100644 --- a/src/plugins/mercurial/mercurialplugin.cpp +++ b/src/plugins/mercurial/mercurialplugin.cpp @@ -121,8 +121,7 @@ static inline const VCSBase::VCSBaseEditorParameters *findType(int ie) MercurialPlugin *MercurialPlugin::m_instance = 0; -MercurialPlugin::MercurialPlugin() - : mercurialSettings(new MercurialSettings), +MercurialPlugin::MercurialPlugin() : optionsPage(0), client(0), mercurialVC(0), @@ -139,11 +138,6 @@ MercurialPlugin::~MercurialPlugin() client = 0; } - if (mercurialSettings) { - delete mercurialSettings; - mercurialSettings = 0; - } - deleteCommitLog(); m_instance = 0; @@ -161,6 +155,7 @@ bool MercurialPlugin::initialize(const QStringList &arguments, QString *error_me optionsPage = new OptionsPage(); addAutoReleasedObject(optionsPage); + mercurialSettings.readSettings(core->settings()); client = new MercurialClient(); connect(optionsPage, SIGNAL(settingsChanged()), client, SLOT(settingsChanged())); @@ -194,14 +189,21 @@ void MercurialPlugin::extensionsInitialized() this, SLOT(currentProjectChanged(ProjectExplorer::Project *))); } -MercurialSettings *MercurialPlugin::settings() +const MercurialSettings &MercurialPlugin::settings() const { return mercurialSettings; } +void MercurialPlugin::setSettings(const MercurialSettings &settings) +{ + if (settings != mercurialSettings) { + mercurialSettings = settings; + } +} + QStringList MercurialPlugin::standardArguments() const { - return mercurialSettings->standardArguments(); + return mercurialSettings.standardArguments(); } void MercurialPlugin::createMenu() @@ -530,8 +532,8 @@ void MercurialPlugin::showCommitWidget(const QList<QPair<QString, QString> > &st QString branch = client->branchQuerySync(currentProjectRoot()); - commitEditor->setFields(currentProjectRoot(), branch, mercurialSettings->userName(), - mercurialSettings->email(), status); + commitEditor->setFields(currentProjectRoot(), branch, mercurialSettings.userName(), + mercurialSettings.email(), status); commitEditor->registerActions(editorUndo, editorRedo, editorCommit, editorDiff); connect(commitEditor, SIGNAL(diffSelectedFiles(const QStringList &)), @@ -564,11 +566,11 @@ bool MercurialPlugin::closeEditor(Core::IEditor *editor) if (!editorFile || !commitEditor) return true; - bool dummyPrompt = settings()->prompt(); + bool dummyPrompt = mercurialSettings.prompt(); const VCSBase::VCSBaseSubmitEditor::PromptSubmitResult response = commitEditor->promptSubmit(tr("Close commit editor"), tr("Do you want to commit the changes?"), tr("Message check failed. Do you want to proceed?"), - &dummyPrompt, settings()->prompt()); + &dummyPrompt, mercurialSettings.prompt()); switch (response) { case VCSBase::VCSBaseSubmitEditor::SubmitCanceled: diff --git a/src/plugins/mercurial/mercurialplugin.h b/src/plugins/mercurial/mercurialplugin.h index 3cd397c6bcc1940b976a2f24042d697557406807..84654eb1f9c0a6e0c16b5d7743ab90dbd3305179 100644 --- a/src/plugins/mercurial/mercurialplugin.h +++ b/src/plugins/mercurial/mercurialplugin.h @@ -30,6 +30,8 @@ #ifndef MERCURIALPLUGIN_H #define MERCURIALPLUGIN_H +#include "mercurialsettings.h" + #include <extensionsystem/iplugin.h> #include <coreplugin/icorelistener.h> @@ -85,7 +87,8 @@ public: bool closeEditor(Core::IEditor *editor); QStringList standardArguments() const; - MercurialSettings *settings(); + const MercurialSettings &settings() const; + void setSettings(const MercurialSettings &settings); private slots: // File menu action Slots @@ -146,7 +149,7 @@ private: //Variables static MercurialPlugin *m_instance; - MercurialSettings *mercurialSettings; + MercurialSettings mercurialSettings; OptionsPage *optionsPage; MercurialClient *client; diff --git a/src/plugins/mercurial/mercurialsettings.cpp b/src/plugins/mercurial/mercurialsettings.cpp index 55a3ae31fa3f76cd4a7ec7c769d337e3d4cbf354..1105b308f40a9f21fa54564f133e5a96c74e2744 100644 --- a/src/plugins/mercurial/mercurialsettings.cpp +++ b/src/plugins/mercurial/mercurialsettings.cpp @@ -30,40 +30,53 @@ #include "mercurialsettings.h" #include "constants.h" -#include <coreplugin/icore.h> #include <QtCore/QSettings> - using namespace Mercurial::Internal; -MercurialSettings::MercurialSettings() +enum { timeOutDefaultSeconds = 30 }; + +MercurialSettings::MercurialSettings() : + m_binary(QLatin1String(Constants::MERCURIALDEFAULT)), + m_logCount(0), + m_timeoutSeconds(timeOutDefaultSeconds), + m_prompt(true) { - readSettings(); } QString MercurialSettings::binary() const { - return bin; + return m_binary; } -QString MercurialSettings::application() const +void MercurialSettings::setBinary(const QString &b) { - return app; + m_binary = b; } QStringList MercurialSettings::standardArguments() const { - return standardArgs; + return m_standardArguments; } QString MercurialSettings::userName() const { - return user; + return m_user; +} + +void MercurialSettings::setUserName(const QString &u) +{ + m_user = u; } QString MercurialSettings::email() const { - return mail; + return m_mail; +} + +void MercurialSettings::setEmail(const QString &m) +{ + m_mail = m; } int MercurialSettings::logCount() const @@ -71,16 +84,26 @@ int MercurialSettings::logCount() const return m_logCount; } -int MercurialSettings::timeout() const +void MercurialSettings::setLogCount(int l) +{ + m_logCount = l; +} + +int MercurialSettings::timeoutMilliSeconds() const { //return timeout is in Ms - return m_timeout * 1000; + return m_timeoutSeconds * 1000; } int MercurialSettings::timeoutSeconds() const { //return timeout in seconds (as the user specifies on the options page - return m_timeout; + return m_timeoutSeconds; +} + +void MercurialSettings::setTimeoutSeconds(int s) +{ + m_timeoutSeconds = s; } bool MercurialSettings::prompt() const @@ -88,50 +111,39 @@ bool MercurialSettings::prompt() const return m_prompt; } -void MercurialSettings::writeSettings(const QString &application, const QString &userName, - const QString &email, int logCount, int timeout, bool prompt) -{ - QSettings *settings = Core::ICore::instance()->settings(); - if (settings) { - settings->beginGroup(QLatin1String("Mercurial")); - settings->setValue(QLatin1String(Constants::MERCURIALPATH), application); - settings->setValue(QLatin1String(Constants::MERCURIALUSERNAME), userName); - settings->setValue(QLatin1String(Constants::MERCURIALEMAIL), email); - settings->setValue(QLatin1String(Constants::MERCURIALLOGCOUNT), logCount); - settings->setValue(QLatin1String(Constants::MERCURIALTIMEOUT), timeout); - settings->setValue(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), prompt); - settings->endGroup(); - } - - app = application; - user = userName; - mail = email; - m_logCount = logCount; - m_timeout = timeout; - m_prompt = prompt; - setBinAndArgs(); -} - -void MercurialSettings::readSettings() -{ - QSettings *settings = Core::ICore::instance()->settings(); - if (settings) { - settings->beginGroup(QLatin1String("Mercurial")); - app = settings->value(QLatin1String(Constants::MERCURIALPATH), - QLatin1String(Constants::MERCURIALDEFAULT)).toString(); - user = settings->value(QLatin1String(Constants::MERCURIALUSERNAME), QString()).toString(); - mail = settings->value(QLatin1String(Constants::MERCURIALEMAIL), QString()).toString(); - m_logCount = settings->value(QLatin1String(Constants::MERCURIALLOGCOUNT), 0).toInt(); - m_timeout = settings->value(QLatin1String(Constants::MERCURIALTIMEOUT), 30).toInt(); - m_prompt = settings->value(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), true).toBool(); - settings->endGroup(); - } - - setBinAndArgs(); -} - -void MercurialSettings::setBinAndArgs() -{ - standardArgs.clear(); - bin = app; +void MercurialSettings::setPrompt(bool b) +{ + m_prompt = b; +} + +void MercurialSettings::writeSettings(QSettings *settings) const +{ + settings->beginGroup(QLatin1String("Mercurial")); + settings->setValue(QLatin1String(Constants::MERCURIALPATH), m_binary); + settings->setValue(QLatin1String(Constants::MERCURIALUSERNAME), m_user); + settings->setValue(QLatin1String(Constants::MERCURIALEMAIL), m_mail); + settings->setValue(QLatin1String(Constants::MERCURIALLOGCOUNT), m_logCount); + settings->setValue(QLatin1String(Constants::MERCURIALTIMEOUT), m_timeoutSeconds); + settings->setValue(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), m_prompt); + settings->endGroup(); +} + +void MercurialSettings::readSettings(const QSettings *settings) +{ + const QString keyRoot = QLatin1String("Mercurial/"); + m_binary = settings->value(keyRoot + QLatin1String(Constants::MERCURIALPATH), + QLatin1String(Constants::MERCURIALDEFAULT)).toString(); + m_user = settings->value(keyRoot + QLatin1String(Constants::MERCURIALUSERNAME), QString()).toString(); + m_mail = settings->value(keyRoot + QLatin1String(Constants::MERCURIALEMAIL), QString()).toString(); + m_logCount = settings->value(keyRoot + QLatin1String(Constants::MERCURIALLOGCOUNT), 0).toInt(); + m_timeoutSeconds = settings->value(keyRoot + QLatin1String(Constants::MERCURIALTIMEOUT), timeOutDefaultSeconds).toInt(); + m_prompt = settings->value(keyRoot + QLatin1String(Constants::MERCURIALPROMPTSUBMIT), true).toBool(); +} + +bool MercurialSettings::equals(const MercurialSettings &rhs) const +{ + return m_binary == rhs.m_binary && m_standardArguments == rhs.m_standardArguments + && m_user == rhs.m_user && m_mail == rhs.m_mail + && m_logCount == rhs.m_logCount && m_timeoutSeconds == rhs.m_timeoutSeconds + && m_prompt == rhs.m_prompt; } diff --git a/src/plugins/mercurial/mercurialsettings.h b/src/plugins/mercurial/mercurialsettings.h index e4a91628a190a0582b0b712848cc27e4e36b02d8..57304fa78111a547ae7c1e0633ac753a6fa2386d 100644 --- a/src/plugins/mercurial/mercurialsettings.h +++ b/src/plugins/mercurial/mercurialsettings.h @@ -33,6 +33,10 @@ #include <QtCore/QString> #include <QtCore/QStringList> +QT_BEGIN_NAMESPACE +class QSettings; +QT_END_NAMESPACE + namespace Mercurial { namespace Internal { @@ -42,32 +46,50 @@ public: MercurialSettings(); QString binary() const; - QString application() const; + void setBinary(const QString &); + + // Calculated. QStringList standardArguments() const; + QString userName() const; + void setUserName(const QString &); + QString email() const; + void setEmail(const QString &); + int logCount() const; - int timeout() const; + void setLogCount(int l); + + int timeoutMilliSeconds() const; int timeoutSeconds() const; + void setTimeoutSeconds(int s); + bool prompt() const; - void writeSettings(const QString &application, const QString &userName, - const QString &email, int logCount, int timeout, bool prompt); + void setPrompt(bool b); + + void writeSettings(QSettings *settings) const; + void readSettings(const QSettings *settings); + + bool equals(const MercurialSettings &rhs) const; + private: void readSettings(); - void setBinAndArgs(); - - QString bin; // used because windows requires cmd.exe to run the mercurial binary - // in this case the actual mercurial binary will be part of the standard args - QString app; // this is teh actual mercurial executable - QStringList standardArgs; - QString user; - QString mail; + + QString m_binary; + QStringList m_standardArguments; + QString m_user; + QString m_mail; int m_logCount; - int m_timeout; + int m_timeoutSeconds; bool m_prompt; }; +inline bool operator==(const MercurialSettings &s1, const MercurialSettings &s2) +{ return s1.equals(s2); } +inline bool operator!=(const MercurialSettings &s1, const MercurialSettings &s2) +{ return !s1.equals(s2); } + } //namespace Internal } //namespace Mercurial diff --git a/src/plugins/mercurial/optionspage.cpp b/src/plugins/mercurial/optionspage.cpp index f3f1d55b6ba5e089a78401fa3ff390f7b43cce21..538dd77275c58f80ca66460ed3b639172b18c7bd 100644 --- a/src/plugins/mercurial/optionspage.cpp +++ b/src/plugins/mercurial/optionspage.cpp @@ -31,6 +31,7 @@ #include "mercurialsettings.h" #include "mercurialplugin.h" +#include <coreplugin/icore.h> #include <utils/pathchooser.h> #include <vcsbase/vcsbaseconstants.h> @@ -45,24 +46,26 @@ OptionsPageWidget::OptionsPageWidget(QWidget *parent) : m_ui.commandChooser->setPromptDialogTitle(tr("Mercurial Command")); } -void OptionsPageWidget::updateOptions() +MercurialSettings OptionsPageWidget::settings() const { - MercurialSettings *settings = MercurialPlugin::instance()->settings(); - m_ui.commandChooser->setPath(settings->application()); - m_ui.defaultUsernameLineEdit->setText(settings->userName()); - m_ui.defaultEmailLineEdit->setText(settings->email()); - m_ui.logEntriesCount->setValue(settings->logCount()); - m_ui.timeout->setValue(settings->timeoutSeconds()); - m_ui.promptOnSubmitCheckBox->setChecked(settings->prompt()); + MercurialSettings rc; + rc.setBinary(m_ui.commandChooser->path()); + rc.setUserName(m_ui.defaultUsernameLineEdit->text().trimmed()); + rc.setEmail(m_ui.defaultEmailLineEdit->text().trimmed()); + rc.setLogCount(m_ui.logEntriesCount->value()); + rc.setTimeoutSeconds(m_ui.timeout->value()); + rc.setPrompt(m_ui.promptOnSubmitCheckBox->isChecked()); + return rc; } -void OptionsPageWidget::saveOptions() +void OptionsPageWidget::setSettings(const MercurialSettings &s) { - MercurialSettings *settings = MercurialPlugin::instance()->settings(); - - settings->writeSettings(m_ui.commandChooser->path(), m_ui.defaultUsernameLineEdit->text(), - m_ui.defaultEmailLineEdit->text(), m_ui.logEntriesCount->value(), - m_ui.timeout->value(), m_ui.promptOnSubmitCheckBox->isChecked()); + m_ui.commandChooser->setPath(s.binary()); + m_ui.defaultUsernameLineEdit->setText(s.userName()); + m_ui.defaultEmailLineEdit->setText(s.email()); + m_ui.logEntriesCount->setValue(s.logCount()); + m_ui.timeout->setValue(s.timeoutSeconds()); + m_ui.promptOnSubmitCheckBox->setChecked(s.prompt()); } OptionsPage::OptionsPage() @@ -93,7 +96,7 @@ QWidget *OptionsPage::createPage(QWidget *parent) { if (!optionsPageWidget) optionsPageWidget = new OptionsPageWidget(parent); - optionsPageWidget.data()->updateOptions(); + optionsPageWidget->setSettings(MercurialPlugin::instance()->settings()); return optionsPageWidget; } @@ -101,8 +104,13 @@ void OptionsPage::apply() { if (!optionsPageWidget) return; - optionsPageWidget.data()->saveOptions(); - //assume success and emit signal that settings are changed; - emit settingsChanged(); + MercurialPlugin *plugin = MercurialPlugin::instance(); + const MercurialSettings newSettings = optionsPageWidget->settings(); + if (newSettings != plugin->settings()) { + //assume success and emit signal that settings are changed; + plugin->setSettings(newSettings); + newSettings.writeSettings(Core::ICore::instance()->settings()); + emit settingsChanged(); + } } diff --git a/src/plugins/mercurial/optionspage.h b/src/plugins/mercurial/optionspage.h index 1e68c31b95444a35590b2e30b0437094d278a06a..362a435a07a7d5b398baaa4e18520f97b5c8f000 100644 --- a/src/plugins/mercurial/optionspage.h +++ b/src/plugins/mercurial/optionspage.h @@ -40,13 +40,16 @@ namespace Mercurial { namespace Internal { +class MercurialSettings; + class OptionsPageWidget : public QWidget { Q_OBJECT public: explicit OptionsPageWidget(QWidget *parent = 0); - void updateOptions(); - void saveOptions(); + + MercurialSettings settings() const; + void setSettings(const MercurialSettings &s); private: Ui::OptionsPage m_ui;