Git: Deduplicate diff editor creation sequence

Change-Id: I9d0751726f0acb340f9b19be62c6bbe23ec460f7
Reviewed-by: Jarek Kobus <jaroslaw.kobus@digia.com>
This commit is contained in:
Orgad Shaneh
2014-08-03 23:00:06 +03:00
committed by Orgad Shaneh
parent 127d3b9687
commit ee2023ef65
4 changed files with 104 additions and 128 deletions
+1 -1
View File
@@ -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
View File
@@ -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()
+14 -7
View File
@@ -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,
+7 -5
View File
@@ -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()