diff options
author | Miklos Marton <martonmiklosqdev@gmail.com> | 2020-02-03 17:17:10 +0100 |
---|---|---|
committer | Miklós Márton <martonmiklosqdev@gmail.com> | 2020-02-05 22:02:39 +0000 |
commit | 8f88b89d81d355229acf183300ab5a959f01772e (patch) | |
tree | 1e411d2d993e253985af8989b5285de505954be4 /src/plugins/vcsbase | |
parent | adcea968689a31f244da8a31c702a3cb1171e14f (diff) |
Make http(s) urls clickable in the VCS output pane
Fixes: QTCREATORBUG-23536
Fixes: QTCREATORBUG-19171
Change-Id: Ibf6d632031068c7f52cb15f534960e8238bdb21d
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/vcsbase')
-rw-r--r-- | src/plugins/vcsbase/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbase.pro | 2 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbase.qbs | 2 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsoutputformatter.cpp | 67 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsoutputformatter.h | 44 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsoutputwindow.cpp | 7 |
6 files changed, 120 insertions, 3 deletions
diff --git a/src/plugins/vcsbase/CMakeLists.txt b/src/plugins/vcsbase/CMakeLists.txt index 465cd5ee32..82aa07eba9 100644 --- a/src/plugins/vcsbase/CMakeLists.txt +++ b/src/plugins/vcsbase/CMakeLists.txt @@ -25,6 +25,7 @@ add_qtc_plugin(VcsBase vcsbaseplugin.cpp vcsbaseplugin.h vcsbasesubmiteditor.cpp vcsbasesubmiteditor.h vcscommand.cpp vcscommand.h + vcsoutputformatter.cpp vcsoutputformatter.h vcsoutputwindow.cpp vcsoutputwindow.h vcsplugin.cpp vcsplugin.h wizard/vcscommandpage.cpp wizard/vcscommandpage.h diff --git a/src/plugins/vcsbase/vcsbase.pro b/src/plugins/vcsbase/vcsbase.pro index 2a1dd0a6bc..db33e93240 100644 --- a/src/plugins/vcsbase/vcsbase.pro +++ b/src/plugins/vcsbase/vcsbase.pro @@ -2,6 +2,7 @@ DEFINES += VCSBASE_LIBRARY include(../../qtcreatorplugin.pri) HEADERS += vcsbase_global.h \ vcsbaseconstants.h \ + vcsoutputformatter.h \ wizard/vcsconfigurationpage.h \ wizard/vcscommandpage.h \ wizard/vcsjsextension.h \ @@ -30,6 +31,7 @@ HEADERS += vcsbase_global.h \ SOURCES += vcsplugin.cpp \ vcsbaseplugin.cpp \ + vcsoutputformatter.cpp \ wizard/vcsconfigurationpage.cpp \ wizard/vcscommandpage.cpp \ wizard/vcsjsextension.cpp \ diff --git a/src/plugins/vcsbase/vcsbase.qbs b/src/plugins/vcsbase/vcsbase.qbs index 2ab9860447..23710f40e6 100644 --- a/src/plugins/vcsbase/vcsbase.qbs +++ b/src/plugins/vcsbase/vcsbase.qbs @@ -66,6 +66,8 @@ QtcPlugin { "vcsbasesubmiteditor.h", "vcscommand.cpp", "vcscommand.h", + "vcsoutputformatter.cpp", + "vcsoutputformatter.h", "vcsoutputwindow.cpp", "vcsoutputwindow.h", "vcsplugin.cpp", diff --git a/src/plugins/vcsbase/vcsoutputformatter.cpp b/src/plugins/vcsbase/vcsoutputformatter.cpp new file mode 100644 index 0000000000..82b06bf7fe --- /dev/null +++ b/src/plugins/vcsbase/vcsoutputformatter.cpp @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Miklos Marton <martonmiklosqdev@gmail.com> +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ +#include "vcsoutputformatter.h" + +#include <QDesktopServices> +#include <QPlainTextEdit> +#include <QRegularExpression> +#include <QTextCursor> +#include <QUrl> + +namespace VcsBase { + +VcsOutputFormatter::VcsOutputFormatter() +{ + m_urlRegexp = new QRegularExpression("https?://\\S*"); +} + +void VcsOutputFormatter::appendMessage(const QString &text, Utils::OutputFormat format) +{ + QString out = text; + const QRegularExpressionMatch match = m_urlRegexp->match(text); + if (match.hasMatch()) { + const QTextCharFormat normalFormat = charFormat(format); + OutputFormatter::appendMessage(text.left(match.capturedStart()), format); + QTextCursor tc = plainTextEdit()->textCursor(); + QStringRef url = match.capturedRef(); + int end = match.capturedEnd(); + while (url.rbegin()->isPunct()) { + url.chop(1); + --end; + } + tc.movePosition(QTextCursor::End, QTextCursor::MoveAnchor); + tc.insertText(url.toString(), linkFormat(normalFormat, url.toString())); + tc.movePosition(QTextCursor::End, QTextCursor::MoveAnchor); + OutputFormatter::appendMessage(text.mid(end), format); + } else { + OutputFormatter::appendMessage(text, format); + } +} + +void VcsOutputFormatter::handleLink(const QString &href) +{ + QDesktopServices::openUrl(QUrl(href)); +} + +} diff --git a/src/plugins/vcsbase/vcsoutputformatter.h b/src/plugins/vcsbase/vcsoutputformatter.h new file mode 100644 index 0000000000..57757919ea --- /dev/null +++ b/src/plugins/vcsbase/vcsoutputformatter.h @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Miklos Marton <martonmiklosqdev@gmail.com> +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ +#pragma once + +#include <utils/outputformatter.h> + +QT_FORWARD_DECLARE_CLASS(QRegularExpression); + +namespace VcsBase { + +class VcsOutputFormatter : public Utils::OutputFormatter +{ +public: + VcsOutputFormatter(); + ~VcsOutputFormatter() override = default; + void appendMessage(const QString &text, Utils::OutputFormat format) override; + void handleLink(const QString &href) override; + +private: + QRegularExpression *m_urlRegexp = nullptr; +}; + +} diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp index da3cb8fa29..6891dac3ed 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.cpp +++ b/src/plugins/vcsbase/vcsoutputwindow.cpp @@ -37,6 +37,7 @@ #include <texteditor/fontsettings.h> #include <texteditor/texteditorsettings.h> #include <utils/theme/theme.h> +#include <vcsbase/vcsoutputformatter.h> #include <QAction> #include <QContextMenuEvent> @@ -110,7 +111,7 @@ private: QString identifierUnderCursor(const QPoint &pos, QString *repository = nullptr) const; Utils::OutputFormat m_format; - OutputFormatter *m_formatter = nullptr; + VcsOutputFormatter *m_formatter = nullptr; }; OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) : @@ -119,9 +120,9 @@ OutputWindowPlainTextEdit::OutputWindowPlainTextEdit(QWidget *parent) : setReadOnly(true); setUndoRedoEnabled(false); setFrameStyle(QFrame::NoFrame); - m_formatter = new OutputFormatter; + m_formatter = new VcsOutputFormatter; m_formatter->setBoldFontEnabled(false); - m_formatter->setPlainTextEdit(this); + setFormatter(m_formatter); auto agg = new Aggregation::Aggregate; agg->add(this); agg->add(new Core::BaseTextFind(this)); |