From 887f6afd258233c476bea1a34834a67e12a864c0 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 9 Mar 2023 22:33:47 +0100 Subject: [PATCH] Terminal: Auto-scroll when selecting outside Change-Id: I5dea3256524634d9c3e6c0f8132c6bdba4494978 Reviewed-by: Reviewed-by: Cristian Adam --- src/plugins/terminal/terminalwidget.cpp | 60 +++++++++++++++---------- src/plugins/terminal/terminalwidget.h | 5 ++- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index aba69664fb1..0321c0ce5ca 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -94,6 +94,15 @@ TerminalWidget::TerminalWidget(QWidget *parent, const OpenTerminalParameters &op connect(&m_flushDelayTimer, &QTimer::timeout, this, [this]() { flushVTerm(true); }); + m_scrollTimer.setSingleShot(false); + m_scrollTimer.setInterval(1s / 2); + connect(&m_scrollTimer, &QTimer::timeout, this, [this] { + if (m_scrollDirection < 0) + verticalScrollBar()->triggerAction(QAbstractSlider::SliderSingleStepSub); + else if (m_scrollDirection > 0) + verticalScrollBar()->triggerAction(QAbstractSlider::SliderSingleStepAdd); + }); + connect(&TerminalSettings::instance(), &AspectContainer::applied, this, [this] { // Setup colors first, as setupFont will redraw the screen. setupColors(); @@ -992,7 +1001,9 @@ void TerminalWidget::inputMethodEvent(QInputMethodEvent *event) void TerminalWidget::mousePressEvent(QMouseEvent *event) { - m_activeMouseSelect.start = event->pos(); + m_scrollDirection = 0; + + m_activeMouseSelect.start = viewportToGlobal(event->pos()); if (event->button() == Qt::LeftButton && event->modifiers() == Qt::ControlModifier) { if (m_linkSelection) { @@ -1034,8 +1045,29 @@ void TerminalWidget::mouseMoveEvent(QMouseEvent *event) { if (m_selection && event->buttons() & Qt::LeftButton) { const auto old = m_selection; + int scrollVelocity = 0; + if (event->pos().y() < 0) { + scrollVelocity = (event->pos().y()); + } else if (event->pos().y() > viewport()->height()) { + scrollVelocity = (event->pos().y() - viewport()->height()); + } - int start = m_surface->gridToPos(globalToGrid(viewportToGlobal(m_activeMouseSelect.start))); + if ((scrollVelocity != 0) != m_scrollTimer.isActive()) { + if (scrollVelocity != 0) + m_scrollTimer.start(); + else + m_scrollTimer.stop(); + } + + m_scrollDirection = scrollVelocity; + + if (m_scrollTimer.isActive() && scrollVelocity != 0) { + const std::chrono::milliseconds scrollInterval = 1000ms / qAbs(scrollVelocity); + if (m_scrollTimer.intervalAsDuration() != scrollInterval) + m_scrollTimer.setInterval(scrollInterval); + } + + int start = m_surface->gridToPos(globalToGrid(m_activeMouseSelect.start)); int newEnd = m_surface->gridToPos(globalToGrid(viewportToGlobal(event->pos()))); if (start > newEnd) { @@ -1103,6 +1135,8 @@ void TerminalWidget::checkLinkAt(const QPoint &pos) void TerminalWidget::mouseReleaseEvent(QMouseEvent *event) { + m_scrollTimer.stop(); + if (m_selection && event->button() == Qt::LeftButton) { if (m_selection->end - m_selection->start == 0) { setSelection(std::nullopt); @@ -1149,28 +1183,6 @@ void TerminalWidget::mouseDoubleClickEvent(QMouseEvent *event) event->accept(); } -void TerminalWidget::scrollContentsBy(int dx, int dy) -{ - Q_UNUSED(dx); - Q_UNUSED(dy); - - if (m_ignoreScroll) - return; - /* - if (m_altscreen) - return; - - size_t orig = m_scrollback->offset(); - size_t offset = m_scrollback->scroll(dy); - if (orig == offset) - return; - - m_cursor.visible = (offset == 0); - */ - - updateViewport(); -} - void TerminalWidget::showEvent(QShowEvent *event) { Q_UNUSED(event); diff --git a/src/plugins/terminal/terminalwidget.h b/src/plugins/terminal/terminalwidget.h index 3e4da77fc18..53d82b3899d 100644 --- a/src/plugins/terminal/terminalwidget.h +++ b/src/plugins/terminal/terminalwidget.h @@ -89,8 +89,6 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; - void scrollContentsBy(int dx, int dy) override; - void showEvent(QShowEvent *event) override; bool event(QEvent *event) override; @@ -189,6 +187,9 @@ private: QTimer m_flushDelayTimer; + QTimer m_scrollTimer; + int m_scrollDirection{0}; + std::array m_currentColors; Utils::Terminal::OpenTerminalParameters m_openParameters;