From 7bd26571e44c960e6907e3c39244d27842d2726b Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 15 Dec 2022 09:19:09 +0100 Subject: [PATCH] DiffEditorController: Aggregate reloadRecipe Instead of declaring virtual getter. Change-Id: I0f9e995bdff1b7e387e71daaf149a3726b7c09af Reviewed-by: Orgad Shaneh --- .../diffeditor/diffeditorcontroller.cpp | 9 +- src/plugins/diffeditor/diffeditorcontroller.h | 4 +- src/plugins/git/gitclient.cpp | 166 ++++++++---------- 3 files changed, 85 insertions(+), 94 deletions(-) diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp index dda67c49c01..bb11ce335c2 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp @@ -19,9 +19,10 @@ using namespace Utils; namespace DiffEditor { -DiffEditorController::DiffEditorController(Core::IDocument *document) : - QObject(document), - m_document(qobject_cast(document)) +DiffEditorController::DiffEditorController(Core::IDocument *document) + : QObject(document) + , m_document(qobject_cast(document)) + , m_reloadRecipe{} { QTC_ASSERT(m_document, return); m_document->setController(this); @@ -125,7 +126,7 @@ void DiffEditorController::requestReload() m_reloader(); return; } - m_taskTree.reset(new TaskTree(reloadRecipe())); + m_taskTree.reset(new TaskTree(m_reloadRecipe)); connect(m_taskTree.get(), &TaskTree::done, this, [this] { reloadFinished(true); }); connect(m_taskTree.get(), &TaskTree::errorOccurred, this, [this] { reloadFinished(false); }); auto progress = new TaskProgress(m_taskTree.get()); diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h index 5df95225f3a..abca38c02b8 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.h +++ b/src/plugins/diffeditor/diffeditorcontroller.h @@ -61,6 +61,8 @@ protected: void setDisplayName(const QString &name) { m_displayName = name; } QString displayName() const { return m_displayName; } + void setReloadRecipe(const Utils::Tasking::Group &recipe) { m_reloadRecipe = recipe; } + // reloadFinished() should be called inside the reloader (for synchronous reload) // or later (for asynchronous reload) void setReloader(const std::function &reloader); @@ -78,7 +80,7 @@ private: QString m_displayName; std::function m_reloader; std::unique_ptr m_taskTree; - virtual Utils::Tasking::Group reloadRecipe() { return {}; } // TODO: make pure abstract + Utils::Tasking::Group m_reloadRecipe; friend class Internal::DiffEditorDocument; }; diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 5235f8a21bc..82722a4bfe5 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -206,98 +206,86 @@ class FileListDiffController : public GitBaseDiffEditorController { public: FileListDiffController(IDocument *document, const QStringList &stagedFiles, - const QStringList &unstagedFiles) - : GitBaseDiffEditorController(document) - , m_stagedFiles(stagedFiles) - , m_unstagedFiles(unstagedFiles) {} - -private: - Tasking::Group reloadRecipe() final - { - using namespace Tasking; - - struct DiffStorage { - QString m_stagedOutput; - QString m_unstagedOutput; - }; - - const TreeStorage storage; - - const auto setupStaged = [this](QtcProcess &process) { - process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), m_stagedFiles)); - setupCommand(process, addConfigurationArguments( - QStringList({"diff", "--cached", "--"}) + m_stagedFiles)); - VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); - }; - const auto onStagedDone = [storage](const QtcProcess &process) { - storage->m_stagedOutput = process.cleanedStdOut(); - }; - - const auto setupUnstaged = [this](QtcProcess &process) { - process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), m_unstagedFiles)); - setupCommand(process, addConfigurationArguments( - QStringList({"diff", "--"}) + m_unstagedFiles)); - VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); - }; - const auto onUnstagedDone = [storage](const QtcProcess &process) { - storage->m_unstagedOutput = process.cleanedStdOut(); - }; - - const auto onStagingDynamicSetup = [this] { - QSet config; - if (!m_stagedFiles.isEmpty()) - config.insert(0); - if (!m_unstagedFiles.isEmpty()) - config.insert(1); - return GroupConfig{GroupAction::ContinueSelected, config}; - }; - - const auto setupProcessDiff = [this, storage](AsyncTask> &async) { - setupDiffProcessor(async, storage->m_stagedOutput + storage->m_unstagedOutput); - }; - const auto onProcessDiffDone = [this, storage](const AsyncTask> &async) { - setDiffFiles(async.result()); - }; - const auto onProcessDiffError = [this, storage](const AsyncTask> &) { - setDiffFiles({}); - }; - - const Group root { - Storage(storage), - Group { - parallel, - optional, - DynamicSetup(onStagingDynamicSetup), - Process(setupStaged, onStagedDone), - Process(setupUnstaged, onUnstagedDone) - }, - Async>(setupProcessDiff, onProcessDiffDone, onProcessDiffError) - }; - return root; - } - - QStringList m_stagedFiles; - QStringList m_unstagedFiles; + const QStringList &unstagedFiles); }; +FileListDiffController::FileListDiffController(IDocument *document, const QStringList &stagedFiles, + const QStringList &unstagedFiles) + : GitBaseDiffEditorController(document) +{ + using namespace Tasking; + + struct DiffStorage { + QString m_stagedOutput; + QString m_unstagedOutput; + }; + + const TreeStorage storage; + + const auto setupStaged = [this, stagedFiles](QtcProcess &process) { + process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), stagedFiles)); + setupCommand(process, addConfigurationArguments( + QStringList({"diff", "--cached", "--"}) + stagedFiles)); + VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); + }; + const auto onStagedDone = [storage](const QtcProcess &process) { + storage->m_stagedOutput = process.cleanedStdOut(); + }; + + const auto setupUnstaged = [this, unstagedFiles](QtcProcess &process) { + process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), unstagedFiles)); + setupCommand(process, addConfigurationArguments( + QStringList({"diff", "--"}) + unstagedFiles)); + VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); + }; + const auto onUnstagedDone = [storage](const QtcProcess &process) { + storage->m_unstagedOutput = process.cleanedStdOut(); + }; + + const auto onStagingDynamicSetup = [stagedFiles, unstagedFiles] { + QSet config; + if (!stagedFiles.isEmpty()) + config.insert(0); + if (!unstagedFiles.isEmpty()) + config.insert(1); + return GroupConfig{GroupAction::ContinueSelected, config}; + }; + + const auto setupProcessDiff = [this, storage](AsyncTask> &async) { + setupDiffProcessor(async, storage->m_stagedOutput + storage->m_unstagedOutput); + }; + const auto onProcessDiffDone = [this, storage](const AsyncTask> &async) { + setDiffFiles(async.result()); + }; + const auto onProcessDiffError = [this, storage](const AsyncTask> &) { + setDiffFiles({}); + }; + + const Group root { + Storage(storage), + Group { + parallel, + optional, + DynamicSetup(onStagingDynamicSetup), + Process(setupStaged, onStagedDone), + Process(setupUnstaged, onUnstagedDone) + }, + Async>(setupProcessDiff, onProcessDiffDone, onProcessDiffError) + }; + setReloadRecipe(root); +} + class ShowController : public GitBaseDiffEditorController { Q_OBJECT public: - ShowController(IDocument *document, const QString &id) - : GitBaseDiffEditorController(document) - , m_id(id) - { - setDisplayName("Git Show"); - } - -private: - Tasking::Group reloadRecipe() final; - const QString m_id; + ShowController(IDocument *document, const QString &id); }; -Tasking::Group ShowController::reloadRecipe() +ShowController::ShowController(IDocument *document, const QString &id) + : GitBaseDiffEditorController(document) { + setDisplayName("Git Show"); static const QString busyMessage = Tr::tr(""); using namespace Tasking; @@ -333,9 +321,9 @@ Tasking::Group ShowController::reloadRecipe() const TreeStorage storage; - const auto setupDescription = [this](QtcProcess &process) { + const auto setupDescription = [this, id](QtcProcess &process) { process.setCodec(m_instance->encoding(workingDirectory(), "i18n.commitEncoding")); - setupCommand(process, {"show", "-s", noColorOption, showFormatC, m_id}); + setupCommand(process, {"show", "-s", noColorOption, showFormatC, id}); VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); setDescription(Tr::tr("Waiting for data...")); }; @@ -460,10 +448,10 @@ Tasking::Group ShowController::reloadRecipe() taskTree.setupRoot(tasks); }; - const auto setupDiff = [this](QtcProcess &process) { + const auto setupDiff = [this, id](QtcProcess &process) { setupCommand(process, addConfigurationArguments( {"show", "--format=format:", // omit header, already generated - noColorOption, decorateOption, m_id})); + noColorOption, decorateOption, id})); VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); }; const auto onDiffDone = [storage](const QtcProcess &process) { @@ -483,7 +471,7 @@ Tasking::Group ShowController::reloadRecipe() const Group root { Storage(storage), parallel, - OnGroupSetup([this] { setStartupFile(VcsBase::source(document())); }), + OnGroupSetup([this] { setStartupFile(VcsBase::source(this->document())); }), Group { optional, Process(setupDescription, onDescriptionDone), @@ -501,7 +489,7 @@ Tasking::Group ShowController::reloadRecipe() Async>(setupProcessDiff, onProcessDiffDone, onProcessDiffError) } }; - return root; + setReloadRecipe(root); } ///////////////////////////////