diff --git a/src/display/editor/editor.js b/src/display/editor/editor.js index 589a6ad8f342b..d943bb02daafb 100644 --- a/src/display/editor/editor.js +++ b/src/display/editor/editor.js @@ -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 diff --git a/src/display/editor/freetext.js b/src/display/editor/freetext.js index 96610fdcf9aae..21d300fffa6ba 100644 --- a/src/display/editor/freetext.js +++ b/src/display/editor/freetext.js @@ -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 };