Skip to content

Commit 4ef5ea9

Browse files
authored
Merge pull request #20810 from calixteman/bug2010832
Add a UI to undo cut/delete and cancel a copy (bug 2021352, bug 2010832)
2 parents 46f4bc8 + 0e48c16 commit 4ef5ea9

12 files changed

Lines changed: 748 additions & 43 deletions

File tree

l10n/en-US/viewer.ftl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,7 @@ pdfjs-views-manager-status-warning-copy-label = Couldn’t copy. Refresh page an
764764
pdfjs-views-manager-status-warning-delete-label = Couldn’t delete. Refresh page and try again.
765765
pdfjs-views-manager-status-warning-save-label = Couldn’t save. Refresh page and try again.
766766
pdfjs-views-manager-status-undo-button-label = Undo
767+
pdfjs-views-manager-status-done-button-label = Done
767768
pdfjs-views-manager-status-close-button =
768769
.title = Close
769770
pdfjs-views-manager-status-close-button-label = Close

src/display/api.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2406,6 +2406,8 @@ class WorkerTransport {
24062406

24072407
#copiedPageInfo = null;
24082408

2409+
#savedPageInfo = null;
2410+
24092411
constructor(
24102412
messageHandler,
24112413
loadingTask,
@@ -2477,13 +2479,36 @@ class WorkerTransport {
24772479
return;
24782480
}
24792481

2482+
if (type === "cancelCopy") {
2483+
this.#copiedPageInfo = null;
2484+
return;
2485+
}
2486+
24802487
if (type === "delete") {
2488+
this.#savedPageInfo = {
2489+
pageCache: new Map(this.#pageCache),
2490+
pagePromises: new Map(this.#pagePromises),
2491+
};
24812492
for (const pageNum of pageNumbers) {
24822493
this.#pageCache.delete(pageNum - 1);
24832494
this.#pagePromises.delete(pageNum - 1);
24842495
}
24852496
}
24862497

2498+
if (type === "cancelDelete") {
2499+
if (this.#savedPageInfo) {
2500+
this.#pageCache = this.#savedPageInfo.pageCache;
2501+
this.#pagePromises = this.#savedPageInfo.pagePromises;
2502+
this.#savedPageInfo = null;
2503+
}
2504+
return;
2505+
}
2506+
2507+
if (type === "cleanSavedData") {
2508+
this.#savedPageInfo = null;
2509+
return;
2510+
}
2511+
24872512
const newPageCache = new Map();
24882513
const newPromiseCache = new Map();
24892514
const { pagesMapper } = this;

src/display/display_utils.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1082,6 +1082,8 @@ class PagesMapper {
10821082
*/
10831083
#copiedPageNumbers = null;
10841084

1085+
#savedData = null;
1086+
10851087
/**
10861088
* Gets the total number of pages.
10871089
* @returns {number} The number of pages.
@@ -1253,6 +1255,13 @@ class PagesMapper {
12531255
const pageNumberToId = this.#pageNumberToId;
12541256
const prevIdToPageNumber = this.#idToPageNumber;
12551257

1258+
this.#savedData = {
1259+
pageNumberToId: pageNumberToId.slice(),
1260+
idToPageNumber: new Map(prevIdToPageNumber),
1261+
pageNumber: this.#pagesNumber,
1262+
prevPageNumbers: this.#prevPageNumbers.slice(),
1263+
};
1264+
12561265
this.pagesNumber -= pagesToDelete.length;
12571266
this.#init(false);
12581267
const newPageNumberToId = this.#pageNumberToId;
@@ -1279,6 +1288,22 @@ class PagesMapper {
12791288
this.#updateListeners({ type: "delete", pageNumbers: pagesToDelete });
12801289
}
12811290

1291+
cancelDelete() {
1292+
if (this.#savedData) {
1293+
this.#pageNumberToId = this.#savedData.pageNumberToId;
1294+
this.#idToPageNumber = this.#savedData.idToPageNumber;
1295+
this.pagesNumber = this.#savedData.pageNumber;
1296+
this.#prevPageNumbers = this.#savedData.prevPageNumbers;
1297+
this.#savedData = null;
1298+
this.#updateListeners({ type: "cancelDelete" });
1299+
}
1300+
}
1301+
1302+
cleanSavedData() {
1303+
this.#savedData = null;
1304+
this.#updateListeners({ type: "cleanSavedData" });
1305+
}
1306+
12821307
/**
12831308
* Copies a set of pages while keeping ID→number mappings in sync.
12841309
* @param {Uint32Array} pagesToCopy - Page numbers to copy (1-indexed).
@@ -1292,6 +1317,12 @@ class PagesMapper {
12921317
this.#updateListeners({ type: "copy", pageNumbers: pagesToCopy });
12931318
}
12941319

1320+
cancelCopy() {
1321+
this.#copiedPageIds = null;
1322+
this.#copiedPageNumbers = null;
1323+
this.#updateListeners({ type: "cancelCopy" });
1324+
}
1325+
12951326
/**
12961327
* Pastes a set of pages while keeping ID→number mappings in sync.
12971328
* @param {number} index - Zero-based insertion index in the page-number list.
@@ -1323,6 +1354,7 @@ class PagesMapper {
13231354
this.#updateListeners({ type: "paste" });
13241355

13251356
this.#copiedPageIds = null;
1357+
this.#copiedPageNumbers = null;
13261358
}
13271359

13281360
/**
@@ -1455,7 +1487,7 @@ class PagesMapper {
14551487
}
14561488

14571489
getMapping() {
1458-
return this.#pageNumberToId.subarray(0, this.pagesNumber);
1490+
return this.#pageNumberToId?.subarray(0, this.pagesNumber);
14591491
}
14601492
}
14611493

0 commit comments

Comments
 (0)