forked from qt-creator/qt-creator
Git: Deduplicate diff editor creation sequence
Change-Id: I9d0751726f0acb340f9b19be62c6bbe23ec460f7 Reviewed-by: Jarek Kobus <jaroslaw.kobus@digia.com>
This commit is contained in:
committed by
Orgad Shaneh
parent
127d3b9687
commit
ee2023ef65
@@ -46,6 +46,7 @@ public:
|
|||||||
~DiffEditorReloader();
|
~DiffEditorReloader();
|
||||||
|
|
||||||
bool isReloading() const;
|
bool isReloading() const;
|
||||||
|
DiffEditorController *controller() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void requestReload();
|
void requestReload();
|
||||||
@@ -55,7 +56,6 @@ protected:
|
|||||||
// inside reload() (for synchronous reload)
|
// inside reload() (for synchronous reload)
|
||||||
// or later (for asynchronous reload)
|
// or later (for asynchronous reload)
|
||||||
virtual void reload() = 0;
|
virtual void reload() = 0;
|
||||||
DiffEditorController *controller() const;
|
|
||||||
void setController(DiffEditorController *controller);
|
void setController(DiffEditorController *controller);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
|
|||||||
+82
-115
@@ -807,18 +807,36 @@ VcsBaseEditorWidget *GitClient::findExistingVCSEditor(const char *registerDynami
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
DiffEditor::DiffEditorDocument *GitClient::createDiffEditor(const QString &documentId,
|
GitDiffEditorReloader *GitClient::findOrCreateDiffEditor(const QString &documentId,
|
||||||
const QString &source,
|
const QString &source,
|
||||||
const QString &title) const
|
const QString &title,
|
||||||
|
const QString &workingDirectory) const
|
||||||
{
|
{
|
||||||
DiffEditor::DiffEditorDocument *diffEditorDocument = DiffEditor::DiffEditorManager::findOrCreate(documentId, title);
|
DiffEditor::DiffEditorController *controller = 0;
|
||||||
QTC_ASSERT(diffEditorDocument, return 0);
|
GitDiffEditorReloader *reloader = 0;
|
||||||
|
DiffEditor::DiffEditorDocument *diffEditorDocument = DiffEditor::DiffEditorManager::find(documentId);
|
||||||
|
if (diffEditorDocument) {
|
||||||
|
controller = diffEditorDocument->controller();
|
||||||
|
reloader = static_cast<GitDiffEditorReloader *>(controller->reloader());
|
||||||
|
} else {
|
||||||
|
diffEditorDocument = DiffEditor::DiffEditorManager::findOrCreate(documentId, title);
|
||||||
|
QTC_ASSERT(diffEditorDocument, return 0);
|
||||||
|
controller = diffEditorDocument->controller();
|
||||||
|
|
||||||
|
connect(controller, SIGNAL(chunkActionsRequested(QMenu*,int,int)),
|
||||||
|
this, SLOT(slotChunkActionsRequested(QMenu*,int,int)), Qt::DirectConnection);
|
||||||
|
connect(controller, SIGNAL(expandBranchesRequested(QString)),
|
||||||
|
this, SLOT(branchesForCommit(QString)));
|
||||||
|
|
||||||
|
reloader = new GitDiffEditorReloader(controller);
|
||||||
|
controller->setReloader(reloader);
|
||||||
|
|
||||||
|
reloader->setWorkingDirectory(workingDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
VcsBasePlugin::setSource(diffEditorDocument, source);
|
VcsBasePlugin::setSource(diffEditorDocument, source);
|
||||||
|
EditorManager::activateEditorForDocument(diffEditorDocument);
|
||||||
connect(diffEditorDocument->controller(), SIGNAL(chunkActionsRequested(QMenu*,int,int)),
|
return reloader;
|
||||||
this, SLOT(slotChunkActionsRequested(QMenu*,int,int)), Qt::DirectConnection);
|
|
||||||
|
|
||||||
return diffEditorDocument;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::slotChunkActionsRequested(QMenu *menu, int diffFileIndex, int chunkIndex)
|
void GitClient::slotChunkActionsRequested(QMenu *menu, int diffFileIndex, int chunkIndex)
|
||||||
@@ -966,78 +984,54 @@ VcsBaseEditorWidget *GitClient::createVcsEditor(
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::diff(const QString &workingDirectory,
|
void GitClient::diffFiles(const QString &workingDirectory,
|
||||||
const QStringList &unstagedFileNames,
|
const QStringList &unstagedFileNames,
|
||||||
const QStringList &stagedFileNames) const
|
const QStringList &stagedFileNames) const
|
||||||
{
|
{
|
||||||
GitDiffEditorReloader::DiffType diffType = GitDiffEditorReloader::DiffProjectList;
|
GitDiffEditorReloader *reloader = findOrCreateDiffEditor(QLatin1String("Files:") + workingDirectory,
|
||||||
|
workingDirectory,
|
||||||
if (unstagedFileNames.empty() && stagedFileNames.empty())
|
tr("Git Diff Files"),
|
||||||
diffType = GitDiffEditorReloader::DiffRepository;
|
workingDirectory);
|
||||||
else if (!stagedFileNames.empty())
|
QTC_ASSERT(reloader, return);
|
||||||
diffType = GitDiffEditorReloader::DiffFileList;
|
reloader->setDiffType(GitDiffEditorReloader::DiffFileList);
|
||||||
|
reloader->setFileList(stagedFileNames, unstagedFileNames);
|
||||||
QString title = tr("Git Diff Projects");
|
reloader->requestReload();
|
||||||
QString documentTypeId = QLatin1String("Projects:");
|
|
||||||
if (diffType == GitDiffEditorReloader::DiffRepository) {
|
|
||||||
title = tr("Git Diff Repository");
|
|
||||||
documentTypeId = QLatin1String("Repository:");
|
|
||||||
} else if (diffType == GitDiffEditorReloader::DiffFileList) {
|
|
||||||
title = tr("Git Diff Files");
|
|
||||||
documentTypeId = QLatin1String("Files:");
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString documentId = documentTypeId + workingDirectory;
|
|
||||||
|
|
||||||
DiffEditor::DiffEditorDocument *diffEditorDocument =
|
|
||||||
DiffEditor::DiffEditorManager::find(documentId);
|
|
||||||
if (!diffEditorDocument) {
|
|
||||||
diffEditorDocument = createDiffEditor(documentId, workingDirectory, title);
|
|
||||||
|
|
||||||
DiffEditor::DiffEditorController *controller = diffEditorDocument->controller();
|
|
||||||
GitDiffEditorReloader *reloader = new GitDiffEditorReloader(controller);
|
|
||||||
controller->setReloader(reloader);
|
|
||||||
|
|
||||||
reloader->setWorkingDirectory(workingDirectory);
|
|
||||||
}
|
|
||||||
|
|
||||||
DiffEditor::DiffEditorController *controller = diffEditorDocument->controller();
|
|
||||||
GitDiffEditorReloader *reloader = static_cast<GitDiffEditorReloader *>(controller->reloader());
|
|
||||||
reloader->setDiffType(diffType);
|
|
||||||
// we force setFileList, since the lists can be different
|
|
||||||
// e.g. when double click for the second time on different file inside commit editor
|
|
||||||
if (diffType == GitDiffEditorReloader::DiffFileList)
|
|
||||||
reloader->setFileList(stagedFileNames, unstagedFileNames);
|
|
||||||
else if (diffType == GitDiffEditorReloader::DiffProjectList) // the same when unstaged file was clicked
|
|
||||||
reloader->setProjectList(unstagedFileNames);
|
|
||||||
|
|
||||||
diffEditorDocument->controller()->requestReload();
|
|
||||||
|
|
||||||
EditorManager::activateEditorForDocument(diffEditorDocument);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::diff(const QString &workingDirectory, const QString &fileName) const
|
void GitClient::diffProject(const QString &workingDirectory, const QString &projectDirectory) const
|
||||||
|
{
|
||||||
|
GitDiffEditorReloader *reloader = findOrCreateDiffEditor(QLatin1String("Project:") + workingDirectory,
|
||||||
|
workingDirectory,
|
||||||
|
tr("Git Diff Project"),
|
||||||
|
workingDirectory);
|
||||||
|
QTC_ASSERT(reloader, return);
|
||||||
|
reloader->setDiffType(GitDiffEditorReloader::DiffProjectList);
|
||||||
|
reloader->setProjectList(QStringList(projectDirectory));
|
||||||
|
reloader->requestReload();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GitClient::diffRepository(const QString &workingDirectory) const
|
||||||
|
{
|
||||||
|
GitDiffEditorReloader *reloader = findOrCreateDiffEditor(QLatin1String("Repository:") + workingDirectory,
|
||||||
|
workingDirectory,
|
||||||
|
tr("Git Diff Repository"),
|
||||||
|
workingDirectory);
|
||||||
|
QTC_ASSERT(reloader, return);
|
||||||
|
reloader->setDiffType(GitDiffEditorReloader::DiffRepository);
|
||||||
|
reloader->requestReload();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GitClient::diffFile(const QString &workingDirectory, const QString &fileName) const
|
||||||
{
|
{
|
||||||
const QString title = tr("Git Diff \"%1\"").arg(fileName);
|
const QString title = tr("Git Diff \"%1\"").arg(fileName);
|
||||||
const QString sourceFile = VcsBaseEditor::getSource(workingDirectory, fileName);
|
const QString sourceFile = VcsBaseEditor::getSource(workingDirectory, fileName);
|
||||||
const QString documentId = QLatin1String("File:") + sourceFile;
|
const QString documentId = QLatin1String("File:") + sourceFile;
|
||||||
DiffEditor::DiffEditorDocument *diffEditorDocument =
|
GitDiffEditorReloader *reloader = findOrCreateDiffEditor(documentId, sourceFile,
|
||||||
DiffEditor::DiffEditorManager::find(documentId);
|
title, workingDirectory);
|
||||||
if (!diffEditorDocument) {
|
QTC_ASSERT(reloader, return);
|
||||||
diffEditorDocument = createDiffEditor(documentId, sourceFile, title);
|
reloader->setDiffType(GitDiffEditorReloader::DiffFile);
|
||||||
|
reloader->setFileName(fileName);
|
||||||
DiffEditor::DiffEditorController *controller = diffEditorDocument->controller();
|
reloader->requestReload();
|
||||||
GitDiffEditorReloader *reloader = new GitDiffEditorReloader(controller);
|
|
||||||
controller->setReloader(reloader);
|
|
||||||
|
|
||||||
reloader->setWorkingDirectory(workingDirectory);
|
|
||||||
reloader->setDiffType(GitDiffEditorReloader::DiffFile);
|
|
||||||
reloader->setFileName(fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
diffEditorDocument->controller()->requestReload();
|
|
||||||
|
|
||||||
EditorManager::activateEditorForDocument(diffEditorDocument);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::diffBranch(const QString &workingDirectory,
|
void GitClient::diffBranch(const QString &workingDirectory,
|
||||||
@@ -1045,23 +1039,12 @@ void GitClient::diffBranch(const QString &workingDirectory,
|
|||||||
{
|
{
|
||||||
const QString title = tr("Git Diff Branch \"%1\"").arg(branchName);
|
const QString title = tr("Git Diff Branch \"%1\"").arg(branchName);
|
||||||
const QString documentId = QLatin1String("Branch:") + branchName;
|
const QString documentId = QLatin1String("Branch:") + branchName;
|
||||||
DiffEditor::DiffEditorDocument *diffEditorDocument =
|
GitDiffEditorReloader *reloader = findOrCreateDiffEditor(documentId, workingDirectory,
|
||||||
DiffEditor::DiffEditorManager::find(documentId);
|
title, workingDirectory);
|
||||||
if (!diffEditorDocument) {
|
QTC_ASSERT(reloader, return);
|
||||||
diffEditorDocument = createDiffEditor(documentId, workingDirectory, title);
|
reloader->setDiffType(GitDiffEditorReloader::DiffBranch);
|
||||||
|
reloader->setBranchName(branchName);
|
||||||
DiffEditor::DiffEditorController *controller = diffEditorDocument->controller();
|
reloader->requestReload();
|
||||||
GitDiffEditorReloader *reloader = new GitDiffEditorReloader(controller);
|
|
||||||
controller->setReloader(reloader);
|
|
||||||
|
|
||||||
reloader->setWorkingDirectory(workingDirectory);
|
|
||||||
reloader->setDiffType(GitDiffEditorReloader::DiffBranch);
|
|
||||||
reloader->setBranchName(branchName);
|
|
||||||
}
|
|
||||||
|
|
||||||
diffEditorDocument->controller()->requestReload();
|
|
||||||
|
|
||||||
EditorManager::activateEditorForDocument(diffEditorDocument);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::merge(const QString &workingDirectory,
|
void GitClient::merge(const QString &workingDirectory,
|
||||||
@@ -1171,29 +1154,13 @@ void GitClient::show(const QString &source, const QString &id, const QString &na
|
|||||||
if (!repoDirectory.isEmpty())
|
if (!repoDirectory.isEmpty())
|
||||||
workingDirectory = repoDirectory;
|
workingDirectory = repoDirectory;
|
||||||
const QString documentId = QLatin1String("Show:") + id;
|
const QString documentId = QLatin1String("Show:") + id;
|
||||||
DiffEditor::DiffEditorDocument *diffEditorDocument =
|
GitDiffEditorReloader *reloader = findOrCreateDiffEditor(documentId, source, title, workingDirectory);
|
||||||
DiffEditor::DiffEditorManager::find(documentId);
|
QTC_ASSERT(reloader, return);
|
||||||
if (!diffEditorDocument) {
|
reloader->setDiffType(GitDiffEditorReloader::DiffShow);
|
||||||
diffEditorDocument = createDiffEditor(documentId, source, title);
|
reloader->setFileName(source);
|
||||||
|
reloader->setId(id);
|
||||||
connect(diffEditorDocument->controller(), SIGNAL(expandBranchesRequested(QString)),
|
reloader->controller()->setDescriptionEnabled(true);
|
||||||
this, SLOT(branchesForCommit(QString)));
|
reloader->requestReload();
|
||||||
|
|
||||||
diffEditorDocument->controller()->setDescriptionEnabled(true);
|
|
||||||
|
|
||||||
DiffEditor::DiffEditorController *controller = diffEditorDocument->controller();
|
|
||||||
GitDiffEditorReloader *reloader = new GitDiffEditorReloader(controller);
|
|
||||||
controller->setReloader(reloader);
|
|
||||||
|
|
||||||
reloader->setWorkingDirectory(workingDirectory);
|
|
||||||
reloader->setDiffType(GitDiffEditorReloader::DiffShow);
|
|
||||||
reloader->setFileName(source);
|
|
||||||
reloader->setId(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
diffEditorDocument->controller()->requestReload();
|
|
||||||
|
|
||||||
EditorManager::activateEditorForDocument(diffEditorDocument);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::saveSettings()
|
void GitClient::saveSettings()
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ namespace Git {
|
|||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
class CommitData;
|
class CommitData;
|
||||||
|
class GitDiffEditorReloader;
|
||||||
struct GitSubmitEditorPanelData;
|
struct GitSubmitEditorPanelData;
|
||||||
class Stash;
|
class Stash;
|
||||||
|
|
||||||
@@ -143,10 +144,13 @@ public:
|
|||||||
QString findGitDirForRepository(const QString &repositoryDir) const;
|
QString findGitDirForRepository(const QString &repositoryDir) const;
|
||||||
bool managesFile(const QString &workingDirectory, const QString &fileName) const;
|
bool managesFile(const QString &workingDirectory, const QString &fileName) const;
|
||||||
|
|
||||||
void diff(const QString &workingDirectory, const QString &fileName) const;
|
void diffFile(const QString &workingDirectory, const QString &fileName) const;
|
||||||
void diff(const QString &workingDirectory,
|
void diffFiles(const QString &workingDirectory,
|
||||||
const QStringList &unstagedFileNames,
|
const QStringList &unstagedFileNames,
|
||||||
const QStringList &stagedFileNames = QStringList()) const;
|
const QStringList &stagedFileNames) const;
|
||||||
|
void diffProject(const QString &workingDirectory,
|
||||||
|
const QString &projectDirectory) const;
|
||||||
|
void diffRepository(const QString &workingDirectory) const;
|
||||||
void diffBranch(const QString &workingDirectory,
|
void diffBranch(const QString &workingDirectory,
|
||||||
const QString &branchName) const;
|
const QString &branchName) const;
|
||||||
void merge(const QString &workingDirectory, const QStringList &unmergedFileNames = QStringList());
|
void merge(const QString &workingDirectory, const QStringList &unmergedFileNames = QStringList());
|
||||||
@@ -363,6 +367,7 @@ private:
|
|||||||
const QString &dynamicPropertyValue) const;
|
const QString &dynamicPropertyValue) const;
|
||||||
|
|
||||||
enum CodecType { CodecSource, CodecLogOutput, CodecNone };
|
enum CodecType { CodecSource, CodecLogOutput, CodecNone };
|
||||||
|
|
||||||
VcsBase::VcsBaseEditorWidget *createVcsEditor(Core::Id kind,
|
VcsBase::VcsBaseEditorWidget *createVcsEditor(Core::Id kind,
|
||||||
QString title,
|
QString title,
|
||||||
const QString &source,
|
const QString &source,
|
||||||
@@ -370,9 +375,11 @@ private:
|
|||||||
const char *registerDynamicProperty,
|
const char *registerDynamicProperty,
|
||||||
const QString &dynamicPropertyValue,
|
const QString &dynamicPropertyValue,
|
||||||
VcsBase::VcsBaseEditorParameterWidget *configWidget) const;
|
VcsBase::VcsBaseEditorParameterWidget *configWidget) const;
|
||||||
DiffEditor::DiffEditorDocument *createDiffEditor(const QString &documentId,
|
|
||||||
const QString &source,
|
GitDiffEditorReloader *findOrCreateDiffEditor(const QString &documentId,
|
||||||
const QString &title) const;
|
const QString &source,
|
||||||
|
const QString &title,
|
||||||
|
const QString &workingDirectory) const;
|
||||||
|
|
||||||
VcsBase::VcsCommand *createCommand(const QString &workingDirectory,
|
VcsBase::VcsCommand *createCommand(const QString &workingDirectory,
|
||||||
VcsBase::VcsBaseEditorWidget* editor = 0,
|
VcsBase::VcsBaseEditorWidget* editor = 0,
|
||||||
|
|||||||
@@ -677,7 +677,7 @@ GitVersionControl *GitPlugin::gitVersionControl() const
|
|||||||
|
|
||||||
void GitPlugin::submitEditorDiff(const QStringList &unstaged, const QStringList &staged)
|
void GitPlugin::submitEditorDiff(const QStringList &unstaged, const QStringList &staged)
|
||||||
{
|
{
|
||||||
m_gitClient->diff(m_submitRepository, unstaged, staged);
|
m_gitClient->diffFiles(m_submitRepository, unstaged, staged);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitPlugin::submitEditorMerge(const QStringList &unmerged)
|
void GitPlugin::submitEditorMerge(const QStringList &unmerged)
|
||||||
@@ -689,7 +689,7 @@ void GitPlugin::diffCurrentFile()
|
|||||||
{
|
{
|
||||||
const VcsBasePluginState state = currentState();
|
const VcsBasePluginState state = currentState();
|
||||||
QTC_ASSERT(state.hasFile(), return);
|
QTC_ASSERT(state.hasFile(), return);
|
||||||
m_gitClient->diff(state.currentFileTopLevel(), state.relativeCurrentFile());
|
m_gitClient->diffFile(state.currentFileTopLevel(), state.relativeCurrentFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitPlugin::diffCurrentProject()
|
void GitPlugin::diffCurrentProject()
|
||||||
@@ -697,15 +697,17 @@ void GitPlugin::diffCurrentProject()
|
|||||||
const VcsBasePluginState state = currentState();
|
const VcsBasePluginState state = currentState();
|
||||||
QTC_ASSERT(state.hasProject(), return);
|
QTC_ASSERT(state.hasProject(), return);
|
||||||
const QString relativeProject = state.relativeCurrentProject();
|
const QString relativeProject = state.relativeCurrentProject();
|
||||||
m_gitClient->diff(state.currentProjectTopLevel(),
|
if (relativeProject.isEmpty())
|
||||||
relativeProject.isEmpty() ? QStringList() : QStringList(relativeProject));
|
m_gitClient->diffRepository(state.currentProjectTopLevel());
|
||||||
|
else
|
||||||
|
m_gitClient->diffProject(state.currentProjectTopLevel(), relativeProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitPlugin::diffRepository()
|
void GitPlugin::diffRepository()
|
||||||
{
|
{
|
||||||
const VcsBasePluginState state = currentState();
|
const VcsBasePluginState state = currentState();
|
||||||
QTC_ASSERT(state.hasTopLevel(), return);
|
QTC_ASSERT(state.hasTopLevel(), return);
|
||||||
m_gitClient->diff(state.topLevel(), QStringList());
|
m_gitClient->diffRepository(state.topLevel());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitPlugin::logFile()
|
void GitPlugin::logFile()
|
||||||
|
|||||||
Reference in New Issue
Block a user