aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2020-06-18 00:04:17 +0300
committerOrgad Shaneh <orgads@gmail.com>2020-06-21 06:47:20 +0000
commit92a4c0d38a007f778893f7b971f747e1a803eac3 (patch)
tree86f1a65f2200154141b80a4d3026c8dc3f358099
parentcb0b8556c81437dc02ca3abd9cca26ef44ad6c28 (diff)
VCS: Pass links to the correct VCS
Current implementation requires each VCS to connect to the referenceClicked signal. Only Git does it, but this is conceptually wrong. If other VCSs would connect to the same signal, all of them will act upon clicking a link, which can result in multiple editors, most of them are likely to be invalid anyway. By default executes vcsDescribe. Can be extended or modified by subclasses. Change-Id: Ib953009efd77446a4b2963f0aa8a2f3f3d26509f Reviewed-by: Artur Shepilko <artur.shepilko@nomadbyte.com> Reviewed-by: André Hartmann <aha_1980@gmx.de>
-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();