1 /* 2 SPDX-FileCopyrightText: 2020 Friedrich W. H. Kossebau <kossebau@kde.org> 3 4 SPDX-License-Identifier: LGPL-2.1-or-later 5 */ 6 7 #include "markdownview.hpp" 8 9 // Qt 10 #include <QScrollBar> 11 #include <QTextCursor> 12 #include <QContextMenuEvent> 13 14 MarkdownView(QTextDocument * document,QWidget * parent)15MarkdownView::MarkdownView(QTextDocument* document, QWidget* parent) 16 : QTextBrowser(parent) 17 { 18 setOpenLinks(false); 19 20 setDocument(document); 21 } 22 hasSelection() const23bool MarkdownView::hasSelection() const 24 { 25 return textCursor().hasSelection(); 26 } 27 setScrollPosition(QPoint offset)28void MarkdownView::setScrollPosition(QPoint offset) 29 { 30 horizontalScrollBar()->setValue(offset.x()); 31 verticalScrollBar()->setValue(offset.y()); 32 } 33 scrollPosition() const34QPoint MarkdownView::scrollPosition() const 35 { 36 return { 37 horizontalScrollBar()->value(), 38 verticalScrollBar()->value() 39 }; 40 } 41 scrollPositionX() const42int MarkdownView::scrollPositionX() const 43 { 44 return horizontalScrollBar()->value(); 45 } 46 scrollPositionY() const47int MarkdownView::scrollPositionY() const 48 { 49 return verticalScrollBar()->value(); 50 } 51 contextMenuEvent(QContextMenuEvent * event)52void MarkdownView::contextMenuEvent(QContextMenuEvent* event) 53 { 54 // Compare KWebKitPart's WebView::contextMenuEvent & WebEnginePart's WebEngineView::contextMenuEvent 55 // for the patterns used to fill the menu. 56 // QTextBrowser at of Qt 5.15 provides less data though, so for now this is reduced variant. 57 58 // trying to get linkText skipped, because not reliable to get: 59 // anchorAt uses ExactHit test, but cursorAt FuzzyHit, so this might not match 60 61 const QUrl linkUrl(anchorAt(event->pos())); 62 63 // only report any selection if this is not a context menu for a link 64 const bool hasSelection = !linkUrl.isValid() && this->hasSelection(); 65 66 Q_EMIT contextMenuRequested(event->globalPos(), 67 linkUrl, 68 hasSelection); 69 70 event->accept(); 71 } 72