diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 762e056f7f6cabdfebe7ef815010832eaf9bfedd..dab7251a34eb022452f064e56af64002347bdfde 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -596,7 +596,7 @@ static inline void msgCannotRun(const QStringList &args, const QString &workingD const char *GitClient::stashNamePrefix = "stash@{"; -GitClient::GitClient() : VcsBase::VcsBaseClientImpl(this, new GitSettings), +GitClient::GitClient() : VcsBase::VcsBaseClientImpl(new GitSettings), m_cachedGitVersion(0), m_disableEditor(false) { diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 36df6fb2f0073c70ef7da28c31f0a1d0918ac51e..750e7f96c32cc1b151700bbed0a3a2e4f1c50b36 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -56,6 +56,17 @@ #include <QVariant> #include <QProcessEnvironment> +static void commandFinished(VcsBase::VcsBaseEditorWidget *editor, VcsBase::VcsCommand *cmd) +{ + if (!cmd->lastExecutionSuccess()) { + editor->reportCommandFinished(false, cmd->lastExecutionExitCode(), cmd->cookie()); + } else if (cmd->cookie().type() == QVariant::Int) { + const int line = cmd->cookie().toInt(); + if (line >= 0) + editor->gotoLine(line); + } +} + /*! \class VcsBase::VcsBaseClient @@ -80,27 +91,14 @@ namespace VcsBase { class VcsBaseClientImplPrivate { public: - VcsBaseClientImplPrivate(VcsBaseClientImpl *client, VcsBaseClientSettings *settings); + VcsBaseClientImplPrivate(VcsBaseClientSettings *settings); ~VcsBaseClientImplPrivate(); - void bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor); - VcsBaseClientSettings *m_clientSettings; - QSignalMapper *m_cmdFinishedMapper; }; -void VcsBaseClientImplPrivate::bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor) -{ - editor->setCommand(cmd); - QObject::connect(cmd, &VcsCommand::finished, - m_cmdFinishedMapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map)); - m_cmdFinishedMapper->setMapping(cmd, editor); -} - -VcsBaseClientImplPrivate::VcsBaseClientImplPrivate(VcsBaseClientImpl *client, - VcsBaseClientSettings *settings) : - m_clientSettings(settings), - m_cmdFinishedMapper(new QSignalMapper(client)) +VcsBaseClientImplPrivate::VcsBaseClientImplPrivate(VcsBaseClientSettings *settings) : + m_clientSettings(settings) { m_clientSettings->readSettings(Core::ICore::settings()); } @@ -110,14 +108,11 @@ VcsBaseClientImplPrivate::~VcsBaseClientImplPrivate() delete m_clientSettings; } -VcsBaseClientImpl::VcsBaseClientImpl(VcsBaseClientImpl *client, VcsBaseClientSettings *settings) : - d(new VcsBaseClientImplPrivate(client, settings)) +VcsBaseClientImpl::VcsBaseClientImpl(VcsBaseClientSettings *settings) : + d(new VcsBaseClientImplPrivate(settings)) { connect(Core::ICore::instance(), &Core::ICore::saveSettingsRequested, this, &VcsBaseClientImpl::saveSettings); - - connect(d->m_cmdFinishedMapper, static_cast<void (QSignalMapper::*)(QWidget*)>(&QSignalMapper::mapped), - this, &VcsBaseClientImpl::commandFinishedGotoLine); } VcsBaseClientImpl::~VcsBaseClientImpl() @@ -141,8 +136,11 @@ VcsCommand *VcsBaseClientImpl::createCommand(const QString &workingDirectory, { auto cmd = new VcsCommand(workingDirectory, processEnvironment()); cmd->setDefaultTimeoutS(vcsTimeoutS()); - if (editor) - d->bindCommandToEditor(cmd, editor); + if (editor) { + connect(editor, &QObject::destroyed, cmd, &VcsCommand::abort); + connect(cmd, &VcsCommand::finished, + editor, [editor, cmd]() { commandFinished(editor, cmd); }); + } if (mode == VcsWindowOutputBind) { cmd->addFlags(VcsCommand::ShowStdOut); if (editor) // assume that the commands output is the important thing @@ -278,22 +276,6 @@ void VcsBaseClientImpl::saveSettings() settings().writeSettings(Core::ICore::settings()); } -void VcsBaseClientImpl::commandFinishedGotoLine(QWidget *editorObject) -{ - VcsBaseEditorWidget *editor = qobject_cast<VcsBaseEditorWidget *>(editorObject); - VcsCommand *cmd = qobject_cast<VcsCommand *>(d->m_cmdFinishedMapper->mapping(editor)); - if (editor && cmd) { - if (!cmd->lastExecutionSuccess()) { - editor->reportCommandFinished(false, cmd->lastExecutionExitCode(), cmd->cookie()); - } else if (cmd->cookie().type() == QVariant::Int) { - const int line = cmd->cookie().toInt(); - if (line >= 0) - editor->gotoLine(line); - } - d->m_cmdFinishedMapper->removeMappings(cmd); - } -} - class VcsBaseClientPrivate { public: @@ -319,7 +301,7 @@ VcsBaseClient::StatusItem::StatusItem(const QString &s, const QString &f) : { } VcsBaseClient::VcsBaseClient(VcsBaseClientSettings *settings) : - VcsBaseClientImpl(this, settings), + VcsBaseClientImpl(settings), d(new VcsBaseClientPrivate) { qRegisterMetaType<QVariant>(); diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index 50827a1384b2604b05b739fe262b1bfac79617d2..03a87ea45879727f3685801658f654708947d2a1 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -68,7 +68,7 @@ class VCSBASE_EXPORT VcsBaseClientImpl : public QObject Q_OBJECT public: - explicit VcsBaseClientImpl(VcsBaseClientImpl *client, VcsBaseClientSettings *settings); + explicit VcsBaseClientImpl(VcsBaseClientSettings *settings); ~VcsBaseClientImpl(); VcsBaseClientSettings &settings() const; @@ -130,7 +130,6 @@ protected: private: void saveSettings(); - void commandFinishedGotoLine(QWidget*); VcsBaseClientImplPrivate *d; };