From 27062f72c27e37f4a8a93cca1a883e7fbe54cd71 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 10 Apr 2021 12:52:53 +0200 Subject: [PATCH] Improve the handling of the `currentOutlineButton` enabling/disabling (PR 12777 follow-up) It's obviously better and more correct to handle the "pagesloaded" case within `PDFOutlineViewer` *itself*, rather than essentially splitting the logic in two parts and forcing `PDFSidebar` to deal with what should've been handled internally in `PDFOutlineViewer`. This is what I *should* have done in PR 12777, but for some reason didn't figure out how to implement it well enough back then; sorry about the churn here! --- web/pdf_outline_viewer.js | 28 ++++++++++++++++++++++++++-- web/pdf_sidebar.js | 11 ++++++----- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/web/pdf_outline_viewer.js b/web/pdf_outline_viewer.js index 96c229012..09afc9bf3 100644 --- a/web/pdf_outline_viewer.js +++ b/web/pdf_outline_viewer.js @@ -53,6 +53,15 @@ class PDFOutlineViewer extends BaseTreeViewer { }); this.eventBus._on("pagesloaded", evt => { this._isPagesLoaded = !!evt.pagesCount; + + // If the capability is still pending, note the `_dispatchEvent`-method, + // we know that the `currentOutlineItem`-button should be enabled here. + if ( + this._currentOutlineItemCapability && + !this._currentOutlineItemCapability.settled + ) { + this._currentOutlineItemCapability.resolve(/* enabled = */ true); + } }); this.eventBus._on("sidebarviewchanged", evt => { this._sidebarView = evt.view; @@ -66,17 +75,32 @@ class PDFOutlineViewer extends BaseTreeViewer { this._pageNumberToDestHashCapability = null; this._currentPageNumber = 1; this._isPagesLoaded = false; + + if ( + this._currentOutlineItemCapability && + !this._currentOutlineItemCapability.settled + ) { + this._currentOutlineItemCapability.resolve(/* enabled = */ false); + } + this._currentOutlineItemCapability = null; } /** * @private */ _dispatchEvent(outlineCount) { + this._currentOutlineItemCapability = createPromiseCapability(); + if ( + outlineCount === 0 || + this._pdfDocument?.loadingParams.disableAutoFetch + ) { + this._currentOutlineItemCapability.resolve(/* enabled = */ false); + } + this.eventBus.dispatch("outlineloaded", { source: this, outlineCount, - enableCurrentOutlineItemButton: - outlineCount > 0 && !this._pdfDocument?.loadingParams.disableAutoFetch, + currentOutlineItemPromise: this._currentOutlineItemCapability.promise, }); } diff --git a/web/pdf_sidebar.js b/web/pdf_sidebar.js index 4faaa4da3..1e7e04ad0 100644 --- a/web/pdf_sidebar.js +++ b/web/pdf_sidebar.js @@ -425,11 +425,12 @@ class PDFSidebar { this.eventBus._on("outlineloaded", evt => { onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE); - if (evt.enableCurrentOutlineItemButton) { - this.pdfViewer.pagesPromise.then(() => { - this._currentOutlineItemButton.disabled = !this.isInitialViewSet; - }); - } + evt.currentOutlineItemPromise.then(enabled => { + if (!this.isInitialViewSet) { + return; + } + this._currentOutlineItemButton.disabled = !enabled; + }); }); this.eventBus._on("attachmentsloaded", evt => {