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
topicchooser.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 "topicchooser.h"
7
8#include <QKeyEvent>
9#include <QStandardItemModel>
10#include <QSortFilterProxyModel>
11#include <QUrl>
12
13#include <QtHelp/QHelpLink>
14
15#include <algorithm>
16
17QT_BEGIN_NAMESPACE
18
19using namespace Qt::StringLiterals;
20
21// Sort QHelpLink lists such that deprecated QtLabs entries are last.
22static bool isNotQtLabsUrl(const QHelpLink &hl)
23{
24 return !hl.url.host().contains("qtlabsplatform"_L1);
25}
26
27TopicChooser::TopicChooser(QWidget *parent, const QString &keyword, QList<QHelpLink> docs)
28 : QDialog(parent)
29 , m_filterModel(new QSortFilterProxyModel(this))
30{
31 std::stable_partition(docs.begin(), docs.end(), isNotQtLabsUrl);
32
34 ui.setupUi(this);
35
36 setFocusProxy(ui.lineEdit);
37 ui.lineEdit->installEventFilter(this);
38 ui.lineEdit->setPlaceholderText(tr("Filter"));
39 ui.label->setText(tr("Choose a topic for <b>%1</b>:").arg(keyword));
40
41 QStandardItemModel *model = new QStandardItemModel(this);
42 m_filterModel->setSourceModel(model);
43 m_filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
44
45 for (const auto &doc : docs) {
46 m_links.append(doc.url);
47 QStandardItem *item = new QStandardItem(doc.title);
48 item->setToolTip(doc.url.toString());
49 model->appendRow(item);
50 }
51
52 ui.listWidget->setModel(m_filterModel);
53 ui.listWidget->setUniformItemSizes(true);
54 ui.listWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
55
56 if (m_filterModel->rowCount() != 0)
57 ui.listWidget->setCurrentIndex(m_filterModel->index(0, 0));
58
59 connect(ui.buttonCancel, &QAbstractButton::clicked,
60 this, &QDialog::reject);
61 connect(ui.buttonDisplay, &QAbstractButton::clicked,
62 this, &TopicChooser::acceptDialog);
63 connect(ui.lineEdit, &QLineEdit::textChanged,
64 this, &TopicChooser::setFilter);
65 connect(ui.listWidget, &QAbstractItemView::activated,
66 this, &TopicChooser::activated);
67
68 const QByteArray ba = HelpEngineWrapper::instance().topicChooserGeometry();
69 if (!ba.isEmpty())
70 restoreGeometry(ba);
71}
72
74{
75 HelpEngineWrapper::instance().setTopicChooserGeometry(saveGeometry());
76}
77
79{
81 if (m_activedIndex.isValid())
82 return m_links.at(m_filterModel->mapToSource(m_activedIndex).row());
83 return QUrl();
84}
85
86void TopicChooser::acceptDialog()
87{
89 m_activedIndex = ui.listWidget->currentIndex();
90 accept();
91}
92
93void TopicChooser::setFilter(const QString &pattern)
94{
96 m_filterModel->setFilterFixedString(pattern);
97 if (m_filterModel->rowCount() != 0 && !ui.listWidget->currentIndex().isValid())
98 ui.listWidget->setCurrentIndex(m_filterModel->index(0, 0));
99}
100
101void TopicChooser::activated(const QModelIndex &index)
102{
104 m_activedIndex = index;
105 accept();
106}
107
108bool TopicChooser::eventFilter(QObject *object, QEvent *event)
109{
111 if (object == ui.lineEdit && event->type() == QEvent::KeyPress) {
112 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
113 switch (keyEvent->key()) {
114 case Qt::Key_Up:
115 case Qt::Key_Down:
116 case Qt::Key_PageUp:
117 case Qt::Key_PageDown:
118 QCoreApplication::sendEvent(ui.listWidget, event);
119 break;
120 }
121 } else if (ui.lineEdit && event->type() == QEvent::FocusIn
122 && static_cast<QFocusEvent *>(event)->reason() != Qt::MouseFocusReason) {
123 ui.lineEdit->selectAll();
124 ui.lineEdit->setFocus();
125 }
126 return QDialog::eventFilter(object, event);
127}
128
129QT_END_NAMESPACE
static HelpEngineWrapper & instance()
bool eventFilter(QObject *object, QEvent *event) override
\reimp
~TopicChooser() override
QUrl link() const
static bool isNotQtLabsUrl(const QHelpLink &hl)
#define TRACE_OBJ
Definition tracer.h:34