diff options
-rw-r--r-- | src/libs/utils/outputformatter.cpp | 22 | ||||
-rw-r--r-- | src/libs/utils/outputformatter.h | 1 | ||||
-rw-r--r-- | src/plugins/coreplugin/iversioncontrol.cpp | 7 | ||||
-rw-r--r-- | src/plugins/coreplugin/iversioncontrol.h | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/outputwindow.cpp | 14 | ||||
-rw-r--r-- | src/plugins/coreplugin/outputwindow.h | 1 | ||||
-rw-r--r-- | src/plugins/git/gitplugin.cpp | 19 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsoutputformatter.cpp | 13 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsoutputformatter.h | 5 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsoutputwindow.cpp | 20 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsoutputwindow.h | 3 |
11 files changed, 70 insertions, 37 deletions
diff --git a/src/libs/utils/outputformatter.cpp b/src/libs/utils/outputformatter.cpp index 31ed810012..355fcb24ab 100644 --- a/src/libs/utils/outputformatter.cpp +++ b/src/libs/utils/outputformatter.cpp @@ -489,20 +489,26 @@ void OutputFormatter::dumpIncompleteLine(const QString &line, OutputFormat forma d->incompleteLine.second = format; } +bool OutputFormatter::handleFileLink(const QString &href) +{ + if (!OutputLineParser::isLinkTarget(href)) + return false; + FilePath filePath; + int line; + int column; + OutputLineParser::parseLinkTarget(href, filePath, line, column); + QTC_ASSERT(!filePath.isEmpty(), return false); + emit openInEditorRequested(filePath, line, column); + return true; +} + void OutputFormatter::handleLink(const QString &href) { QTC_ASSERT(!href.isEmpty(), return); // We can handle absolute file paths ourselves. Other types of references are forwarded // to the line parsers. - if (OutputLineParser::isLinkTarget(href)) { - FilePath filePath; - int line; - int column; - OutputLineParser::parseLinkTarget(href, filePath, line, column); - QTC_ASSERT(!filePath.isEmpty(), return); - emit openInEditorRequested(filePath, line, column); + if (handleFileLink(href)) return; - } for (OutputLineParser * const f : qAsConst(d->lineParsers)) { if (f->handleLink(href)) return; diff --git a/src/libs/utils/outputformatter.h b/src/libs/utils/outputformatter.h index 6cc9ca7b80..6c8539d3ed 100644 --- a/src/libs/utils/outputformatter.h +++ b/src/libs/utils/outputformatter.h @@ -151,6 +151,7 @@ public: void clear(); // Clears the text edit, if there is one. void reset(); // Wipes everything except the text edit. + bool handleFileLink(const QString &href); void handleLink(const QString &href); void setBoldFontEnabled(bool enabled); diff --git a/src/plugins/coreplugin/iversioncontrol.cpp b/src/plugins/coreplugin/iversioncontrol.cpp index d74775993f..5dee9e2d27 100644 --- a/src/plugins/coreplugin/iversioncontrol.cpp +++ b/src/plugins/coreplugin/iversioncontrol.cpp @@ -201,6 +201,13 @@ void IVersionControl::fillLinkContextMenu(QMenu *, const QString &, const QStrin { } +bool IVersionControl::handleLink(const QString &workingDirectory, const QString &reference) +{ + QTC_ASSERT(!reference.isEmpty(), return false); + vcsDescribe(workingDirectory, reference); + return true; +} + } // namespace Core #if defined(WITH_TESTS) diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index 2546c05c2b..54a9adff8e 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -237,6 +237,8 @@ public: const QString &workingDirectory, const QString &reference); + virtual bool handleLink(const QString &workingDirectory, const QString &reference); + class CORE_EXPORT RepoUrl { public: RepoUrl(const QString &location); diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index b8a5351abd..7c05ee6630 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -183,13 +183,17 @@ void OutputWindow::mousePressEvent(QMouseEvent *e) QPlainTextEdit::mousePressEvent(e); } +void OutputWindow::handleLink(const QPoint &pos) +{ + const QString href = anchorAt(pos); + if (!href.isEmpty()) + d->formatter.handleLink(href); +} + void OutputWindow::mouseReleaseEvent(QMouseEvent *e) { - if (d->linksActive && d->mouseButtonPressed == Qt::LeftButton) { - const QString href = anchorAt(e->pos()); - if (!href.isEmpty()) - d->formatter.handleLink(href); - } + if (d->linksActive && d->mouseButtonPressed == Qt::LeftButton) + handleLink(e->pos()); // Mouse was released, activate links again d->linksActive = true; diff --git a/src/plugins/coreplugin/outputwindow.h b/src/plugins/coreplugin/outputwindow.h index 91a69d2042..c29d1a5a07 100644 --- a/src/plugins/coreplugin/outputwindow.h +++ b/src/plugins/coreplugin/outputwindow.h @@ -92,6 +92,7 @@ public slots: protected: bool isScrollbarAtBottom() const; + virtual void handleLink(const QPoint &pos); private: QMimeData *createMimeDataFromSelection() const override; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index d256ff4e2f..6a17e89f08 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -271,6 +271,15 @@ public: GitClient::addChangeActions(menu, workingDirectory, reference); } + bool handleLink(const QString &workingDirectory, const QString &reference) final + { + if (reference.contains("..")) + GitClient::instance()->log(workingDirectory, {}, false, {reference}); + else + GitClient::instance()->show(workingDirectory, reference); + return true; + } + RepoUrl getRepoUrl(const QString &location) const override; QStringList additionalToolsPath() const final; @@ -1001,16 +1010,6 @@ GitPluginPrivate::GitPluginPrivate() m_gerritPlugin->updateActions(currentState()); m_gerritPlugin->addToLocator(m_commandLocator); - connect(VcsOutputWindow::instance(), &VcsOutputWindow::referenceClicked, - this, [this](const QString &name) { - const VcsBasePluginState state = currentState(); - QTC_ASSERT(state.hasTopLevel(), return); - if (name.contains("..")) - m_gitClient.log(state.topLevel(), {}, false, {name}); - else - m_gitClient.show(state.topLevel(), name); - }); - } void GitPluginPrivate::diffCurrentFile() diff --git a/src/plugins/vcsbase/vcsoutputformatter.cpp b/src/plugins/vcsbase/vcsoutputformatter.cpp index f2fb8fd3be..320f6c326a 100644 --- a/src/plugins/vcsbase/vcsoutputformatter.cpp +++ b/src/plugins/vcsbase/vcsoutputformatter.cpp @@ -64,14 +64,17 @@ Utils::OutputLineParser::Result VcsOutputLineParser::handleLine(const QString &t return {Status::Done, linkSpecs}; } -bool VcsOutputLineParser::handleLink(const QString &href) +bool VcsOutputLineParser::handleVcsLink(const QString &workingDirectory, const QString &href) { + using namespace Core; QTC_ASSERT(!href.isEmpty(), return false); - if (href.startsWith("http://") || href.startsWith("https://")) + if (href.startsWith("http://") || href.startsWith("https://")) { QDesktopServices::openUrl(QUrl(href)); - else - emit referenceClicked(href); - return true; + return true; + } + if (IVersionControl *vcs = VcsManager::findVersionControlForDirectory(workingDirectory)) + return vcs->handleLink(workingDirectory, href); + return false; } void VcsOutputLineParser::fillLinkContextMenu( diff --git a/src/plugins/vcsbase/vcsoutputformatter.h b/src/plugins/vcsbase/vcsoutputformatter.h index 0b9486e2a9..7c8306811b 100644 --- a/src/plugins/vcsbase/vcsoutputformatter.h +++ b/src/plugins/vcsbase/vcsoutputformatter.h @@ -37,13 +37,10 @@ class VcsOutputLineParser : public Utils::OutputLineParser public: VcsOutputLineParser(); void fillLinkContextMenu(QMenu *menu, const QString &workingDirectory, const QString &href); - -signals: - void referenceClicked(const QString &reference); + bool handleVcsLink(const QString &workingDirectory, const QString &href); private: Result handleLine(const QString &text, Utils::OutputFormat format) override; - bool handleLink(const QString &href) override; const QRegularExpression m_regexp; }; diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp index 2aac7b1bda..39b8d51d57 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.cpp +++ b/src/plugins/vcsbase/vcsoutputwindow.cpp @@ -104,6 +104,7 @@ public: protected: void contextMenuEvent(QContextMenuEvent *event) override; + void handleLink(const QPoint &pos) override; private: void setFormat(VcsOutputWindow::MessageStyle style); @@ -214,6 +215,23 @@ void OutputWindowPlainTextEdit::contextMenuEvent(QContextMenuEvent *event) delete menu; } +void OutputWindowPlainTextEdit::handleLink(const QPoint &pos) +{ + const QString href = anchorAt(pos); + if (href.isEmpty()) + return; + QString repository; + identifierUnderCursor(pos, &repository); + if (repository.isEmpty()) { + OutputWindow::handleLink(pos); + return; + } + if (outputFormatter()->handleFileLink(href)) + return; + if (VcsOutputLineParser * const p = parser()) + p->handleVcsLink(repository, href); +} + void OutputWindowPlainTextEdit::appendLines(const QString &s, const QString &repository) { if (s.isEmpty()) @@ -310,8 +328,6 @@ VcsOutputWindow::VcsOutputWindow() connect(this, &IOutputPane::resetZoom, &d->widget, &Core::OutputWindow::resetZoom); connect(TextEditor::TextEditorSettings::instance(), &TextEditor::TextEditorSettings::behaviorSettingsChanged, this, updateBehaviorSettings); - connect(d->widget.parser(), &VcsOutputLineParser::referenceClicked, - VcsOutputWindow::instance(), &VcsOutputWindow::referenceClicked); } static QString filterPasswordFromUrls(QString input) diff --git a/src/plugins/vcsbase/vcsoutputwindow.h b/src/plugins/vcsbase/vcsoutputwindow.h index b609827363..749e824c38 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.h +++ b/src/plugins/vcsbase/vcsoutputwindow.h @@ -76,9 +76,6 @@ public: Message, // A blue message text (e.g. "command has finished successfully") }; -signals: - void referenceClicked(const QString &reference); - public slots: static void setRepository(const QString &); static void clearRepository(); |