From cf2c8a03a5d296b95fb132f724065750934e780e Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Tue, 15 Sep 2020 19:05:56 +0100 Subject: [PATCH] Move Url hints code to The HotSpot rework --- src/filterHotSpots/FilterChain.cpp | 68 +++++++++++++++++++++++++----- src/filterHotSpots/FilterChain.h | 11 +++++ src/widgets/TerminalDisplay.cpp | 40 +++--------------- src/widgets/TerminalDisplay.h | 5 +-- 4 files changed, 74 insertions(+), 50 deletions(-) diff --git a/src/filterHotSpots/FilterChain.cpp b/src/filterHotSpots/FilterChain.cpp index ac4b9692..b8f49636 100644 --- a/src/filterHotSpots/FilterChain.cpp +++ b/src/filterHotSpots/FilterChain.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -151,18 +152,53 @@ QList> FilterChain::filterBy(HotSpot::Type type) const void FilterChain::leaveEvent(TerminalDisplay *td, QEvent *ev) { + Q_UNUSED(td); + Q_UNUSED(ev); + _showUrlHint = false; } void FilterChain::keyReleaseEvent(TerminalDisplay *td, QKeyEvent *ev, int charLine, int charColumn) { + if (_showUrlHint) { + _showUrlHint = false; + td->update(); + } + auto spot = hotSpotAt(charLine, charColumn); if (spot) { spot->keyReleaseEvent(td, ev); } } +static int ascii_to_int(int c) { + return c - '0'; +} + void FilterChain::keyPressEvent(TerminalDisplay *td, QKeyEvent *ev, int charLine, int charColumn) { + if ((_urlHintsModifiers != 0u) && ev->modifiers() == _urlHintsModifiers) { + QList> hotspots = filterBy(HotSpot::Link); + int nHotSpots = hotspots.count(); + int hintSelected = ascii_to_int(ev->key()); + + // Triggered a Hotspot via shortcut. + if (hintSelected >= 0 && hintSelected < 10 && hintSelected < nHotSpots) { + if (_reverseUrlHints) { + hintSelected = nHotSpots - hintSelected - 1; + } + hotspots.at(hintSelected)->activate(); + _showUrlHint = false; + td->update(); + return; + } + + if (!_showUrlHint) { + td->processFilters(); + _showUrlHint = true; + td->update(); + } + } + auto spot = hotSpotAt(charLine, charColumn); if (spot) { spot->keyPressEvent(td, ev); @@ -216,7 +252,7 @@ void FilterChain::paint(TerminalDisplay* td, QPainter& painter) int urlNumInc; // TODO: Remove _reverseUrllHints from TerminalDisplay. - if (false) { // TODO: Access reverseUrlHints from the profile, here. + if (_reverseUrlHints) { // TODO: Access reverseUrlHints from the profile, here. urlNumber = count(HotSpot::Link); urlNumInc = -1; } else { @@ -233,15 +269,16 @@ void FilterChain::paint(TerminalDisplay* td, QPainter& painter) // TODO: Move this paint code to HotSpot->drawHint(); // TODO: Fix the Url Hints access from the Profile. - if (/* _showUrlHint */ false && urlNumber >= 0 && urlNumber < 10 && spot->type() == HotSpot::Link) { - // Position at the beginning of the URL - QRect hintRect(*region.begin()); - hintRect.setWidth(r.height()); - painter.fillRect(hintRect, QColor(0, 0, 0, 128)); - painter.setPen(Qt::white); - painter.drawRect(hintRect.adjusted(0, 0, -1, -1)); - painter.drawText(hintRect, Qt::AlignCenter, QString::number(urlNumber)); - + if (_showUrlHint && spot->type() == HotSpot::Link) { + if (urlNumber >= 0 && urlNumber < 10) { + // Position at the beginning of the URL + QRect hintRect(*region.begin()); + hintRect.setWidth(r.height()); + painter.fillRect(hintRect, QColor(0, 0, 0, 128)); + painter.setPen(Qt::white); + painter.drawRect(hintRect.adjusted(0, 0, -1, -1)); + painter.drawText(hintRect, Qt::AlignCenter, QString::number(urlNumber)); + } urlNumber += urlNumInc; } } @@ -298,7 +335,7 @@ void FilterChain::paint(TerminalDisplay* td, QPainter& painter) // TODO: Fix accessing the urlHint here. // TODO: Move this code to UrlFilterHotSpot. const bool hasMouse = region.contains(td->mapFromGlobal(QCursor::pos())); - if ((spot->type() == HotSpot::Link && /*_showUrlHint*/ false) || hasMouse) { + if ((spot->type() == HotSpot::Link && _showUrlHint) || hasMouse) { QFontMetrics metrics(td->font()); // find the baseline (which is the invisible line that the characters in the font sit on, @@ -320,3 +357,12 @@ void FilterChain::paint(TerminalDisplay* td, QPainter& painter) } } +void FilterChain::setReverseUrlHints(bool value) +{ + _reverseUrlHints = value; +} + +void FilterChain::setUrlHintsModifiers(Qt::KeyboardModifiers value) +{ + _urlHintsModifiers = value; +} diff --git a/src/filterHotSpots/FilterChain.h b/src/filterHotSpots/FilterChain.h index 7d9921c6..2912390e 100644 --- a/src/filterHotSpots/FilterChain.h +++ b/src/filterHotSpots/FilterChain.h @@ -96,10 +96,21 @@ public: void leaveEvent(TerminalDisplay *td, QEvent *ev); void paint(TerminalDisplay *td, QPainter &painter); + + void setReverseUrlHints(bool value); + void setUrlHintsModifiers(Qt::KeyboardModifiers value); protected: QList _filters; TerminalDisplay *_terminalDisplay; QSharedPointer _hotSpotUnderMouse; + + /* TODO: this should be profile related, not here. but + * currently this removes a bit of code from TerminalDisplay, + * so it's a good compromise + * */ + bool _showUrlHint; + bool _reverseUrlHints; + Qt::KeyboardModifiers _urlHintsModifiers; }; } diff --git a/src/widgets/TerminalDisplay.cpp b/src/widgets/TerminalDisplay.cpp index 3cf7532d..61dc4b78 100644 --- a/src/widgets/TerminalDisplay.cpp +++ b/src/widgets/TerminalDisplay.cpp @@ -488,9 +488,6 @@ TerminalDisplay::TerminalDisplay(QWidget* parent) , _textBlinking(false) , _cursorBlinking(false) , _hasTextBlinker(false) - , _urlHintsModifiers(Qt::NoModifier) - , _showUrlHint(false) - , _reverseUrlHints(false) , _openLinksByDirectClick(false) , _ctrlRequiredForDrag(true) , _dropUrlsAsText(false) @@ -1790,8 +1787,6 @@ void TerminalDisplay::focusOutEvent(QFocusEvent*) // suppress further text blinking _blinkTextTimer->stop(); Q_ASSERT(!_textBlinking); - - _showUrlHint = false; } void TerminalDisplay::focusInEvent(QFocusEvent*) @@ -3050,7 +3045,7 @@ void TerminalDisplay::setUsesMouseTracking(bool on) resetCursor(); } -void TerminalDisplay::resetCursor() +void TerminalDisplay::resetCursor() { setCursor(_usesMouseTracking ? Qt::ArrowCursor : Qt::IBeamCursor); } @@ -3490,28 +3485,6 @@ void TerminalDisplay::scrollScreenWindow(enum ScreenWindow::RelativeScrollMode m void TerminalDisplay::keyPressEvent(QKeyEvent* event) { - // TODO: Move this code to HotSpot too. - if ((_urlHintsModifiers != 0u) && event->modifiers() == _urlHintsModifiers) { - QList> hotspots = _filterChain->filterBy(HotSpot::Link); - int nHotSpots = hotspots.count(); - int hintSelected = event->key() - 0x31; - if (hintSelected >= 0 && hintSelected < 10 && hintSelected < nHotSpots) { - if (_reverseUrlHints) { - hintSelected = nHotSpots - hintSelected - 1; - } - hotspots.at(hintSelected)->activate(); - _showUrlHint = false; - update(); - return; - } - - if (!_showUrlHint) { - processFilters(); - _showUrlHint = true; - update(); - } - } - { // C++17: change getCharacterPosition to return a tuple and use auto [charLine, charColumn] to extract the values. int charLine; int charColumn; @@ -3553,11 +3526,6 @@ void TerminalDisplay::keyPressEvent(QKeyEvent* event) void TerminalDisplay::keyReleaseEvent(QKeyEvent *event) { - if (_showUrlHint) { - _showUrlHint = false; - update(); - } - if (_readOnly) { event->accept(); return; @@ -3905,8 +3873,6 @@ void TerminalDisplay::applyProfile(const Profile::Ptr &profile) _trimLeadingSpaces = profile->property(Profile::TrimLeadingSpacesInSelectedText); _trimTrailingSpaces = profile->property(Profile::TrimTrailingSpacesInSelectedText); _openLinksByDirectClick = profile->property(Profile::OpenLinksByDirectClickEnabled); - _urlHintsModifiers = Qt::KeyboardModifiers(profile->property(Profile::UrlHintsModifiers)); - _reverseUrlHints = profile->property(Profile::ReverseUrlHints); setMiddleClickPasteMode(Enum::MiddleClickPasteModeEnum(profile->property(Profile::MiddleClickPasteMode))); setCopyTextAsHTML(profile->property(Profile::CopyTextAsHTML)); @@ -3940,6 +3906,10 @@ void TerminalDisplay::applyProfile(const Profile::Ptr &profile) _displayVerticalLineAtChar = profile->verticalLineAtChar(); setAlternateScrolling(profile->property(Profile::AlternateScrolling)); _dimValue = profile->dimValue(); + + _filterChain->setUrlHintsModifiers(Qt::KeyboardModifiers(profile->property(Profile::UrlHintsModifiers))); + _filterChain->setReverseUrlHints(profile->property(Profile::ReverseUrlHints)); + } void TerminalDisplay::printScreen() diff --git a/src/widgets/TerminalDisplay.h b/src/widgets/TerminalDisplay.h index 480c05e5..84a6272a 100644 --- a/src/widgets/TerminalDisplay.h +++ b/src/widgets/TerminalDisplay.h @@ -346,7 +346,7 @@ public: * Selects everything in the terminal */ void selectAll(); - + // TODO: Move this code to KonsolePrintManager void printContent(QPainter &painter, bool friendly); @@ -818,9 +818,6 @@ private: QTimer *_blinkTextTimer; QTimer *_blinkCursorTimer; - Qt::KeyboardModifiers _urlHintsModifiers; - bool _showUrlHint; - bool _reverseUrlHints; bool _openLinksByDirectClick; // Open URL and hosts by single mouse click bool _ctrlRequiredForDrag; // require Ctrl key for drag selected text