1 /*
2 SPDX-FileCopyrightText: 2017, 2020 Friedrich W. H. Kossebau <kossebau@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
7 #include "searchtoolbar.hpp"
8
9 // part
10 #include "ui_searchtoolbar.h"
11 // Qt
12 #include <QTextBrowser>
13
14
SearchToolBar(QTextBrowser * markdownView,QWidget * parent)15 SearchToolBar::SearchToolBar(QTextBrowser* markdownView, QWidget* parent)
16 : QWidget(parent)
17 , m_ui(new Ui::SearchToolBar)
18 , m_markdownView(markdownView)
19 {
20 m_ui->setupUi(this);
21
22 connect(m_ui->hideButton, &QToolButton::clicked,
23 this, &SearchToolBar::hide);
24 connect(m_ui->searchTextEdit, &QLineEdit::textEdited,
25 this, &SearchToolBar::searchIncrementally);
26 connect(m_ui->matchCaseCheckButton, &QAbstractButton::toggled,
27 this, &SearchToolBar::searchIncrementally);
28 connect(m_ui->searchTextEdit, &QLineEdit::returnPressed,
29 this, &SearchToolBar::searchNext);
30 connect(m_ui->nextButton, &QToolButton::clicked,
31 this, &SearchToolBar::searchNext);
32 connect(m_ui->previousButton, &QToolButton::clicked,
33 this, &SearchToolBar::searchPrevious);
34 // TODO: disable next/previous buttons if no (more) search hits, color coding in text field
35 }
36
37 SearchToolBar::~SearchToolBar() = default;
38
searchNext()39 void SearchToolBar::searchNext()
40 {
41 const QString text = m_ui->searchTextEdit->text();
42 if (text.isEmpty()) {
43 startSearch();
44 return;
45 }
46
47 QTextDocument::FindFlags findFlags = {};
48 if (m_ui->matchCaseCheckButton->isChecked()) {
49 findFlags |= QTextDocument::FindCaseSensitively;
50 }
51
52 m_markdownView->find(text, findFlags);
53
54 }
55
searchPrevious()56 void SearchToolBar::searchPrevious()
57 {
58 const QString text = m_ui->searchTextEdit->text();
59 if (text.isEmpty()) {
60 startSearch();
61 return;
62 }
63
64 QTextDocument::FindFlags findFlags = {QTextDocument::FindBackward};
65 if (m_ui->matchCaseCheckButton->isChecked()) {
66 findFlags |= QTextDocument::FindCaseSensitively;
67 }
68
69 m_markdownView->find(text, findFlags);
70 }
71
startSearch()72 void SearchToolBar::startSearch()
73 {
74 show();
75 m_ui->searchTextEdit->selectAll();
76 m_ui->searchTextEdit->setFocus();
77 }
78
searchIncrementally()79 void SearchToolBar::searchIncrementally()
80 {
81 QTextDocument::FindFlags findFlags = {};
82
83 if (m_ui->matchCaseCheckButton->isChecked()) {
84 findFlags |= QTextDocument::FindCaseSensitively;
85 }
86
87 // calling with changed text with added or removed chars at end will result in current
88 // selection kept, if also matching new text
89 // behaviour on changed case sensitivity though is advancing to next match even if current
90 // would be still matching. as there is no control about currently shown match, nothing
91 // we can do about it. thankfully case sensitivity does not happen too often, so should
92 // not be too grave UX
93 m_markdownView->find(m_ui->searchTextEdit->text(), findFlags);
94 }
95
hideEvent(QHideEvent * event)96 void SearchToolBar::hideEvent(QHideEvent* event)
97 {
98 // finish search
99 // passing emptry string to reset search
100 m_markdownView->find(QString());
101
102 QWidget::hideEvent(event);
103 }
104