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:
commit
06b253d609
@ -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: [],
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user