From a9887bf4cc76cbf9b3fd88c939ed4f90ccfbb8c2 Mon Sep 17 00:00:00 2001 From: Francesc Martinez Date: Sun, 3 May 2020 09:57:01 +0200 Subject: [PATCH] francescmm/GitQlientPlugin#6 Add edit file option This option will work in QtCreator for now. The plan would be to extend the functionality in GitQlient in the future. --- src/aux_widgets/ConflictButton.cpp | 37 ++++++++++++++++------------ src/aux_widgets/ConflictButton.h | 8 ++++++ src/big_widgets/DiffWidget.cpp | 1 + src/big_widgets/DiffWidget.h | 8 ++++++ src/big_widgets/GitQlient.cpp | 1 + src/big_widgets/GitQlient.h | 3 +++ src/big_widgets/GitQlientRepo.cpp | 3 +++ src/big_widgets/GitQlientRepo.h | 7 ++++++ src/big_widgets/HistoryWidget.cpp | 2 ++ src/big_widgets/HistoryWidget.h | 9 +++++++ src/big_widgets/MergeWidget.cpp | 1 + src/big_widgets/MergeWidget.h | 8 ++++++ src/commits/CommitInfoWidget.cpp | 1 + src/commits/CommitInfoWidget.h | 8 ++++++ src/commits/FileContextMenu.cpp | 10 +++++++- src/commits/FileContextMenu.h | 5 ++++ src/commits/FileListWidget.cpp | 3 +++ src/commits/FileListWidget.h | 8 ++++++ src/commits/UnstagedMenu.cpp | 6 +++++ src/commits/UnstagedMenu.h | 1 + src/commits/WorkInProgressWidget.cpp | 2 ++ src/commits/WorkInProgressWidget.h | 8 ++++++ src/diff/CommitDiffWidget.cpp | 1 + src/diff/CommitDiffWidget.h | 9 +++++++ src/main.cpp | 4 +++ 25 files changed, 137 insertions(+), 17 deletions(-) diff --git a/src/aux_widgets/ConflictButton.cpp b/src/aux_widgets/ConflictButton.cpp index 6bcc450e..84f371b6 100644 --- a/src/aux_widgets/ConflictButton.cpp +++ b/src/aux_widgets/ConflictButton.cpp @@ -75,31 +75,36 @@ void ConflictButton::openFileEditor() { const auto fullPath = QString(mGit->getWorkingDir() + "/" + mFileName); - // get external diff viewer command GitQlientSettings settings; - const auto editor - = settings.value(GitQlientSettings::ExternalEditorKey, GitQlientSettings::ExternalEditorValue).toString(); - auto processCmd = editor; + if (!settings.value("isGitQlient", false).toBool()) + emit signalEditFile(fullPath, 0, 0); + else + { + const auto editor + = settings.value(GitQlientSettings::ExternalEditorKey, GitQlientSettings::ExternalEditorValue).toString(); - if (!editor.contains("%1")) - processCmd.append(" %1"); + auto processCmd = editor; - processCmd = processCmd.arg(fullPath); + if (!editor.contains("%1")) + processCmd.append(" %1"); - const auto externalEditor = new QProcess(); - connect(externalEditor, SIGNAL(finished(int, QProcess::ExitStatus)), externalEditor, SLOT(deleteLater())); + processCmd = processCmd.arg(fullPath); - externalEditor->setWorkingDirectory(mGit->getWorkingDir()); + const auto externalEditor = new QProcess(); + connect(externalEditor, SIGNAL(finished(int, QProcess::ExitStatus)), externalEditor, SLOT(deleteLater())); - externalEditor->start(processCmd); + externalEditor->setWorkingDirectory(mGit->getWorkingDir()); - if (!externalEditor->waitForStarted(10000)) - { - QString text = QString("Cannot start external editor: %1.").arg(editor); + externalEditor->start(processCmd); + + if (!externalEditor->waitForStarted(10000)) + { + QString text = QString("Cannot start external editor: %1.").arg(editor); - QLog_Error("UI", text); + QLog_Error("UI", text); - delete externalEditor; + delete externalEditor; + } } } diff --git a/src/aux_widgets/ConflictButton.h b/src/aux_widgets/ConflictButton.h index ba6e6f85..aa452188 100644 --- a/src/aux_widgets/ConflictButton.h +++ b/src/aux_widgets/ConflictButton.h @@ -58,6 +58,14 @@ class ConflictButton : public QFrame */ void updateRequested(); + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + * @param fileName The file name + * @param line The line + * @param column The column + */ + void signalEditFile(const QString &fileName, int line, int column); + public: /** * @brief Default constructor. diff --git a/src/big_widgets/DiffWidget.cpp b/src/big_widgets/DiffWidget.cpp index 380da9d1..592eb9b7 100644 --- a/src/big_widgets/DiffWidget.cpp +++ b/src/big_widgets/DiffWidget.cpp @@ -56,6 +56,7 @@ DiffWidget::DiffWidget(const QSharedPointer git, QSharedPointer(sender())->currentDir(); diff --git a/src/big_widgets/GitQlient.h b/src/big_widgets/GitQlient.h index c1989fbd..dfa9caef 100644 --- a/src/big_widgets/GitQlient.h +++ b/src/big_widgets/GitQlient.h @@ -38,6 +38,9 @@ class ConfigWidget; class GitQlient : public QWidget { Q_OBJECT +signals: + void signalEditDocument(const QString &fileName, int line, int column); + public: /*! \brief Default constructor. Creates an empty GitQlient instance. diff --git a/src/big_widgets/GitQlientRepo.cpp b/src/big_widgets/GitQlientRepo.cpp index 60aba711..b20f695b 100644 --- a/src/big_widgets/GitQlientRepo.cpp +++ b/src/big_widgets/GitQlientRepo.cpp @@ -79,6 +79,7 @@ GitQlientRepo::GitQlientRepo(const QString &repoPath, QWidget *parent) connect(mControls, &Controls::signalPullConflict, mControls, &Controls::activateMergeWarning); connect(mControls, &Controls::signalPullConflict, this, &GitQlientRepo::showPullConflict); + connect(mHistoryWidget, &HistoryWidget::signalEditFile, this, &GitQlientRepo::signalEditFile); connect(mHistoryWidget, &HistoryWidget::signalAllBranchesActive, mGitLoader.data(), &GitRepoLoader::setShowAll); connect(mHistoryWidget, &HistoryWidget::signalAllBranchesActive, this, &GitQlientRepo::updateCache); connect(mHistoryWidget, &HistoryWidget::signalUpdateCache, this, &GitQlientRepo::updateCache); @@ -101,6 +102,7 @@ GitQlientRepo::GitQlientRepo(const QString &repoPath, QWidget *parent) connect(mDiffWidget, &DiffWidget::signalShowFileHistory, this, &GitQlientRepo::showFileHistory); connect(mDiffWidget, &DiffWidget::signalDiffEmpty, mControls, &Controls::disableDiff); connect(mDiffWidget, &DiffWidget::signalDiffEmpty, this, &GitQlientRepo::showPreviousView); + connect(mDiffWidget, &DiffWidget::signalEditFile, this, &GitQlientRepo::signalEditFile); connect(mBlameWidget, &BlameWidget::showFileDiff, this, &GitQlientRepo::loadFileDiff); connect(mBlameWidget, &BlameWidget::signalOpenDiff, this, &GitQlientRepo::openCommitCompareDiff); @@ -108,6 +110,7 @@ GitQlientRepo::GitQlientRepo(const QString &repoPath, QWidget *parent) connect(mMergeWidget, &MergeWidget::signalMergeFinished, this, &GitQlientRepo::showHistoryView); connect(mMergeWidget, &MergeWidget::signalMergeFinished, this, &GitQlientRepo::updateCache); connect(mMergeWidget, &MergeWidget::signalMergeFinished, mControls, &Controls::disableMergeWarning); + connect(mMergeWidget, &MergeWidget::signalEditFile, this, &GitQlientRepo::signalEditFile); connect(mGitLoader.data(), &GitRepoLoader::signalLoadingStarted, this, &GitQlientRepo::updateProgressDialog, Qt::DirectConnection); diff --git a/src/big_widgets/GitQlientRepo.h b/src/big_widgets/GitQlientRepo.h index 5b9eff0e..0fbfc61f 100644 --- a/src/big_widgets/GitQlientRepo.h +++ b/src/big_widgets/GitQlientRepo.h @@ -74,6 +74,13 @@ class GitQlientRepo : public QFrame \param submoduleName The submodule name. */ void signalOpenSubmodule(const QString &submoduleName); + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + * @param fileName The file name + * @param line The line + * @param column The column + */ + void signalEditFile(const QString &fileName, int line, int column); public: /*! diff --git a/src/big_widgets/HistoryWidget.cpp b/src/big_widgets/HistoryWidget.cpp index aa6832c3..dff12034 100644 --- a/src/big_widgets/HistoryWidget.cpp +++ b/src/big_widgets/HistoryWidget.cpp @@ -46,6 +46,7 @@ HistoryWidget::HistoryWidget(const QSharedPointer &cache, const mCommitStackedWidget->addWidget(mCommitWidget); mCommitStackedWidget->setFixedWidth(310); + connect(mCommitWidget, &WorkInProgressWidget::signalEditFile, this, &HistoryWidget::signalEditFile); connect(mCommitWidget, &WorkInProgressWidget::signalShowDiff, this, &HistoryWidget::signalShowDiff); connect(mCommitWidget, &WorkInProgressWidget::signalChangesCommitted, this, &HistoryWidget::signalChangesCommitted); connect(mCommitWidget, &WorkInProgressWidget::signalCheckoutPerformed, this, &HistoryWidget::signalUpdateUi); @@ -55,6 +56,7 @@ HistoryWidget::HistoryWidget(const QSharedPointer &cache, const connect(mRevisionWidget, &CommitInfoWidget::signalOpenFileCommit, this, &HistoryWidget::signalShowDiff); connect(mRevisionWidget, &CommitInfoWidget::signalShowFileHistory, this, &HistoryWidget::signalShowFileHistory); + connect(mRevisionWidget, &CommitInfoWidget::signalEditFile, this, &HistoryWidget::signalEditFile); mSearchInput->setPlaceholderText(tr("Press Enter to search by SHA or log message...")); connect(mSearchInput, &QLineEdit::returnPressed, this, &HistoryWidget::search); diff --git a/src/big_widgets/HistoryWidget.h b/src/big_widgets/HistoryWidget.h index 10d88697..854c31de 100644 --- a/src/big_widgets/HistoryWidget.h +++ b/src/big_widgets/HistoryWidget.h @@ -99,6 +99,15 @@ class HistoryWidget : public QFrame \param fileName The file name for the diff. */ void signalShowDiff(const QString &sha, const QString &parentSha, const QString &fileName); + + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + * @param fileName The file name + * @param line The line + * @param column The column + */ + void signalEditFile(const QString &fileName, int line, int column); + /*! \brief Signal triggered when changes are commited. diff --git a/src/big_widgets/MergeWidget.cpp b/src/big_widgets/MergeWidget.cpp index 80f774be..30148574 100644 --- a/src/big_widgets/MergeWidget.cpp +++ b/src/big_widgets/MergeWidget.cpp @@ -144,6 +144,7 @@ void MergeWidget::fillButtonFileList(const RevisionFiles &files) connect(fileBtn, &ConflictButton::toggled, this, &MergeWidget::changeDiffView); connect(fileBtn, &ConflictButton::updateRequested, this, &MergeWidget::onUpdateRequested); connect(fileBtn, &ConflictButton::resolved, this, &MergeWidget::onConflictResolved); + connect(fileBtn, &ConflictButton::signalEditFile, this, &MergeWidget::signalEditFile); const auto wip = mGitQlientCache->getCommitInfo(CommitInfo::ZERO_SHA); const auto fileDiffWidget = new FileDiffWidget(mGit); diff --git a/src/big_widgets/MergeWidget.h b/src/big_widgets/MergeWidget.h index 188c9704..d06c80f6 100644 --- a/src/big_widgets/MergeWidget.h +++ b/src/big_widgets/MergeWidget.h @@ -58,6 +58,14 @@ class MergeWidget : public QFrame */ void signalMergeFinished(); + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + * @param fileName The file name + * @param line The line + * @param column The column + */ + void signalEditFile(const QString &fileName, int line, int column); + public: enum class ConflictReason { diff --git a/src/commits/CommitInfoWidget.cpp b/src/commits/CommitInfoWidget.cpp index 414adb40..933586f0 100644 --- a/src/commits/CommitInfoWidget.cpp +++ b/src/commits/CommitInfoWidget.cpp @@ -86,6 +86,7 @@ CommitInfoWidget::CommitInfoWidget(const QSharedPointer &cache, connect(fileListWidget, &FileListWidget::itemDoubleClicked, this, [this](QListWidgetItem *item) { emit signalOpenFileCommit(mCurrentSha, mParentSha, item->text()); }); connect(fileListWidget, &FileListWidget::signalShowFileHistory, this, &CommitInfoWidget::signalShowFileHistory); + connect(fileListWidget, &FileListWidget::signalEditFile, this, &CommitInfoWidget::signalEditFile); } void CommitInfoWidget::configure(const QString &sha) diff --git a/src/commits/CommitInfoWidget.h b/src/commits/CommitInfoWidget.h index d37e5f09..eb0b1302 100644 --- a/src/commits/CommitInfoWidget.h +++ b/src/commits/CommitInfoWidget.h @@ -39,6 +39,14 @@ class CommitInfoWidget : public QWidget void signalOpenFileContextMenu(const QString &, int); void signalShowFileHistory(const QString &fileName); + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + * @param fileName The file name + * @param line The line + * @param column The column + */ + void signalEditFile(const QString &fileName, int line, int column); + public: explicit CommitInfoWidget(const QSharedPointer &cache, const QSharedPointer &git, QWidget *parent = nullptr); diff --git a/src/commits/FileContextMenu.cpp b/src/commits/FileContextMenu.cpp index 7ca90287..a65d57dd 100644 --- a/src/commits/FileContextMenu.cpp +++ b/src/commits/FileContextMenu.cpp @@ -1,8 +1,9 @@ #include "FileContextMenu.h" +#include + #include #include -#include FileContextMenu::FileContextMenu(const QString &file, QWidget *parent) : QMenu(parent) @@ -19,6 +20,13 @@ FileContextMenu::FileContextMenu(const QString &file, QWidget *parent) addSeparator(); + GitQlientSettings settings; + + if (!settings.value("isGitQlient", false).toBool()) + connect(addAction("Edit file"), &QAction::triggered, this, [this]() { emit signalEditFile(); }); + + addSeparator(); + const auto copyPathAction = addAction(tr("Copy path")); connect(copyPathAction, &QAction::triggered, this, [file]() { QSettings settings; diff --git a/src/commits/FileContextMenu.h b/src/commits/FileContextMenu.h index 835358ef..2745ce40 100644 --- a/src/commits/FileContextMenu.h +++ b/src/commits/FileContextMenu.h @@ -33,6 +33,11 @@ class FileContextMenu : public QMenu void signalOpenFileDiff(); void signalShowFileHistory(); + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + */ + void signalEditFile(); + public: explicit FileContextMenu(const QString &file, QWidget *parent = nullptr); }; diff --git a/src/commits/FileListWidget.cpp b/src/commits/FileListWidget.cpp index da8970d0..9e3c048b 100644 --- a/src/commits/FileListWidget.cpp +++ b/src/commits/FileListWidget.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -52,6 +53,8 @@ void FileListWidget::showContextMenu(const QPoint &pos) [this, fileName]() { emit signalShowFileHistory(fileName); }); connect(menu, &FileContextMenu::signalOpenFileDiff, this, [this, item] { emit QListWidget::itemDoubleClicked(item); }); + connect(menu, &FileContextMenu::signalEditFile, this, + [this, fileName]() { emit signalEditFile(mGit->getWorkingDir() + "/" + fileName, 0, 0); }); menu->exec(viewport()->mapToGlobal(pos)); } } diff --git a/src/commits/FileListWidget.h b/src/commits/FileListWidget.h index cc062e1d..4895a5fe 100644 --- a/src/commits/FileListWidget.h +++ b/src/commits/FileListWidget.h @@ -36,6 +36,14 @@ class FileListWidget : public QListWidget signals: void signalShowFileHistory(const QString &fileName); + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + * @param fileName The file name + * @param line The line + * @param column The column + */ + void signalEditFile(const QString &fileName, int line, int column); + public: explicit FileListWidget(const QSharedPointer &git, QSharedPointer cache, QWidget *parent = nullptr); diff --git a/src/commits/UnstagedMenu.cpp b/src/commits/UnstagedMenu.cpp index dc98ff7a..e8d9dddf 100644 --- a/src/commits/UnstagedMenu.cpp +++ b/src/commits/UnstagedMenu.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -19,6 +20,11 @@ UnstagedMenu::UnstagedMenu(const QSharedPointer &git, const QString &fi connect(addAction("See changes"), &QAction::triggered, this, [this]() { emit signalShowDiff(mFileName); }); connect(addAction("Blame"), &QAction::triggered, this, [this]() { emit signalShowFileHistory(mFileName); }); + GitQlientSettings settings; + + if (!settings.value("isGitQlient", false).toBool()) + connect(addAction("Edit file"), &QAction::triggered, this, [this]() { emit signalEditFile(); }); + addSeparator(); if (hasConflicts) diff --git a/src/commits/UnstagedMenu.h b/src/commits/UnstagedMenu.h index 97c41a9e..28ed72ff 100644 --- a/src/commits/UnstagedMenu.h +++ b/src/commits/UnstagedMenu.h @@ -37,6 +37,7 @@ class UnstagedMenu : public QMenu void signalRevertAll(); void signalCheckedOut(bool success); void signalShowFileHistory(const QString &fileName); + void signalEditFile(); void signalConflictsResolved(); void signalStageFile(); diff --git a/src/commits/WorkInProgressWidget.cpp b/src/commits/WorkInProgressWidget.cpp index f6085bd1..2eac8f3a 100644 --- a/src/commits/WorkInProgressWidget.cpp +++ b/src/commits/WorkInProgressWidget.cpp @@ -468,6 +468,8 @@ void WorkInProgressWidget::showUnstagedMenu(const QPoint &pos) const auto fileName = item->toolTip(); const auto unsolvedConflicts = item->data(GitQlientRole::U_IsConflict).toBool(); const auto contextMenu = new UnstagedMenu(mGit, fileName, unsolvedConflicts, this); + connect(contextMenu, &UnstagedMenu::signalEditFile, this, + [this, fileName]() { emit signalEditFile(mGit->getWorkingDir() + "/" + fileName, 0, 0); }); connect(contextMenu, &UnstagedMenu::signalShowDiff, this, &WorkInProgressWidget::requestDiff); connect(contextMenu, &UnstagedMenu::signalCommitAll, this, &WorkInProgressWidget::addAllFilesToCommitList); connect(contextMenu, &UnstagedMenu::signalRevertAll, this, &WorkInProgressWidget::revertAllChanges); diff --git a/src/commits/WorkInProgressWidget.h b/src/commits/WorkInProgressWidget.h index b4822a54..06ab0716 100644 --- a/src/commits/WorkInProgressWidget.h +++ b/src/commits/WorkInProgressWidget.h @@ -49,6 +49,14 @@ class WorkInProgressWidget : public QWidget void signalUpdateWip(); void signalCancelAmend(const QString &commitSha); + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + * @param fileName The file name + * @param line The line + * @param column The column + */ + void signalEditFile(const QString &fileName, int line, int column); + public: explicit WorkInProgressWidget(const QSharedPointer &cache, const QSharedPointer &git, QWidget *parent = nullptr); diff --git a/src/diff/CommitDiffWidget.cpp b/src/diff/CommitDiffWidget.cpp index cb95a588..64fc0813 100644 --- a/src/diff/CommitDiffWidget.cpp +++ b/src/diff/CommitDiffWidget.cpp @@ -40,6 +40,7 @@ CommitDiffWidget::CommitDiffWidget(QSharedPointer git, QSharedPointertext()); }); connect(fileListWidget, &FileListWidget::signalShowFileHistory, this, &CommitDiffWidget::signalShowFileHistory); + connect(fileListWidget, &FileListWidget::signalEditFile, this, &CommitDiffWidget::signalEditFile); } void CommitDiffWidget::configure(const QString &firstSha, const QString &secondSha) diff --git a/src/diff/CommitDiffWidget.h b/src/diff/CommitDiffWidget.h index 479b5185..621dc3f1 100644 --- a/src/diff/CommitDiffWidget.h +++ b/src/diff/CommitDiffWidget.h @@ -54,6 +54,7 @@ class CommitDiffWidget : public QFrame \param file The file to show the diff. */ void signalOpenFileCommit(const QString ¤tSha, const QString &previousSha, const QString &file); + /*! \brief Signal triggered when the user whats to see the blame history for a given file. @@ -61,6 +62,14 @@ class CommitDiffWidget : public QFrame */ void signalShowFileHistory(const QString &fileName); + /** + * @brief signalEditFile Signal triggered when the user wants to edit a file and is running GitQlient from QtCreator. + * @param fileName The file name + * @param line The line + * @param column The column + */ + void signalEditFile(const QString &fileName, int line, int column); + public: /*! \brief Default constructor. diff --git a/src/main.cpp b/src/main.cpp index 4a7e3a52..4de18ce3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,6 +4,7 @@ #include #include +#include using namespace QLogger; @@ -27,6 +28,9 @@ int main(int argc, char *argv[]) QFontDatabase::addApplicationFont(":/Ubuntu"); QFontDatabase::addApplicationFont(":/UbuntuMono"); + GitQlientSettings settings; + settings.setValue("isGitQlient", true); + GitQlient mainWin(arguments); mainWin.showMaximized();