9#include <QtCore/qfuturewatcher.h>
12#include <QtCore/qdir.h>
13#include <QtWidgets/qheaderview.h>
17using namespace Qt::StringLiterals;
49void QHelpContentModelPrivate::createContents(
const ItemFutureProvider &futureProvider)
51 const bool wasRunning =
bool(watcher);
52 watcher.reset(
new QFutureWatcher<std::shared_ptr<QHelpContentItem>>);
53 QObject::connect(watcher.get(), &QFutureWatcherBase::finished, q, [
this] {
54 if (!watcher->isCanceled()) {
55 const std::shared_ptr<QHelpContentItem> result = watcher->result();
56 if (result && result.get()) {
62 watcher.release()->deleteLater();
63 emit q->contentsCreated();
65 watcher->setFuture(futureProvider());
75 emit q->contentsCreationStarted();
80
81
82
83
84
87
88
89
90
91
92
93
94
97
98
99
100
102QHelpContentModel::QHelpContentModel(QHelpEngineCore *helpEngine)
103 : QAbstractItemModel(helpEngine)
104 , d(
new QHelpContentModelPrivate{
this, helpEngine})
108
109
110QHelpContentModel::~QHelpContentModel()
116
117
118
119
120void QHelpContentModel::createContentsForCurrentFilter()
123 d->createContents([
this] {
return d->helpEngine->requestContentForCurrentFilter(); });
128
129
130
131void QHelpContentModel::createContents(
const QString &filter)
134 d->createContents([
this, filter] {
return d->helpEngine->requestContent(filter); });
139void QHelpContentModel::insertContents()
143
144
145
146bool QHelpContentModel::isCreatingContents()
const
149 return bool(d->watcher);
156
157
158
159QHelpContentItem *QHelpContentModel::contentItemAt(
const QModelIndex &index)
const
161 return index.isValid() ?
static_cast<QHelpContentItem *>(index.internalPointer())
166
167
168
169QModelIndex QHelpContentModel::index(
int row,
int column,
const QModelIndex &parent)
const
174 QHelpContentItem *parentItem = contentItemAt(parent);
175 QHelpContentItem *item = parentItem->child(row);
178 return createIndex(row, column, item);
182
183
184
185QModelIndex QHelpContentModel::parent(
const QModelIndex &index)
const
187 QHelpContentItem *item = contentItemAt(index);
191 QHelpContentItem *parentItem =
static_cast<QHelpContentItem*>(item->parent());
195 QHelpContentItem *grandparentItem =
static_cast<QHelpContentItem*>(parentItem->parent());
196 if (!grandparentItem)
199 const int row = grandparentItem->childPosition(parentItem);
200 return createIndex(row, index.column(), parentItem);
204
205
206int QHelpContentModel::rowCount(
const QModelIndex &parent)
const
208 QHelpContentItem *parentItem = contentItemAt(parent);
210 return parentItem->childCount();
215
216
217int QHelpContentModel::columnCount(
const QModelIndex &parent)
const
224
225
226
227QVariant QHelpContentModel::data(
const QModelIndex &index,
int role)
const
229 if (role == Qt::DisplayRole) {
230 QHelpContentItem *item = contentItemAt(index);
232 return item->title();
238
239
240
241
242
245
246
247
248
249
251QHelpContentWidget::QHelpContentWidget()
254 setUniformRowHeights(
true);
255 connect(
this, &QAbstractItemView::activated,
this, &QHelpContentWidget::showLink);
259
260
261
262QModelIndex QHelpContentWidget::indexOf(
const QUrl &link)
264 QHelpContentModel *contentModel = qobject_cast<QHelpContentModel*>(model());
265 if (!contentModel || link.scheme() !=
"qthelp"_L1)
269 for (
int i = 0; i < contentModel->rowCount(); ++i) {
270 QHelpContentItem *itm = contentModel->contentItemAt(contentModel->index(i, 0));
271 if (itm && itm->url().host() == link.host()) {
272 if (searchContentItem(contentModel, contentModel->index(i, 0), QDir::cleanPath(link.path())))
279bool QHelpContentWidget::searchContentItem(QHelpContentModel *model,
const QModelIndex &parent,
280 const QString &cleanPath)
282 QHelpContentItem *parentItem = model->contentItemAt(parent);
286 if (QDir::cleanPath(parentItem->url().path()) == cleanPath) {
287 m_syncIndex = parent;
291 for (
int i = 0; i < parentItem->childCount(); ++i) {
292 if (searchContentItem(model, model->index(i, 0, parent), cleanPath))
298void QHelpContentWidget::showLink(
const QModelIndex &index)
300 QHelpContentModel *contentModel = qobject_cast<QHelpContentModel*>(model());
304 QHelpContentItem *item = contentModel->contentItemAt(index);
307 QUrl url = item->url();
309 emit linkActivated(url);
std::shared_ptr< QHelpContentItem > rootItem
QHelpEngineCore * helpEngine
Combined button and popup list for selecting options.