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