Merge pull request #10890 from Snuffleupagus/outline-items-hidden

Add support for outline items, in the default viewer, which default to collapsed when the outline is built
This commit is contained in:
Tim van der Meij 2019-06-09 11:35:49 +02:00 committed by GitHub
commit 06b253d609
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 7 deletions

View File

@ -144,6 +144,7 @@ class Catalog {
const title = outlineDict.get('Title'); const title = outlineDict.get('Title');
const flags = outlineDict.get('F') || 0; const flags = outlineDict.get('F') || 0;
const color = outlineDict.getArray('C'); const color = outlineDict.getArray('C');
const count = outlineDict.get('Count');
let rgbColor = blackColor; let rgbColor = blackColor;
// We only need to parse the color when it's valid, and non-default. // We only need to parse the color when it's valid, and non-default.
@ -159,7 +160,7 @@ class Catalog {
newWindow: data.newWindow, newWindow: data.newWindow,
title: stringToPDFString(title), title: stringToPDFString(title),
color: rgbColor, color: rgbColor,
count: outlineDict.get('Count'), count: Number.isInteger(count) ? count : undefined,
bold: !!(flags & 2), bold: !!(flags & 2),
italic: !!(flags & 1), italic: !!(flags & 1),
items: [], items: [],

View File

@ -715,6 +715,7 @@ class PDFDocumentProxy {
* bold: boolean, * bold: boolean,
* italic: boolean, * italic: boolean,
* color: rgb Uint8ClampedArray, * color: rgb Uint8ClampedArray,
* count: integer or undefined,
* dest: dest obj, * dest: dest obj,
* url: string, * url: string,
* items: array of more items like this * items: array of more items like this

View File

@ -112,9 +112,12 @@ class PDFOutlineViewer {
* *
* @private * @private
*/ */
_addToggleButton(div) { _addToggleButton(div, { count, items, }) {
let toggler = document.createElement('div'); let toggler = document.createElement('div');
toggler.className = 'outlineItemToggler'; toggler.className = 'outlineItemToggler';
if (count < 0 && Math.abs(count) === items.length) {
toggler.classList.add('outlineItemsHidden');
}
toggler.onclick = (evt) => { toggler.onclick = (evt) => {
evt.stopPropagation(); evt.stopPropagation();
toggler.classList.toggle('outlineItemsHidden'); toggler.classList.toggle('outlineItemsHidden');
@ -173,10 +176,8 @@ class PDFOutlineViewer {
let queue = [{ parent: fragment, items: this.outline, }]; let queue = [{ parent: fragment, items: this.outline, }];
let hasAnyNesting = false; let hasAnyNesting = false;
while (queue.length > 0) { while (queue.length > 0) {
let levelData = queue.shift(); const levelData = queue.shift();
for (let i = 0, len = levelData.items.length; i < len; i++) { for (const item of levelData.items) {
let item = levelData.items[i];
let div = document.createElement('div'); let div = document.createElement('div');
div.className = 'outlineItem'; div.className = 'outlineItem';
@ -190,7 +191,7 @@ class PDFOutlineViewer {
if (item.items.length > 0) { if (item.items.length > 0) {
hasAnyNesting = true; hasAnyNesting = true;
this._addToggleButton(div); this._addToggleButton(div, item);
let itemsDiv = document.createElement('div'); let itemsDiv = document.createElement('div');
itemsDiv.className = 'outlineItems'; itemsDiv.className = 'outlineItems';
@ -204,6 +205,9 @@ class PDFOutlineViewer {
} }
if (hasAnyNesting) { if (hasAnyNesting) {
this.container.classList.add('outlineWithDeepNesting'); this.container.classList.add('outlineWithDeepNesting');
this.lastToggleIsShow =
(fragment.querySelectorAll('.outlineItemsHidden').length === 0);
} }
this.container.appendChild(fragment); this.container.appendChild(fragment);