Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
searchwidget.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3#include "tracer.h"
4
5#include "mainwindow.h"
6#include "searchwidget.h"
7
8#include <QtCore/QMap>
9#include <QtCore/QMimeData>
10#include <QtCore/QString>
11#include <QtCore/QStringList>
12
13#include <QtWidgets/QMenu>
14#include <QtWidgets/QLayout>
15#include <QtGui/QKeyEvent>
16#if QT_CONFIG(clipboard)
17#include <QtGui/QClipboard>
18#endif
19#include <QtWidgets/QApplication>
20#include <QtWidgets/QTextBrowser>
21
22#include <QtHelp/QHelpSearchEngine>
23#include <QtHelp/QHelpSearchQueryWidget>
24#include <QtHelp/QHelpSearchResultWidget>
25
27
28using namespace Qt::StringLiterals;
29
30SearchWidget::SearchWidget(QHelpSearchEngine *engine, QWidget *parent)
31 : QWidget(parent)
32 , zoomCount(0)
33 , searchEngine(engine)
34{
36 QVBoxLayout *vLayout = new QVBoxLayout(this);
37
38 resultWidget = searchEngine->resultWidget();
39 QHelpSearchQueryWidget *queryWidget = searchEngine->queryWidget();
40
41 vLayout->addWidget(queryWidget);
42 vLayout->addWidget(resultWidget);
43
44 setFocusProxy(queryWidget);
45
46 connect(queryWidget, &QHelpSearchQueryWidget::search,
47 this, &SearchWidget::search);
48 connect(resultWidget, &QHelpSearchResultWidget::requestShowLink,
49 this, &SearchWidget::requestShowLink);
50
51 connect(searchEngine, &QHelpSearchEngine::searchingStarted,
52 this, &SearchWidget::searchingStarted);
53 connect(searchEngine, &QHelpSearchEngine::searchingFinished,
54 this, &SearchWidget::searchingFinished);
55
56 QTextBrowser* browser = resultWidget->findChild<QTextBrowser*>();
57 if (browser)
58 browser->viewport()->installEventFilter(this);
59}
60
62{
64 // nothing todo
65}
66
68{
70 QTextBrowser* browser = resultWidget->findChild<QTextBrowser*>();
71 if (browser && zoomCount != 10) {
72 zoomCount++;
73 browser->zoomIn();
74 }
75}
76
78{
80 QTextBrowser* browser = resultWidget->findChild<QTextBrowser*>();
81 if (browser && zoomCount != -5) {
82 zoomCount--;
83 browser->zoomOut();
84 }
85}
86
88{
90 if (zoomCount == 0)
91 return;
92
93 QTextBrowser* browser = resultWidget->findChild<QTextBrowser*>();
94 if (browser) {
95 browser->zoomOut(zoomCount);
96 zoomCount = 0;
97 }
98}
99
100void SearchWidget::search() const
101{
103 searchEngine->search(searchEngine->queryWidget()->searchInput());
104}
105
106void SearchWidget::searchingStarted()
107{
109 qApp->setOverrideCursor(QCursor(Qt::WaitCursor));
110}
111
112void SearchWidget::searchingFinished(int searchResultCount)
113{
115 Q_UNUSED(searchResultCount);
116 qApp->restoreOverrideCursor();
117}
118
119bool SearchWidget::eventFilter(QObject* o, QEvent *e)
120{
122 QTextBrowser* browser = resultWidget->findChild<QTextBrowser*>();
123 if (browser && o == browser->viewport()
124 && e->type() == QEvent::MouseButtonRelease){
125 QMouseEvent *me = static_cast<QMouseEvent*>(e);
126 QUrl link = resultWidget->linkAt(me->pos());
127 if (!link.isEmpty() || link.isValid()) {
128 bool controlPressed = me->modifiers() & Qt::ControlModifier;
129 if ((me->button() == Qt::LeftButton && controlPressed)
130 || (me->button() == Qt::MiddleButton)) {
131 emit requestShowLinkInNewTab(link);
132 }
133 }
134 }
135 return QWidget::eventFilter(o,e);
136}
137
138void SearchWidget::keyPressEvent(QKeyEvent *keyEvent)
139{
141 if (keyEvent->key() == Qt::Key_Escape)
143 else
144 keyEvent->ignore();
145}
146
147void SearchWidget::contextMenuEvent(QContextMenuEvent *contextMenuEvent)
148{
150 QMenu menu;
151 QPoint point = contextMenuEvent->globalPos();
152
153 QTextBrowser* browser = resultWidget->findChild<QTextBrowser*>();
154 if (!browser)
155 return;
156
157 point = browser->mapFromGlobal(point);
158 if (!browser->rect().contains(point, true))
159 return;
160
161 QUrl link = browser->anchorAt(point);
162
163 QKeySequence keySeq;
164#if QT_CONFIG(clipboard)
165 keySeq = QKeySequence::Copy;
166 QAction *copyAction = menu.addAction(tr("&Copy") + u'\t' +
167 keySeq.toString(QKeySequence::NativeText));
168 copyAction->setEnabled(QTextCursor(browser->textCursor()).hasSelection());
169
170 QAction *copyAnchorAction = menu.addAction(tr("Copy &Link Location"));
171 copyAnchorAction->setEnabled(!link.isEmpty() && link.isValid());
172#endif
173
174 keySeq = QKeySequence(Qt::CTRL);
175 QAction *newTabAction = menu.addAction(tr("Open Link in New Tab") + u'\t'
176 + keySeq.toString(QKeySequence::NativeText) + "LMB"_L1);
177 newTabAction->setEnabled(!link.isEmpty() && link.isValid());
178
179 menu.addSeparator();
180
181 keySeq = QKeySequence::SelectAll;
182 QAction *selectAllAction =
183 menu.addAction(tr("Select All") + u'\t' + keySeq.toString(QKeySequence::NativeText));
184
185 QAction *usedAction = menu.exec(mapToGlobal(contextMenuEvent->pos()));
186#if QT_CONFIG(clipboard)
187 if (usedAction == copyAction) {
188 QTextCursor cursor = browser->textCursor();
189 if (!cursor.isNull() && cursor.hasSelection()) {
190 QString selectedText = cursor.selectedText();
191 QMimeData *data = new QMimeData();
192 data->setText(selectedText);
193 QApplication::clipboard()->setMimeData(data);
194 }
195 }
196 else if (usedAction == copyAnchorAction) {
197 QApplication::clipboard()->setText(link.toString());
198 }
199 else
200#endif
201 if (usedAction == newTabAction) {
202 emit requestShowLinkInNewTab(link);
203 }
204 else if (usedAction == selectAllAction) {
205 browser->selectAll();
206 }
207}
208
209QT_END_NAMESPACE
static void activateCurrentBrowser()
void contextMenuEvent(QContextMenuEvent *contextMenuEvent) override
This event handler, for event event, can be reimplemented in a subclass to receive widget context men...
void keyPressEvent(QKeyEvent *keyEvent) override
This event handler, for event event, can be reimplemented in a subclass to receive key press events f...
bool eventFilter(QObject *o, QEvent *e) override
Filters events if this object has been installed as an event filter for the watched object.
~SearchWidget() override
Combined button and popup list for selecting options.
#define TRACE_OBJ
Definition tracer.h:34