Skip to content

Commit

Permalink
chore(): move canvas click handler to TextManager (#8939)
Browse files Browse the repository at this point in the history
  • Loading branch information
ShaMan123 authored May 21, 2023
1 parent ea9c488 commit 3ebe51a
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 17 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## [next]

- chore(): move canvas click handler to TextManager [#8939](https://github.com/fabricjs/fabric.js/pull/8939)

## [6.0.0-beta6]

- patch(): expose `Control#shouldActivate` [#8934](https://github.com/fabricjs/fabric.js/pull/8934)
Expand Down
6 changes: 3 additions & 3 deletions src/canvas/Canvas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export class Canvas extends SelectableCanvas {

private _isClick: boolean;

textEditingManager = new TextEditingManager();
textEditingManager = new TextEditingManager(this);

constructor(el: string | HTMLCanvasElement, options = {}) {
super(el, options);
Expand Down Expand Up @@ -1593,7 +1593,7 @@ export class Canvas extends SelectableCanvas {
* @override clear {@link textEditingManager}
*/
clear() {
this.textEditingManager.dispose();
this.textEditingManager.clear();
super.clear();
}

Expand All @@ -1602,7 +1602,7 @@ export class Canvas extends SelectableCanvas {
*/
destroy() {
this.removeListeners();
super.destroy();
this.textEditingManager.dispose();
super.destroy();
}
}
18 changes: 17 additions & 1 deletion src/canvas/TextEditingManager.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
import type { TPointerEvent } from '../EventTypeDefs';
import type { ITextBehavior } from '../shapes/IText/ITextBehavior';
import { removeFromArray } from '../util/internals';
import type { Canvas } from './Canvas';

/**
* In charge of synchronizing all interactive text instances of a canvas
*/
export class TextEditingManager {
private targets: ITextBehavior[] = [];
private declare target?: ITextBehavior;
private __disposer: VoidFunction;

constructor(canvas: Canvas) {
const cb = () => this.target?.hiddenTextarea?.focus();
const el = canvas.upperCanvasEl;
el.addEventListener('click', cb);
this.__disposer = () => el.removeEventListener('click', cb);
}

exitTextEditing() {
this.target = undefined;
Expand Down Expand Up @@ -41,8 +50,15 @@ export class TextEditingManager {
this.target?.isEditing && this.target.updateSelectionOnMouseMove(e);
}

dispose() {
clear() {
this.targets = [];
this.target = undefined;
}

dispose() {
this.clear();
this.__disposer();
// @ts-expect-error disposing
delete this.__disposer;
}
}
12 changes: 0 additions & 12 deletions src/shapes/IText/ITextKeyBehavior.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,18 +101,6 @@ export abstract class ITextKeyBehavior<
'compositionend',
this.onCompositionEnd.bind(this)
);

if (!this._clickHandlerInitialized && this.canvas) {
this.canvas.upperCanvasEl.addEventListener(
'click',
this.onClick.bind(this)
);
this._clickHandlerInitialized = true;
}
}

onClick() {
this.hiddenTextarea && this.hiddenTextarea.focus();
}

/**
Expand Down
2 changes: 1 addition & 1 deletion test/unit/canvas_events.js
Original file line number Diff line number Diff line change
Expand Up @@ -1182,7 +1182,7 @@
assert.ok(manager.target === a, 'should register a');
canvas.remove(a);
assert.ok(!manager.target, 'should unregister a');
manager.dispose();
manager.clear();
assert.ok(!manager.target, 'should have disposed ref');
assert.deepEqual(manager.targets, [], 'should have disposed refs');
const g = new fabric.Group([a]);
Expand Down

0 comments on commit 3ebe51a

Please sign in to comment.