summaryrefslogtreecommitdiff
path: root/src/plugins/terminal/terminalwidget.cpp
diff options
context:
space:
mode:
authorMarcus Tillmanns <marcus.tillmanns@qt.io>2023-04-06 10:34:33 +0200
committerMarcus Tillmanns <marcus.tillmanns@qt.io>2023-04-06 09:25:36 +0000
commit388e516200338aa39d581c9b503c1be2f65864d8 (patch)
tree90476f0711baa9b8cbb585f3988506e5f5877b74 /src/plugins/terminal/terminalwidget.cpp
parentdb2c5f87b1c03a88e78e23d6f120c3f37011dcdc (diff)
downloadqt-creator-388e516200338aa39d581c9b503c1be2f65864d8.tar.gz
Terminal: Improve link copy
* Show link if control key is pressed (without mouse move) * Copy link on Control+Shift+Click * Add Copy Link Action to Right click menu Change-Id: Ide4ff4e77c03e015117c67f09c9d60dedd14dfcb Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Diffstat (limited to 'src/plugins/terminal/terminalwidget.cpp')
-rw-r--r--src/plugins/terminal/terminalwidget.cpp80
1 files changed, 56 insertions, 24 deletions
diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp
index 6ece9394c0..08fe2f691d 100644
--- a/src/plugins/terminal/terminalwidget.cpp
+++ b/src/plugins/terminal/terminalwidget.cpp
@@ -262,6 +262,7 @@ void TerminalWidget::setupActions()
// clang-format off
connect(&a.copy, &QAction::triggered, this, ifHasFocus(&TerminalWidget::copyToClipboard));
connect(&a.paste, &QAction::triggered, this, ifHasFocus(&TerminalWidget::pasteFromClipboard));
+ connect(&a.copyLink, &QAction::triggered, this, ifHasFocus(&TerminalWidget::copyLinkToClipboard));
connect(&a.clearSelection, &QAction::triggered, this, ifHasFocus(&TerminalWidget::clearSelection));
connect(&a.clearTerminal, &QAction::triggered, this, ifHasFocus(&TerminalWidget::clearContents));
connect(&a.moveCursorWordLeft, &QAction::triggered, this, ifHasFocus(&TerminalWidget::moveCursorWordLeft));
@@ -390,6 +391,7 @@ void TerminalWidget::updateCopyState()
return;
TerminalCommands::widgetActions().copy.setEnabled(m_selection.has_value());
+ TerminalCommands::widgetActions().copyLink.setEnabled(m_linkSelection.has_value());
}
void TerminalWidget::setFont(const QFont &font)
@@ -436,6 +438,12 @@ void TerminalWidget::pasteFromClipboard()
m_surface->pasteFromClipboard(clipboardText);
}
+void TerminalWidget::copyLinkToClipboard()
+{
+ if (m_linkSelection)
+ setClipboardAndSelection(m_linkSelection->link.targetFilePath.toUserOutput());
+}
+
void TerminalWidget::clearSelection()
{
setSelection(std::nullopt);
@@ -1086,11 +1094,27 @@ void TerminalWidget::keyPressEvent(QKeyEvent *event)
return;
}
+ if (event->key() == Qt::Key_Control) {
+ if (!m_linkSelection.has_value() && checkLinkAt(mapFromGlobal(QCursor::pos()))) {
+ setCursor(Qt::PointingHandCursor);
+ }
+ }
+
event->accept();
m_surface->sendKey(event);
}
+void TerminalWidget::keyReleaseEvent(QKeyEvent *event)
+{
+ if (event->key() == Qt::Key_Control && m_linkSelection.has_value()) {
+ m_linkSelection.reset();
+ updateCopyState();
+ setCursor(Qt::IBeamCursor);
+ updateViewport();
+ }
+}
+
void TerminalWidget::applySizeChange()
{
QSize newLiveSize = {
@@ -1198,8 +1222,13 @@ void TerminalWidget::mousePressEvent(QMouseEvent *event)
m_activeMouseSelect.start = viewportToGlobal(event->pos());
- if (event->button() == Qt::LeftButton && event->modifiers() == Qt::ControlModifier) {
+ if (event->button() == Qt::LeftButton && event->modifiers() & Qt::ControlModifier) {
if (m_linkSelection) {
+ if (event->modifiers() & Qt::ShiftModifier) {
+ copyLinkToClipboard();
+ return;
+ }
+
if (m_linkSelection->link.targetFilePath.scheme().toString().startsWith("http")) {
QDesktopServices::openUrl(m_linkSelection->link.targetFilePath.toUrl());
return;
@@ -1231,10 +1260,11 @@ void TerminalWidget::mousePressEvent(QMouseEvent *event)
event->accept();
updateViewport();
} else if (event->button() == Qt::RightButton) {
- if (event->modifiers() == Qt::ShiftModifier) {
+ if (event->modifiers() & Qt::ShiftModifier) {
QMenu *contextMenu = new QMenu(this);
contextMenu->addAction(&TerminalCommands::widgetActions().copy);
contextMenu->addAction(&TerminalCommands::widgetActions().paste);
+ contextMenu->addAction(&TerminalCommands::widgetActions().copyLink);
contextMenu->addSeparator();
contextMenu->addAction(&TerminalCommands::widgetActions().clearTerminal);
contextMenu->addSeparator();
@@ -1303,10 +1333,11 @@ void TerminalWidget::mouseMoveEvent(QMouseEvent *event)
}
setSelection(newSelection);
- } else if (event->modifiers() == Qt::ControlModifier) {
+ } else if (event->modifiers() & Qt::ControlModifier) {
checkLinkAt(event->pos());
} else if (m_linkSelection) {
m_linkSelection.reset();
+ updateCopyState();
updateViewport();
}
@@ -1317,7 +1348,7 @@ void TerminalWidget::mouseMoveEvent(QMouseEvent *event)
}
}
-void TerminalWidget::checkLinkAt(const QPoint &pos)
+bool TerminalWidget::checkLinkAt(const QPoint &pos)
{
const TextAndOffsets hit = textAt(pos);
@@ -1325,34 +1356,35 @@ void TerminalWidget::checkLinkAt(const QPoint &pos)
QString t = QString::fromUcs4(hit.text.c_str(), hit.text.size()).trimmed();
t = chopIfEndsWith(t, ':');
- if (t.isEmpty())
- return;
-
- if (t.startsWith("~/")) {
- t = QDir::homePath() + t.mid(1);
- }
-
- Link link = Link::fromString(t, true);
-
- if (!link.targetFilePath.isAbsolutePath())
- link.targetFilePath = m_cwd.pathAppended(link.targetFilePath.path());
-
- if (link.hasValidTarget()
- && (link.targetFilePath.scheme().toString().startsWith("http")
- || link.targetFilePath.exists())) {
- const LinkSelection newSelection = LinkSelection{{hit.start, hit.end}, link};
- if (!m_linkSelection || *m_linkSelection != newSelection) {
- m_linkSelection = newSelection;
- updateViewport();
+ if (!t.isEmpty()) {
+ if (t.startsWith("~/"))
+ t = QDir::homePath() + t.mid(1);
+
+ Link link = Link::fromString(t, true);
+
+ if (!link.targetFilePath.isAbsolutePath())
+ link.targetFilePath = m_cwd.pathAppended(link.targetFilePath.path());
+
+ if (link.hasValidTarget()
+ && (link.targetFilePath.scheme().toString().startsWith("http")
+ || link.targetFilePath.exists())) {
+ const LinkSelection newSelection = LinkSelection{{hit.start, hit.end}, link};
+ if (!m_linkSelection || *m_linkSelection != newSelection) {
+ m_linkSelection = newSelection;
+ updateViewport();
+ updateCopyState();
+ }
+ return true;
}
- return;
}
}
if (m_linkSelection) {
m_linkSelection.reset();
+ updateCopyState();
updateViewport();
}
+ return false;
}
void TerminalWidget::mouseReleaseEvent(QMouseEvent *event)