Terminal: Open Link with line/column info

Change-Id: I3e70a7c33a935b7bd3e12fb903148bcd60ff55aa
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Marcus Tillmanns
2023-03-06 12:25:26 +01:00
parent 7a2bd0898d
commit 665ae04605
4 changed files with 43 additions and 13 deletions

View File

@@ -27,7 +27,11 @@ public:
static Link fromString(const QString &filePathWithNumbers, bool canContainLineNumber = false); static Link fromString(const QString &filePathWithNumbers, bool canContainLineNumber = false);
bool hasValidTarget() const bool hasValidTarget() const
{ return !targetFilePath.isEmpty(); } {
if (!targetFilePath.isEmpty())
return true;
return !targetFilePath.scheme().isEmpty() || !targetFilePath.host().isEmpty();
}
bool hasValidLinkText() const bool hasValidLinkText() const
{ return linkTextStart != linkTextEnd; } { return linkTextStart != linkTextEnd; }

View File

@@ -3,7 +3,6 @@
#include "terminalwidget.h" #include "terminalwidget.h"
#include "glyphcache.h" #include "glyphcache.h"
#include "keys.h"
#include "terminalsettings.h" #include "terminalsettings.h"
#include "terminalsurface.h" #include "terminalsurface.h"
#include "terminaltr.h" #include "terminaltr.h"
@@ -993,11 +992,12 @@ void TerminalWidget::mousePressEvent(QMouseEvent *event)
if (event->button() == Qt::LeftButton && event->modifiers() == Qt::ControlModifier) { if (event->button() == Qt::LeftButton && event->modifiers() == Qt::ControlModifier) {
if (m_linkSelection) { if (m_linkSelection) {
if (m_linkSelection->filePath.scheme().toString().startsWith("http")) { if (m_linkSelection->link.targetFilePath.scheme().toString().startsWith("http")) {
QDesktopServices::openUrl(m_linkSelection->filePath.toUrl()); QDesktopServices::openUrl(m_linkSelection->link.targetFilePath.toUrl());
return; return;
} }
Core::EditorManager::openEditorAt(Utils::Link(m_linkSelection->filePath));
Core::EditorManager::openEditorAt(m_linkSelection->link);
} }
return; return;
} }
@@ -1062,17 +1062,20 @@ void TerminalWidget::checkLinkAt(const QPoint &pos)
const TextAndOffsets hit = textAt(pos); const TextAndOffsets hit = textAt(pos);
if (hit.text.size() > 0) { if (hit.text.size() > 0) {
QString t = QString::fromUcs4(hit.text.c_str(), hit.text.size()); QString t
= Utils::chopIfEndsWith(QString::fromUcs4(hit.text.c_str(), hit.text.size()).trimmed(),
':');
if (t.startsWith("~/")) { if (t.startsWith("~/")) {
t = QDir::homePath() + t.mid(1); t = QDir::homePath() + t.mid(1);
} }
// Todo: Windows path support Utils::Link link = Utils::Link::fromString(t, true);
const FilePath p = FilePath::fromString(t.trimmed());
if (!p.isEmpty() && (p.scheme().toString().startsWith("http") || p.exists())) { if (link.hasValidTarget()
const LinkSelection newSelection = LinkSelection{{hit.start, hit.end}, p}; && (link.targetFilePath.scheme().toString().startsWith("http")
if (*m_linkSelection != newSelection) { || link.targetFilePath.exists())) {
const LinkSelection newSelection = LinkSelection{{hit.start, hit.end}, link};
if (!m_linkSelection || *m_linkSelection != newSelection) {
m_linkSelection = newSelection; m_linkSelection = newSelection;
updateViewport(); updateViewport();
} }

View File

@@ -5,6 +5,7 @@
#include "terminalsurface.h" #include "terminalsurface.h"
#include <utils/link.h>
#include <utils/qtcprocess.h> #include <utils/qtcprocess.h>
#include <utils/terminalhooks.h> #include <utils/terminalhooks.h>
@@ -59,11 +60,11 @@ public:
struct LinkSelection : public Selection struct LinkSelection : public Selection
{ {
Utils::FilePath filePath; Utils::Link link;
bool operator!=(const LinkSelection &other) const bool operator!=(const LinkSelection &other) const
{ {
return filePath != other.filePath || Selection::operator!=(other); return link != other.link || Selection::operator!=(other);
} }
}; };

View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
echo "Home:"
echo "~/"
FULLPATH=$(readlink -f "$0")
echo "This file:"
echo "$FULLPATH"
echo "This file, this line:"
echo "$FULLPATH:11"
echo "This file, this line, this word:"
echo "$FULLPATH:14:34"
echo "This file, with an error message:"
echo "$FULLPATH:18:23: error: C++ requires a type specifier for all declarations"
echo "A link: http://google.com"
echo "Another link: https://www.qt.io"
echo "Another one: https://codereview.qt-project.org/c/qt-creator/qt-creator/+/464740"