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)15 MarkdownView::MarkdownView(QTextDocument* document, QWidget* parent)
16     : QTextBrowser(parent)
17 {
18     setOpenLinks(false);
19 
20     setDocument(document);
21 }
22 
hasSelection() const23 bool MarkdownView::hasSelection() const
24 {
25     return textCursor().hasSelection();
26 }
27 
setScrollPosition(QPoint offset)28 void MarkdownView::setScrollPosition(QPoint offset)
29 {
30     horizontalScrollBar()->setValue(offset.x());
31     verticalScrollBar()->setValue(offset.y());
32 }
33 
scrollPosition() const34 QPoint MarkdownView::scrollPosition() const
35 {
36     return {
37         horizontalScrollBar()->value(),
38         verticalScrollBar()->value()
39     };
40 }
41 
scrollPositionX() const42 int MarkdownView::scrollPositionX() const
43 {
44     return horizontalScrollBar()->value();
45 }
46 
scrollPositionY() const47 int MarkdownView::scrollPositionY() const
48 {
49     return verticalScrollBar()->value();
50 }
51 
contextMenuEvent(QContextMenuEvent * event)52 void 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