Vcs: in VcsBaseClient use functors to create log/diff parameter widgets

Also API of VcsBaseEditorParameterWidget was changed to take benefit of C++11 lambdas.
Slot executeCommand() is no longer virtual and only fires signal commandExecutionRequested().
The Vcs client just has to bind a lambda to this signal instead of some boiler-plate code
like keeping track of the arguments of diff/log with "struct XxxDiffParameters", etc.

Change-Id: I347c97d84a8324e9c661df4e6d9a6075980b020f
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
Hugues Delorme
2015-01-20 17:42:16 +01:00
parent 3956fab1dd
commit 4b5d2ccef7
11 changed files with 157 additions and 321 deletions

View File

@@ -61,9 +61,66 @@ SynchronousProcessResponse::Result BazaarDiffExitCodeInterpreter::interpretExitC
return SynchronousProcessResponse::Finished; return SynchronousProcessResponse::Finished;
} }
// Parameter widget controlling whitespace diff mode, associated with a parameter
class BazaarDiffParameterWidget : public VcsBaseEditorParameterWidget
{
Q_OBJECT
public:
BazaarDiffParameterWidget(BazaarSettings *settings, QWidget *parent = 0) :
VcsBaseEditorParameterWidget(parent)
{
mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")),
settings->boolPointer(BazaarSettings::diffIgnoreWhiteSpaceKey));
mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")),
settings->boolPointer(BazaarSettings::diffIgnoreBlankLinesKey));
}
QStringList arguments() const
{
QStringList args;
// Bazaar wants "--diff-options=-w -B.."
const QStringList formatArguments = VcsBaseEditorParameterWidget::arguments();
if (!formatArguments.isEmpty()) {
const QString a = QLatin1String("--diff-options=")
+ formatArguments.join(QString(QLatin1Char(' ')));
args.append(a);
}
return args;
}
};
class BazaarLogParameterWidget : public VcsBaseEditorParameterWidget
{
Q_OBJECT
public:
BazaarLogParameterWidget(BazaarSettings *settings, QWidget *parent = 0) :
VcsBaseEditorParameterWidget(parent)
{
mapSetting(addToggleButton(QLatin1String("--verbose"), tr("Verbose"),
tr("Show files changed in each revision")),
settings->boolPointer(BazaarSettings::logVerboseKey));
mapSetting(addToggleButton(QLatin1String("--forward"), tr("Forward"),
tr("Show from oldest to newest")),
settings->boolPointer(BazaarSettings::logForwardKey));
mapSetting(addToggleButton(QLatin1String("--include-merges"), tr("Include merges"),
tr("Show merged revisions")),
settings->boolPointer(BazaarSettings::logIncludeMergesKey));
QList<ComboBoxItem> logChoices;
logChoices << ComboBoxItem(tr("Detailed"), QLatin1String("long"))
<< ComboBoxItem(tr("Moderately short"), QLatin1String("short"))
<< ComboBoxItem(tr("One line"), QLatin1String("line"))
<< ComboBoxItem(tr("GNU ChangeLog"), QLatin1String("gnu-changelog"));
mapSetting(addComboBox(QStringList(QLatin1String("--log-format=%1")), logChoices),
settings->stringPointer(BazaarSettings::logFormatKey));
}
};
BazaarClient::BazaarClient(BazaarSettings *settings) : BazaarClient::BazaarClient(BazaarSettings *settings) :
VcsBaseClient(settings) VcsBaseClient(settings)
{ {
setDiffParameterWidgetCreator([=] { return new BazaarDiffParameterWidget(settings); });
setLogParameterWidgetCreator([=] { return new BazaarLogParameterWidget(settings); });
} }
BazaarSettings *BazaarClient::settings() const BazaarSettings *BazaarClient::settings() const
@@ -253,112 +310,6 @@ BazaarClient::StatusItem BazaarClient::parseStatusLine(const QString &line) cons
return item; return item;
} }
// Collect all parameters required for a diff or log to be able to associate
// them with an editor and re-run the command with parameters.
struct BazaarCommandParameters
{
BazaarCommandParameters(const QString &workDir,
const QStringList &inFiles,
const QStringList &options) :
workingDir(workDir), files(inFiles), extraOptions(options)
{
}
QString workingDir;
QStringList files;
QStringList extraOptions;
};
// Parameter widget controlling whitespace diff mode, associated with a parameter
class BazaarDiffParameterWidget : public VcsBaseEditorParameterWidget
{
Q_OBJECT
public:
BazaarDiffParameterWidget(BazaarClient *client,
const BazaarCommandParameters &p, QWidget *parent = 0) :
VcsBaseEditorParameterWidget(parent), m_client(client), m_params(p)
{
mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")),
client->settings()->boolPointer(BazaarSettings::diffIgnoreWhiteSpaceKey));
mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")),
client->settings()->boolPointer(BazaarSettings::diffIgnoreBlankLinesKey));
}
QStringList arguments() const
{
QStringList args;
// Bazaar wants "--diff-options=-w -B.."
const QStringList formatArguments = VcsBaseEditorParameterWidget::arguments();
if (!formatArguments.isEmpty()) {
const QString a = QLatin1String("--diff-options=")
+ formatArguments.join(QString(QLatin1Char(' ')));
args.append(a);
}
return args;
}
void executeCommand()
{
m_client->diff(m_params.workingDir, m_params.files, m_params.extraOptions);
}
private:
BazaarClient *m_client;
const BazaarCommandParameters m_params;
};
VcsBaseEditorParameterWidget *BazaarClient::createDiffEditor(
const QString &workingDir, const QStringList &files, const QStringList &extraOptions)
{
const BazaarCommandParameters parameters(workingDir, files, extraOptions);
return new BazaarDiffParameterWidget(this, parameters);
}
class BazaarLogParameterWidget : public VcsBaseEditorParameterWidget
{
Q_OBJECT
public:
BazaarLogParameterWidget(BazaarClient *client,
const BazaarCommandParameters &p, QWidget *parent = 0) :
VcsBaseEditorParameterWidget(parent), m_client(client), m_params(p)
{
BazaarSettings *settings = m_client->settings();
mapSetting(addToggleButton(QLatin1String("--verbose"), tr("Verbose"),
tr("Show files changed in each revision")),
settings->boolPointer(BazaarSettings::logVerboseKey));
mapSetting(addToggleButton(QLatin1String("--forward"), tr("Forward"),
tr("Show from oldest to newest")),
settings->boolPointer(BazaarSettings::logForwardKey));
mapSetting(addToggleButton(QLatin1String("--include-merges"), tr("Include merges"),
tr("Show merged revisions")),
settings->boolPointer(BazaarSettings::logIncludeMergesKey));
QList<ComboBoxItem> logChoices;
logChoices << ComboBoxItem(tr("Detailed"), QLatin1String("long"))
<< ComboBoxItem(tr("Moderately short"), QLatin1String("short"))
<< ComboBoxItem(tr("One line"), QLatin1String("line"))
<< ComboBoxItem(tr("GNU ChangeLog"), QLatin1String("gnu-changelog"));
mapSetting(addComboBox(QStringList(QLatin1String("--log-format=%1")), logChoices),
settings->stringPointer(BazaarSettings::logFormatKey));
}
void executeCommand()
{
m_client->log(m_params.workingDir, m_params.files, m_params.extraOptions);
}
private:
BazaarClient *m_client;
const BazaarCommandParameters m_params;
};
VcsBaseEditorParameterWidget *BazaarClient::createLogEditor(
const QString &workingDir, const QStringList &files, const QStringList &extraOptions)
{
const BazaarCommandParameters parameters(workingDir, files, extraOptions);
return new BazaarLogParameterWidget(this, parameters);
}
} // namespace Internal } // namespace Internal
} // namespace Bazaar } // namespace Bazaar

View File

@@ -68,12 +68,6 @@ protected:
QString vcsCommandString(VcsCommandTag cmd) const; QString vcsCommandString(VcsCommandTag cmd) const;
Utils::ExitCodeInterpreter *exitCodeInterpreter(VcsCommandTag cmd, QObject *parent) const; Utils::ExitCodeInterpreter *exitCodeInterpreter(VcsCommandTag cmd, QObject *parent) const;
QStringList revisionSpec(const QString &revision) const; QStringList revisionSpec(const QString &revision) const;
VcsBase::VcsBaseEditorParameterWidget *createDiffEditor(const QString &workingDir,
const QStringList &files,
const QStringList &extraOptions);
VcsBase::VcsBaseEditorParameterWidget *createLogEditor(const QString &workingDir,
const QStringList &files,
const QStringList &extraOptions);
StatusItem parseStatusLine(const QString &line) const; StatusItem parseStatusLine(const QString &line) const;
private: private:

View File

@@ -65,59 +65,40 @@ SynchronousProcessResponse::Result CvsDiffExitCodeInterpreter::interpretExitCode
return SynchronousProcessResponse::Finished; return SynchronousProcessResponse::Finished;
} }
// Collect all parameters required for a diff to be able to associate them
// with a diff editor and re-run the diff with parameters.
struct CvsDiffParameters
{
QString workingDir;
QStringList extraOptions;
QStringList files;
};
// Parameter widget controlling whitespace diff mode, associated with a parameter // Parameter widget controlling whitespace diff mode, associated with a parameter
class CvsDiffParameterWidget : public VcsBaseEditorParameterWidget class CvsDiffParameterWidget : public VcsBaseEditorParameterWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit CvsDiffParameterWidget(CvsClient *client, explicit CvsDiffParameterWidget(CvsSettings *settings, QWidget *parent = 0);
const CvsDiffParameters &p,
QWidget *parent = 0);
QStringList arguments() const; QStringList arguments() const;
void executeCommand();
private: private:
const CvsSettings *m_settings;
CvsClient *m_client;
const CvsDiffParameters m_params;
}; };
CvsDiffParameterWidget::CvsDiffParameterWidget(CvsClient *client, CvsDiffParameterWidget::CvsDiffParameterWidget(CvsSettings *settings, QWidget *parent)
const CvsDiffParameters &p, : VcsBaseEditorParameterWidget(parent),
QWidget *parent) m_settings(settings)
: VcsBaseEditorParameterWidget(parent), m_client(client), m_params(p)
{ {
mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")), mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")),
client->settings()->boolPointer(CvsSettings::diffIgnoreWhiteSpaceKey)); settings->boolPointer(CvsSettings::diffIgnoreWhiteSpaceKey));
mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")), mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")),
client->settings()->boolPointer(CvsSettings::diffIgnoreBlankLinesKey)); settings->boolPointer(CvsSettings::diffIgnoreBlankLinesKey));
} }
QStringList CvsDiffParameterWidget::arguments() const QStringList CvsDiffParameterWidget::arguments() const
{ {
QStringList args; QStringList args;
args = m_client->settings()->stringValue(CvsSettings::diffOptionsKey).split(QLatin1Char(' '), QString::SkipEmptyParts); args = m_settings->stringValue(CvsSettings::diffOptionsKey).split(QLatin1Char(' '), QString::SkipEmptyParts);
args += VcsBaseEditorParameterWidget::arguments(); args += VcsBaseEditorParameterWidget::arguments();
return args; return args;
} }
void CvsDiffParameterWidget::executeCommand()
{
m_client->diff(m_params.workingDir, m_params.files, m_params.extraOptions);
}
CvsClient::CvsClient(CvsSettings *settings) : CvsClient::CvsClient(CvsSettings *settings) :
VcsBaseClient(settings) VcsBaseClient(settings)
{ {
setDiffParameterWidgetCreator([=] { return new CvsDiffParameterWidget(settings); });
} }
CvsSettings *CvsClient::settings() const CvsSettings *CvsClient::settings() const
@@ -169,17 +150,6 @@ VcsBaseClient::StatusItem CvsClient::parseStatusLine(const QString &line) const
return VcsBaseClient::StatusItem(); return VcsBaseClient::StatusItem();
} }
VcsBaseEditorParameterWidget *CvsClient::createDiffEditor(
const QString &workingDir, const QStringList &files, const QStringList &extraOptions)
{
Q_UNUSED(extraOptions)
CvsDiffParameters p;
p.workingDir = workingDir;
p.files = files;
p.extraOptions = extraOptions;
return new CvsDiffParameterWidget(this, p);
}
} // namespace Internal } // namespace Internal
} // namespace Cvs } // namespace Cvs

View File

@@ -53,14 +53,9 @@ public:
QStringList revisionSpec(const QString &revision) const; QStringList revisionSpec(const QString &revision) const;
StatusItem parseStatusLine(const QString &line) const; StatusItem parseStatusLine(const QString &line) const;
protected: protected:
Utils::ExitCodeInterpreter *exitCodeInterpreter(VcsCommandTag cmd, QObject *parent) const; Utils::ExitCodeInterpreter *exitCodeInterpreter(VcsCommandTag cmd, QObject *parent) const;
Core::Id vcsEditorKind(VcsCommandTag cmd) const; Core::Id vcsEditorKind(VcsCommandTag cmd) const;
VcsBase::VcsBaseEditorParameterWidget *createDiffEditor(const QString &workingDir,
const QStringList &files,
const QStringList &extraOptions);
private:
}; };
} // namespace Internal } // namespace Internal

View File

@@ -449,32 +449,24 @@ class BaseGitDiffArgumentsWidget : public VcsBaseEditorParameterWidget
Q_OBJECT Q_OBJECT
public: public:
BaseGitDiffArgumentsWidget(GitClient *client, const QString &directory, BaseGitDiffArgumentsWidget(GitSettings *settings, QWidget *parent = 0) :
const QStringList &args) : VcsBaseEditorParameterWidget(parent)
m_workingDirectory(directory),
m_client(client)
{ {
QTC_ASSERT(!directory.isEmpty(), return); QTC_ASSERT(settings, return);
QTC_ASSERT(m_client, return);
m_patienceButton = addToggleButton( m_patienceButton = addToggleButton(
QLatin1String("--patience"), QLatin1String("--patience"),
tr("Patience"), tr("Patience"),
tr("Use the patience algorithm for calculating the differences.")); tr("Use the patience algorithm for calculating the differences."));
mapSetting(m_patienceButton, client->settings()->boolPointer( mapSetting(m_patienceButton, settings->boolPointer(GitSettings::diffPatienceKey));
GitSettings::diffPatienceKey));
m_ignoreWSButton = addToggleButton( m_ignoreWSButton = addToggleButton(
QLatin1String("--ignore-space-change"), tr("Ignore Whitespace"), QLatin1String("--ignore-space-change"), tr("Ignore Whitespace"),
tr("Ignore whitespace only changes.")); tr("Ignore whitespace only changes."));
mapSetting(m_ignoreWSButton, mapSetting(m_ignoreWSButton,
m_client->settings()->boolPointer(GitSettings::ignoreSpaceChangesInDiffKey)); settings->boolPointer(GitSettings::ignoreSpaceChangesInDiffKey));
setBaseArguments(args);
} }
protected: protected:
QString m_workingDirectory;
GitClient *m_client;
QToolButton *m_patienceButton; QToolButton *m_patienceButton;
QToolButton *m_ignoreWSButton; QToolButton *m_ignoreWSButton;
}; };
@@ -484,44 +476,16 @@ class GitBlameArgumentsWidget : public VcsBaseEditorParameterWidget
Q_OBJECT Q_OBJECT
public: public:
GitBlameArgumentsWidget(Git::Internal::GitClient *client, GitBlameArgumentsWidget(GitSettings *settings, QWidget *parent = 0) :
const QString &directory, VcsBaseEditorParameterWidget(parent)
const QStringList &args,
const QString &revision, const QString &fileName) :
m_editor(0),
m_client(client),
m_workingDirectory(directory),
m_revision(revision),
m_fileName(fileName)
{ {
mapSetting(addToggleButton(QString(), tr("Omit Date"), mapSetting(addToggleButton(QString(), tr("Omit Date"),
tr("Hide the date of a change from the output.")), tr("Hide the date of a change from the output.")),
m_client->settings()->boolPointer(GitSettings::omitAnnotationDateKey)); settings->boolPointer(GitSettings::omitAnnotationDateKey));
mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace"), mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace"),
tr("Ignore whitespace only changes.")), tr("Ignore whitespace only changes.")),
m_client->settings()->boolPointer(GitSettings::ignoreSpaceChangesInBlameKey)); settings->boolPointer(GitSettings::ignoreSpaceChangesInBlameKey));
setBaseArguments(args);
} }
void setEditor(VcsBaseEditorWidget *editor)
{
QTC_ASSERT(editor, return);
m_editor = editor;
}
void executeCommand()
{
int line = VcsBaseEditor::lineNumberOfCurrentEditor();
m_client->blame(m_workingDirectory, baseArguments(), m_fileName, m_revision, line);
}
private:
VcsBaseEditorWidget *m_editor;
GitClient *m_client;
QString m_workingDirectory;
QString m_revision;
QString m_fileName;
}; };
class GitLogArgumentsWidget : public BaseGitDiffArgumentsWidget class GitLogArgumentsWidget : public BaseGitDiffArgumentsWidget
@@ -529,20 +493,12 @@ class GitLogArgumentsWidget : public BaseGitDiffArgumentsWidget
Q_OBJECT Q_OBJECT
public: public:
GitLogArgumentsWidget(Git::Internal::GitClient *client, GitLogArgumentsWidget(GitSettings *settings, QWidget *parent = 0) :
const QString &directory, BaseGitDiffArgumentsWidget(settings, parent)
bool enableAnnotationContextMenu,
const QStringList &args,
const QString &fileName) :
BaseGitDiffArgumentsWidget(client, directory, args),
m_client(client),
m_workingDirectory(directory),
m_enableAnnotationContextMenu(enableAnnotationContextMenu)
{ {
QTC_ASSERT(!directory.isEmpty(), return);
QToolButton *diffButton = addToggleButton(QLatin1String("--patch"), tr("Show Diff"), QToolButton *diffButton = addToggleButton(QLatin1String("--patch"), tr("Show Diff"),
tr("Show difference.")); tr("Show difference."));
mapSetting(diffButton, m_client->settings()->boolPointer(GitSettings::logDiffKey)); mapSetting(diffButton, settings->boolPointer(GitSettings::logDiffKey));
connect(diffButton, SIGNAL(toggled(bool)), m_patienceButton, SLOT(setVisible(bool))); connect(diffButton, SIGNAL(toggled(bool)), m_patienceButton, SLOT(setVisible(bool)));
connect(diffButton, SIGNAL(toggled(bool)), m_ignoreWSButton, SLOT(setVisible(bool))); connect(diffButton, SIGNAL(toggled(bool)), m_ignoreWSButton, SLOT(setVisible(bool)));
m_patienceButton->setVisible(diffButton->isChecked()); m_patienceButton->setVisible(diffButton->isChecked());
@@ -552,25 +508,8 @@ public:
graphArguments << (QLatin1String("--pretty=format:") + QLatin1String(graphLogFormatC)); graphArguments << (QLatin1String("--pretty=format:") + QLatin1String(graphLogFormatC));
QToolButton *graphButton = addToggleButton(graphArguments, tr("Graph"), QToolButton *graphButton = addToggleButton(graphArguments, tr("Graph"),
tr("Show textual graph log.")); tr("Show textual graph log."));
mapSetting(graphButton, m_client->settings()->boolPointer(GitSettings::graphLogKey)); mapSetting(graphButton, settings->boolPointer(GitSettings::graphLogKey));
setFileName(fileName);
} }
void setFileName(const QString &fileNames)
{
m_fileName = fileNames;
}
void executeCommand()
{
m_client->log(m_workingDirectory, m_fileName, m_enableAnnotationContextMenu, baseArguments());
}
private:
GitClient *m_client;
QString m_workingDirectory;
bool m_enableAnnotationContextMenu;
QString m_fileName;
}; };
class ConflictHandler : public QObject class ConflictHandler : public QObject
@@ -1033,11 +972,13 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName,
const Id editorId = Git::Constants::GIT_LOG_EDITOR_ID; const Id editorId = Git::Constants::GIT_LOG_EDITOR_ID;
const QString sourceFile = VcsBaseEditor::getSource(workingDirectory, fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDirectory, fileName);
VcsBaseEditorWidget *editor = findExistingVCSEditor("logFileName", sourceFile); VcsBaseEditorWidget *editor = findExistingVCSEditor("logFileName", sourceFile);
if (!editor) if (!editor) {
auto *argWidget = new GitLogArgumentsWidget(settings());
QObject::connect(argWidget, &VcsBaseEditorParameterWidget::commandExecutionRequested,
[=] { log(workingDirectory, fileName, enableAnnotationContextMenu, args); });
editor = createVcsEditor(editorId, title, sourceFile, CodecLogOutput, "logFileName", sourceFile, editor = createVcsEditor(editorId, title, sourceFile, CodecLogOutput, "logFileName", sourceFile,
new GitLogArgumentsWidget(this, workingDirectory, argWidget);
enableAnnotationContextMenu, }
args, fileName));
editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu); editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu);
editor->setWorkingDirectory(workingDirectory); editor->setWorkingDirectory(workingDirectory);
@@ -1049,9 +990,8 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName,
if (logCount > 0) if (logCount > 0)
arguments << QLatin1String("-n") << QString::number(logCount); arguments << QLatin1String("-n") << QString::number(logCount);
GitLogArgumentsWidget *argWidget = qobject_cast<GitLogArgumentsWidget *>(editor->configurationWidget()); auto *argWidget = editor->configurationWidget();
argWidget->setBaseArguments(args); argWidget->setBaseArguments(args);
argWidget->setFileName(fileName);
QStringList userArgs = argWidget->arguments(); QStringList userArgs = argWidget->arguments();
arguments.append(userArgs); arguments.append(userArgs);
@@ -1158,11 +1098,14 @@ void GitClient::blame(const QString &workingDirectory,
VcsBaseEditorWidget *editor = findExistingVCSEditor("blameFileName", id); VcsBaseEditorWidget *editor = findExistingVCSEditor("blameFileName", id);
if (!editor) { if (!editor) {
GitBlameArgumentsWidget *argWidget = auto *argWidget = new GitBlameArgumentsWidget(settings());
new GitBlameArgumentsWidget(this, workingDirectory, args, argWidget->setBaseArguments(args);
revision, fileName); QObject::connect(argWidget, &VcsBaseEditorParameterWidget::commandExecutionRequested,
[=] {
const int line = VcsBaseEditor::lineNumberOfCurrentEditor();
blame(workingDirectory, args, fileName, revision, line);
} );
editor = createVcsEditor(editorId, title, sourceFile, CodecSource, "blameFileName", id, argWidget); editor = createVcsEditor(editorId, title, sourceFile, CodecSource, "blameFileName", id, argWidget);
argWidget->setEditor(editor);
} }
editor->setWorkingDirectory(workingDirectory); editor->setWorkingDirectory(workingDirectory);

View File

@@ -53,9 +53,25 @@ using namespace VcsBase;
namespace Mercurial { namespace Mercurial {
namespace Internal { namespace Internal {
// Parameter widget controlling whitespace diff mode, associated with a parameter
class MercurialDiffParameterWidget : public VcsBaseEditorParameterWidget
{
Q_OBJECT
public:
MercurialDiffParameterWidget(MercurialSettings *settings, QWidget *parent = 0) :
VcsBaseEditorParameterWidget(parent)
{
mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")),
settings->boolPointer(MercurialSettings::diffIgnoreWhiteSpaceKey));
mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")),
settings->boolPointer(MercurialSettings::diffIgnoreBlankLinesKey));
}
};
MercurialClient::MercurialClient(MercurialSettings *settings) : MercurialClient::MercurialClient(MercurialSettings *settings) :
VcsBaseClient(settings) VcsBaseClient(settings)
{ {
setDiffParameterWidgetCreator([=] { return new MercurialDiffParameterWidget(settings); });
} }
MercurialSettings *MercurialClient::settings() const MercurialSettings *MercurialClient::settings() const
@@ -414,50 +430,6 @@ void MercurialClient::parsePullOutput(const QString &output)
emit needMerge(); emit needMerge();
} }
// Collect all parameters required for a diff to be able to associate them
// with a diff editor and re-run the diff with parameters.
struct MercurialDiffParameters
{
QString workingDir;
QStringList files;
QStringList extraOptions;
};
// Parameter widget controlling whitespace diff mode, associated with a parameter
class MercurialDiffParameterWidget : public VcsBaseEditorParameterWidget
{
Q_OBJECT
public:
MercurialDiffParameterWidget(MercurialClient *client,
const MercurialDiffParameters &p, QWidget *parent = 0) :
VcsBaseEditorParameterWidget(parent), m_client(client), m_params(p)
{
mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")),
client->settings()->boolPointer(MercurialSettings::diffIgnoreWhiteSpaceKey));
mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")),
client->settings()->boolPointer(MercurialSettings::diffIgnoreBlankLinesKey));
}
void executeCommand()
{
m_client->diff(m_params.workingDir, m_params.files, m_params.extraOptions);
}
private:
MercurialClient *m_client;
const MercurialDiffParameters m_params;
};
VcsBaseEditorParameterWidget *MercurialClient::createDiffEditor(
const QString &workingDir, const QStringList &files, const QStringList &extraOptions)
{
MercurialDiffParameters parameters;
parameters.workingDir = workingDir;
parameters.files = files;
parameters.extraOptions = extraOptions;
return new MercurialDiffParameterWidget(this, parameters);
}
} // namespace Internal } // namespace Internal
} // namespace Mercurial } // namespace Mercurial

View File

@@ -86,9 +86,6 @@ public:
protected: protected:
Core::Id vcsEditorKind(VcsCommandTag cmd) const; Core::Id vcsEditorKind(VcsCommandTag cmd) const;
QStringList revisionSpec(const QString &revision) const; QStringList revisionSpec(const QString &revision) const;
VcsBase::VcsBaseEditorParameterWidget *createDiffEditor(const QString &workingDir,
const QStringList &files,
const QStringList &extraOptions);
StatusItem parseStatusLine(const QString &line) const; StatusItem parseStatusLine(const QString &line) const;
signals: signals:

View File

@@ -89,9 +89,15 @@ public:
void bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor); void bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor);
void commandFinishedGotoLine(QWidget *editorObject); void commandFinishedGotoLine(QWidget *editorObject);
VcsBaseEditorParameterWidget *createDiffEditor();
VcsBaseEditorParameterWidget *createLogEditor();
VcsBaseClientSettings *m_clientSettings; VcsBaseClientSettings *m_clientSettings;
QSignalMapper *m_cmdFinishedMapper; QSignalMapper *m_cmdFinishedMapper;
VcsBaseClient::ParameterWidgetCreator m_diffParamWidgetCreator;
VcsBaseClient::ParameterWidgetCreator m_logParamWidgetCreator;
private: private:
VcsBaseClient *m_client; VcsBaseClient *m_client;
}; };
@@ -157,6 +163,16 @@ void VcsBaseClientPrivate::commandFinishedGotoLine(QWidget *editorObject)
} }
} }
VcsBaseEditorParameterWidget *VcsBaseClientPrivate::createDiffEditor()
{
return m_diffParamWidgetCreator ? m_diffParamWidgetCreator() : 0;
}
VcsBaseEditorParameterWidget *VcsBaseClientPrivate::createLogEditor()
{
return m_logParamWidgetCreator ? m_logParamWidgetCreator() : 0;
}
VcsBaseClient::StatusItem::StatusItem(const QString &s, const QString &f) : VcsBaseClient::StatusItem::StatusItem(const QString &s, const QString &f) :
flags(s), file(f) flags(s), file(f)
{ {
@@ -350,10 +366,12 @@ void VcsBaseClient::diff(const QString &workingDir, const QStringList &files,
editor->setWorkingDirectory(workingDir); editor->setWorkingDirectory(workingDir);
VcsBaseEditorParameterWidget *paramWidget = editor->configurationWidget(); VcsBaseEditorParameterWidget *paramWidget = editor->configurationWidget();
if (!paramWidget && (paramWidget = createDiffEditor(workingDir, files, extraOptions))) { if (!paramWidget && (paramWidget = d->createDiffEditor())) {
// editor has been just created, createVcsEditor() didn't set a configuration widget yet // editor has been just created, createVcsEditor() didn't set a configuration widget yet
connect(editor, &VcsBaseEditorWidget::diffChunkReverted, connect(editor, &VcsBaseEditorWidget::diffChunkReverted,
paramWidget, &VcsBaseEditorParameterWidget::executeCommand); paramWidget, &VcsBaseEditorParameterWidget::executeCommand);
connect(paramWidget, &VcsBaseEditorParameterWidget::commandExecutionRequested,
[=] { diff(workingDir, files, extraOptions); } );
editor->setConfigurationWidget(paramWidget); editor->setConfigurationWidget(paramWidget);
} }
@@ -380,8 +398,10 @@ void VcsBaseClient::log(const QString &workingDir, const QStringList &files,
editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu); editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu);
VcsBaseEditorParameterWidget *paramWidget = editor->configurationWidget(); VcsBaseEditorParameterWidget *paramWidget = editor->configurationWidget();
if (!paramWidget && (paramWidget = createLogEditor(workingDir, files, extraOptions))) { if (!paramWidget && (paramWidget = d->createLogEditor())) {
// editor has been just created, createVcsEditor() didn't set a configuration widget yet // editor has been just created, createVcsEditor() didn't set a configuration widget yet
connect(paramWidget, &VcsBaseEditorParameterWidget::commandExecutionRequested,
[=] { log(workingDir, files, extraOptions, enableAnnotationContextMenu); } );
editor->setConfigurationWidget(paramWidget); editor->setConfigurationWidget(paramWidget);
} }
@@ -467,6 +487,16 @@ Utils::ExitCodeInterpreter *VcsBaseClient::exitCodeInterpreter(VcsCommandTag cmd
return 0; return 0;
} }
void VcsBaseClient::setDiffParameterWidgetCreator(ParameterWidgetCreator creator)
{
d->m_diffParamWidgetCreator = std::move(creator);
}
void VcsBaseClient::setLogParameterWidgetCreator(ParameterWidgetCreator creator)
{
d->m_logParamWidgetCreator = std::move(creator);
}
void VcsBaseClient::import(const QString &repositoryRoot, const QStringList &files, void VcsBaseClient::import(const QString &repositoryRoot, const QStringList &files,
const QStringList &extraOptions) const QStringList &extraOptions)
{ {
@@ -527,26 +557,6 @@ VcsBaseClientSettings *VcsBaseClient::settings() const
return d->m_clientSettings; return d->m_clientSettings;
} }
VcsBaseEditorParameterWidget *VcsBaseClient::createDiffEditor(const QString &workingDir,
const QStringList &files,
const QStringList &extraOptions)
{
Q_UNUSED(workingDir);
Q_UNUSED(files);
Q_UNUSED(extraOptions);
return 0;
}
VcsBaseEditorParameterWidget *VcsBaseClient::createLogEditor(const QString &workingDir,
const QStringList &files,
const QStringList &extraOptions)
{
Q_UNUSED(workingDir);
Q_UNUSED(files);
Q_UNUSED(extraOptions);
return 0;
}
QString VcsBaseClient::vcsEditorTitle(const QString &vcsCmd, const QString &sourceId) const QString VcsBaseClient::vcsEditorTitle(const QString &vcsCmd, const QString &sourceId) const
{ {
const Utils::FileName binary = settings()->binaryPath(); const Utils::FileName binary = settings()->binaryPath();

View File

@@ -37,6 +37,8 @@
#include <QObject> #include <QObject>
#include <QStringList> #include <QStringList>
#include <functional>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFileInfo; class QFileInfo;
class QVariant; class QVariant;
@@ -155,12 +157,11 @@ protected:
virtual Utils::ExitCodeInterpreter *exitCodeInterpreter(VcsCommandTag cmd, QObject *parent) const; virtual Utils::ExitCodeInterpreter *exitCodeInterpreter(VcsCommandTag cmd, QObject *parent) const;
virtual QStringList revisionSpec(const QString &revision) const = 0; virtual QStringList revisionSpec(const QString &revision) const = 0;
virtual VcsBaseEditorParameterWidget *createDiffEditor(const QString &workingDir,
const QStringList &files, typedef std::function<VcsBaseEditorParameterWidget *()> ParameterWidgetCreator;
const QStringList &extraOptions); void setDiffParameterWidgetCreator(ParameterWidgetCreator creator);
virtual VcsBaseEditorParameterWidget *createLogEditor(const QString &workingDir, void setLogParameterWidgetCreator(ParameterWidgetCreator creator);
const QStringList &files,
const QStringList &extraOptions);
virtual StatusItem parseStatusLine(const QString &line) const = 0; virtual StatusItem parseStatusLine(const QString &line) const = 0;
QString vcsEditorTitle(const QString &vcsCmd, const QString &sourceId) const; QString vcsEditorTitle(const QString &vcsCmd, const QString &sourceId) const;

View File

@@ -218,16 +218,17 @@ void VcsBaseEditorParameterWidget::mapSetting(QComboBox *comboBox, int *setting)
comboBox->blockSignals(false); comboBox->blockSignals(false);
} }
void VcsBaseEditorParameterWidget::executeCommand()
{
}
void VcsBaseEditorParameterWidget::handleArgumentsChanged() void VcsBaseEditorParameterWidget::handleArgumentsChanged()
{ {
updateMappedSettings(); updateMappedSettings();
executeCommand(); executeCommand();
} }
void VcsBaseEditorParameterWidget::executeCommand()
{
emit commandExecutionRequested();
}
VcsBaseEditorParameterWidget::OptionMapping::OptionMapping() : VcsBaseEditorParameterWidget::OptionMapping::OptionMapping() :
widget(0) widget(0)
{ {

View File

@@ -80,10 +80,12 @@ public:
virtual QStringList arguments() const; virtual QStringList arguments() const;
public slots: public slots:
virtual void executeCommand(); void handleArgumentsChanged();
virtual void handleArgumentsChanged(); void executeCommand();
signals: signals:
void commandExecutionRequested();
// Trigger a re-run to show changed output according to new argument list. // Trigger a re-run to show changed output according to new argument list.
void argumentsChanged(); void argumentsChanged();