aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/outputformatter.cpp22
-rw-r--r--src/libs/utils/outputformatter.h1
-rw-r--r--src/plugins/coreplugin/iversioncontrol.cpp7
-rw-r--r--src/plugins/coreplugin/iversioncontrol.h2
-rw-r--r--src/plugins/coreplugin/outputwindow.cpp14
-rw-r--r--src/plugins/coreplugin/outputwindow.h1
-rw-r--r--src/plugins/git/gitplugin.cpp19
-rw-r--r--src/plugins/vcsbase/vcsoutputformatter.cpp13
-rw-r--r--src/plugins/vcsbase/vcsoutputformatter.h5
-rw-r--r--src/plugins/vcsbase/vcsoutputwindow.cpp20
-rw-r--r--src/plugins/vcsbase/vcsoutputwindow.h3
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();