Merge pull request #20788 from calixteman/organize_context_menu

Add the pages organization actions in the Firefox context menu (bug 2018138)
This commit is contained in:
calixteman 2026-03-04 15:20:00 +01:00 committed by GitHub
commit 72f98d4e00
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 54 additions and 2 deletions

View File

@ -1852,7 +1852,7 @@ class AnnotationEditorUIManager {
); );
if (hasChanged) { if (hasChanged) {
this._eventBus.dispatch("annotationeditorstateschanged", { this._eventBus.dispatch("editingstateschanged", {
source: this, source: this,
details: Object.assign(this.#previousStates, details), details: Object.assign(this.#previousStates, details),
}); });

View File

@ -2173,7 +2173,7 @@ const PDFViewerApplication = {
} }
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
eventBus._on( eventBus._on(
"annotationeditorstateschanged", "editingstateschanged",
evt => externalServices.updateEditorStates(evt), evt => externalServices.updateEditorStates(evt),
opts opts
); );

View File

@ -133,6 +133,10 @@ class PDFThumbnailViewer {
#scrollableContainerHeight = 0; #scrollableContainerHeight = 0;
#previousStates = {
hasSelectedPages: false,
};
/** /**
* @param {PDFThumbnailViewerOptions} options * @param {PDFThumbnailViewerOptions} options
*/ */
@ -185,6 +189,23 @@ class PDFThumbnailViewer {
this.#toggleMenuEntries(false); this.#toggleMenuEntries(false);
button.disabled = true; button.disabled = true;
this.eventBus.on("editingaction", ({ name }) => {
switch (name) {
case "copyPage":
this.#copyPages();
break;
case "cutPage":
this.#cutPages();
break;
case "deletePage":
this.#deletePages();
break;
case "savePage":
this.#saveExtractedPages();
break;
}
});
} else { } else {
manageMenu.button.hidden = true; manageMenu.button.hidden = true;
} }
@ -198,6 +219,24 @@ class PDFThumbnailViewer {
this.#addEventListeners(); this.#addEventListeners();
} }
/**
* Update the different possible states of this manager, e.g. is there
* something to copy, paste, ...
* @param {Object} details
*/
#dispatchUpdateStates(details) {
const hasChanged = Object.entries(details).some(
([key, value]) => this.#previousStates[key] !== value
);
if (hasChanged) {
this.eventBus.dispatch("editingstateschanged", {
source: this,
details: Object.assign(this.#previousStates, details),
});
}
}
#scrollUpdated() { #scrollUpdated() {
this.renderingQueue.renderHighestPriority(); this.renderingQueue.renderHighestPriority();
} }
@ -730,6 +769,9 @@ class PDFThumbnailViewer {
this.#manageCopyButton.disabled = this.#manageCopyButton.disabled =
this.#manageCutButton.disabled = this.#manageCutButton.disabled =
!this.#selectedPages?.size; !this.#selectedPages?.size;
this.#dispatchUpdateStates({
hasSelectedPages: !!this.#selectedPages?.size,
});
} }
#toggleMenuEntries(enable) { #toggleMenuEntries(enable) {
@ -895,6 +937,16 @@ class PDFThumbnailViewer {
this.#computeThumbnailsPosition(); this.#computeThumbnailsPosition();
} }
}); });
this.container.addEventListener("focusout", () => {
this.#dispatchUpdateStates({
hasSelectedPages: false,
});
});
this.container.addEventListener("focusin", () => {
this.#dispatchUpdateStates({
hasSelectedPages: !!this.#selectedPages?.size,
});
});
this.container.addEventListener("keydown", e => { this.container.addEventListener("keydown", e => {
const { target } = e; const { target } = e;
const isCheckbox = const isCheckbox =