From 3f554f38376781abd31faa3176a7909301065496 Mon Sep 17 00:00:00 2001 From: Xavier BESSON Date: Wed, 30 Nov 2022 18:32:04 +0100 Subject: [PATCH] TextEditors: Implement "Follow Symbol" for HTTP urls in string literals Task-number: QTCREATORBUG-14967 Change-Id: I30923aa94d761b06edb1f67007fd7e2a67065ef0 Reviewed-by: Xavier BESSON Reviewed-by: David Schulz --- src/plugins/cppeditor/cppeditorwidget.cpp | 13 +++++++++++-- src/plugins/cppeditor/cppeditorwidget.h | 2 +- src/plugins/qmljseditor/qmljseditor.cpp | 9 +++++++++ src/plugins/texteditor/texteditor.cpp | 7 +++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp index 59de411d936..48c3d0eaa0d 100644 --- a/src/plugins/cppeditor/cppeditorwidget.cpp +++ b/src/plugins/cppeditor/cppeditorwidget.cpp @@ -848,7 +848,7 @@ void CppEditorWidget::followSymbolToType(bool inNextSplit) CppModelManager::followSymbolToType(cursor, callback, inNextSplit); } -bool CppEditorWidget::followQrcUrl(const QTextCursor &cursor, +bool CppEditorWidget::followUrl(const QTextCursor &cursor, const Utils::LinkHandler &processLinkCallback) { if (!isSemanticInfoValidExceptLocalUses()) @@ -869,6 +869,15 @@ bool CppEditorWidget::followQrcUrl(const QTextCursor &cursor, if (!literal) return false; const QString theString = QString::fromUtf8(literal->chars(), literal->size()); + + if (theString.startsWith("https:/") || theString.startsWith("http:/")) { + Utils::Link link = FilePath::fromPathPart(theString); + link.linkTextStart = d->m_lastSemanticInfo.doc->translationUnit()->getTokenPositionInDocument(literalAst->literal_token, document()); + link.linkTextEnd = d->m_lastSemanticInfo.doc->translationUnit()->getTokenEndPositionInDocument(literalAst->literal_token, document()); + processLinkCallback(link); + return true; + } + if (!theString.startsWith("qrc:/") && !theString.startsWith(":/")) return false; @@ -897,7 +906,7 @@ void CppEditorWidget::findLinkAt(const QTextCursor &cursor, if (!d->m_modelManager) return processLinkCallback(Utils::Link()); - if (followQrcUrl(cursor, processLinkCallback)) + if (followUrl(cursor, processLinkCallback)) return; const Utils::FilePath &filePath = textDocument()->filePath(); diff --git a/src/plugins/cppeditor/cppeditorwidget.h b/src/plugins/cppeditor/cppeditorwidget.h index 89b3e0f3fc6..3f62d41f406 100644 --- a/src/plugins/cppeditor/cppeditorwidget.h +++ b/src/plugins/cppeditor/cppeditorwidget.h @@ -123,7 +123,7 @@ private: unsigned documentRevision() const; bool isOldStyleSignalOrSlot() const; - bool followQrcUrl(const QTextCursor &cursor, const Utils::LinkHandler &processLinkCallback); + bool followUrl(const QTextCursor &cursor, const Utils::LinkHandler &processLinkCallback); QMenu *createRefactorMenu(QWidget *parent) const; diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 0465648ba0e..58a75137cbb 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -789,6 +789,15 @@ void QmlJSEditorWidget::findLinkAt(const QTextCursor &cursor, } } } + + if (text.startsWith("https:/") || text.startsWith("http:/")) { + Link link = Link::fromFilePath(FilePath::fromPathPart(text)); + link.linkTextStart = literal->literalToken.begin(); + link.linkTextEnd = literal->literalToken.end(); + processLinkCallback(link); + return; + } + Utils::Link link; link.linkTextStart = literal->literalToken.begin(); link.linkTextEnd = literal->literalToken.end(); diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index fb4b06ef530..53b0f1fe053 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -72,6 +72,7 @@ #include #include #include +#include #include #include #include @@ -6341,6 +6342,12 @@ bool TextEditorWidget::openLink(const Utils::Link &link, bool inNextSplit) if (!link.hasValidTarget()) return false; + QString url = link.targetFilePath.toString(); + if (url.startsWith(u"https://"_qs) || url.startsWith(u"http://"_qs)) { + QDesktopServices::openUrl(url); + return true; + } + if (!inNextSplit && textDocument()->filePath() == link.targetFilePath) { EditorManager::addCurrentPositionToNavigationHistory(); gotoLine(link.targetLine, link.targetColumn, true, true);