Dispatch a sidebarviewchanged
event in PDFSidebar
when the view changes
We cannot piggy-back on the `updateviewarea` event in order to update the stored sidebar state, since there're a number of cases where opening/switching the sidebar view won't fire a `updateviewarea` event. Note that `updateviewarea` only fires when the position changes in the *viewer*, which means that it won't fire if e.g. the viewer is narrow, such that the sidebar overlays the document transparently; or when switching views, without the document position also changing. This patch also moves the handling of `forceOpen` parameter in `PDFSidebar_switchView`, to prevent triggering back-to-back rendering and dispatching of events.
This commit is contained in:
parent
4a601ffc28
commit
5657d082c7
2 changed files with 66 additions and 22 deletions
|
@ -37,9 +37,9 @@ var SidebarView = {
|
|||
|
||||
/**
|
||||
* @typedef {Object} PDFSidebarOptions
|
||||
* @property {PDFViewer} - The document viewer.
|
||||
* @property {PDFThumbnailViewer} - The thumbnail viewer.
|
||||
* @property {PDFOutlineViewer} - The outline viewer.
|
||||
* @property {PDFViewer} pdfViewer - The document viewer.
|
||||
* @property {PDFThumbnailViewer} pdfThumbnailViewer - The thumbnail viewer.
|
||||
* @property {PDFOutlineViewer} pdfOutlineViewer - The outline viewer.
|
||||
* @property {HTMLDivElement} mainContainer - The main container
|
||||
* (in which the viewer element is placed).
|
||||
* @property {HTMLDivElement} outerContainer - The outer container
|
||||
|
@ -139,17 +139,25 @@ var PDFSidebar = (function PDFSidebarClosure() {
|
|||
this.isInitialViewSet = true;
|
||||
|
||||
if (this.isOpen && view === SidebarView.NONE) {
|
||||
this._dispatchEvent();
|
||||
// If the user has already manually opened the sidebar,
|
||||
// immediately closing it would be bad UX.
|
||||
return;
|
||||
}
|
||||
this.switchView(view, true);
|
||||
var isViewPreserved = (view === this.visibleView);
|
||||
this.switchView(view, /* forceOpen */ true);
|
||||
|
||||
if (isViewPreserved) {
|
||||
// Prevent dispatching two back-to-back `sidebarviewchanged` events,
|
||||
// since `this.switchView` dispatched the event if the view changed.
|
||||
this._dispatchEvent();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {number} view - The sidebar view that should be switched to,
|
||||
* must be one of the values in {SidebarView}.
|
||||
* @param {boolean} forceOpen - Ensure that the sidebar is opened.
|
||||
* @param {boolean} forceOpen - (optional) Ensure that the sidebar is open.
|
||||
* The default value is false.
|
||||
*/
|
||||
switchView: function PDFSidebar_switchView(view, forceOpen) {
|
||||
|
@ -157,9 +165,7 @@ var PDFSidebar = (function PDFSidebarClosure() {
|
|||
this.close();
|
||||
return;
|
||||
}
|
||||
if (forceOpen) {
|
||||
this.open();
|
||||
}
|
||||
var isViewChanged = (view !== this.active);
|
||||
var shouldForceRendering = false;
|
||||
|
||||
switch (view) {
|
||||
|
@ -172,7 +178,7 @@ var PDFSidebar = (function PDFSidebarClosure() {
|
|||
this.outlineView.classList.add('hidden');
|
||||
this.attachmentsView.classList.add('hidden');
|
||||
|
||||
if (this.isOpen && view !== this.active) {
|
||||
if (this.isOpen && isViewChanged) {
|
||||
this._updateThumbnailViewer();
|
||||
shouldForceRendering = true;
|
||||
}
|
||||
|
@ -210,9 +216,17 @@ var PDFSidebar = (function PDFSidebarClosure() {
|
|||
// in order to prevent setting it to an invalid state.
|
||||
this.active = view | 0;
|
||||
|
||||
if (forceOpen && !this.isOpen) {
|
||||
this.open();
|
||||
// NOTE: `this.open` will trigger rendering, and dispatch the event.
|
||||
return;
|
||||
}
|
||||
if (shouldForceRendering) {
|
||||
this._forceRendering();
|
||||
}
|
||||
if (isViewChanged) {
|
||||
this._dispatchEvent();
|
||||
}
|
||||
},
|
||||
|
||||
open: function PDFSidebar_open() {
|
||||
|
@ -229,6 +243,7 @@ var PDFSidebar = (function PDFSidebarClosure() {
|
|||
this._updateThumbnailViewer();
|
||||
}
|
||||
this._forceRendering();
|
||||
this._dispatchEvent();
|
||||
},
|
||||
|
||||
close: function PDFSidebar_close() {
|
||||
|
@ -242,6 +257,7 @@ var PDFSidebar = (function PDFSidebarClosure() {
|
|||
this.outerContainer.classList.remove('sidebarOpen');
|
||||
|
||||
this._forceRendering();
|
||||
this._dispatchEvent();
|
||||
},
|
||||
|
||||
toggle: function PDFSidebar_toggle() {
|
||||
|
@ -252,6 +268,17 @@ var PDFSidebar = (function PDFSidebarClosure() {
|
|||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
_dispatchEvent: function PDFSidebar_dispatchEvent() {
|
||||
var event = document.createEvent('CustomEvent');
|
||||
event.initCustomEvent('sidebarviewchanged', true, true, {
|
||||
view: this.visibleView,
|
||||
});
|
||||
this.outerContainer.dispatchEvent(event);
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue