141 const bool documentAvailable = (m_document && m_document->status() == QPdfDocument::Status::Ready);
143 if (documentAvailable) {
144 q->beginResetModel();
146 QPdfMutexLocker lock;
147 appendChildNode(m_rootNode.data(),
nullptr, 0, m_document->d->doc);
151 if (m_rootNode->childCount() == 0) {
154 q->beginResetModel();
161 void appendChildNode(BookmarkNode *parentBookmarkNode, FPDF_BOOKMARK parentBookmark,
int level, FPDF_DOCUMENT document)
163 FPDF_BOOKMARK bookmark = FPDFBookmark_GetFirstChild(document, parentBookmark);
166 BookmarkNode *childBookmarkNode =
nullptr;
168 childBookmarkNode =
new BookmarkNode(parentBookmarkNode);
169 parentBookmarkNode->appendChild(childBookmarkNode);
170 Q_ASSERT(childBookmarkNode);
172 const int titleLength =
int(FPDFBookmark_GetTitle(bookmark,
nullptr, 0));
174 QList<
char16_t> titleBuffer(titleLength);
175 FPDFBookmark_GetTitle(bookmark, titleBuffer.data(), quint32(titleBuffer.size()));
177 const FPDF_DEST dest = FPDFBookmark_GetDest(document, bookmark);
178 const int pageNumber = FPDFDest_GetDestPageIndex(document, dest);
179 const qreal pageHeight = m_document->pagePointSize(pageNumber).height();
180 FPDF_BOOL hasX, hasY, hasZoom;
182 bool ok = FPDFDest_GetLocationInPage(dest, &hasX, &hasY, &hasZoom, &x, &y, &zoom);
185 childBookmarkNode->setLocation(x, pageHeight - y);
187 childBookmarkNode->setZoom(zoom);
189 qCWarning(qLcBM) <<
"bookmark with invalid location and/or zoom" << x << y << zoom;
192 childBookmarkNode->setTitle(QString::fromUtf16(titleBuffer.data()));
193 childBookmarkNode->setLevel(level);
194 childBookmarkNode->setPageNumber(pageNumber);
197 appendChildNode(childBookmarkNode, bookmark, level + 1, document);
199 bookmark = FPDFBookmark_GetNextSibling(document, bookmark);