1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-19 22:58:07 +02:00

[Editor] Avoid calling setTimeout when editing an existing freetext

The code was added in order to guess if an editor has been moved but
it's simpler to just set a variable when it's dragged or moved with
the keyboard. This way we remove a bit of asynchronicity.
This commit is contained in:
Calixte Denizet 2024-04-08 14:29:50 +02:00
parent 5adad89eb3
commit 3b93fdea26
2 changed files with 16 additions and 22 deletions

View file

@ -62,6 +62,8 @@ class AnnotationEditor {
#hasBeenClicked = false;
#initialPosition = null;
#isEditing = false;
#isInEditMode = false;
@ -445,6 +447,8 @@ class AnnotationEditor {
* @param {number} y - y-translation in screen coordinates.
*/
translate(x, y) {
// We don't change the initial position because the move here hasn't been
// done by the user.
this.#translate(this.parentDimensions, x, y);
}
@ -455,11 +459,13 @@ class AnnotationEditor {
* @param {number} y - y-translation in page coordinates.
*/
translateInPage(x, y) {
this.#initialPosition ||= [this.x, this.y];
this.#translate(this.pageDimensions, x, y);
this.div.scrollIntoView({ block: "nearest" });
}
drag(tx, ty) {
this.#initialPosition ||= [this.x, this.y];
const [parentWidth, parentHeight] = this.parentDimensions;
this.x += tx / parentWidth;
this.y += ty / parentHeight;
@ -492,6 +498,14 @@ class AnnotationEditor {
this.div.scrollIntoView({ block: "nearest" });
}
get _hasBeenMoved() {
return (
!!this.#initialPosition &&
(this.#initialPosition[0] !== this.x ||
this.#initialPosition[1] !== this.y)
);
}
/**
* Get the translation to take into account the editor border.
* The CSS engine positions the element by taking the border into account so

View file

@ -357,7 +357,6 @@ class FreeTextEditor extends AnnotationEditor {
/** @inheritdoc */
onceAdded() {
if (this.width) {
this.#cheatInitialRect();
// The editor was created in using ctrl+c.
return;
}
@ -844,35 +843,16 @@ class FreeTextEditor extends AnnotationEditor {
}
#hasElementChanged(serialized) {
const { value, fontSize, color, rect, pageIndex } = this.#initialData;
const { value, fontSize, color, pageIndex } = this.#initialData;
return (
this._hasBeenMoved ||
serialized.value !== value ||
serialized.fontSize !== fontSize ||
serialized.rect.some((x, i) => Math.abs(x - rect[i]) >= 1) ||
serialized.color.some((c, i) => c !== color[i]) ||
serialized.pageIndex !== pageIndex
);
}
#cheatInitialRect(delayed = false) {
// The annotation has a rect but the editor has an other one.
// When we want to know if the annotation has changed (e.g. has been moved)
// we must compare the editor initial rect with the current one.
// So this method is a hack to have a way to compare the real rects.
if (!this.annotationElementId) {
return;
}
this.#setEditorDimensions();
if (!delayed && (this.width === 0 || this.height === 0)) {
setTimeout(() => this.#cheatInitialRect(/* delayed = */ true), 0);
return;
}
const padding = FreeTextEditor._internalPadding * this.parentScale;
this.#initialData.rect = this.getRect(padding, padding);
}
}
export { FreeTextEditor };