canvas-react-easy 1.0.6 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,14 +8,15 @@ import { TextTool } from "../tools/Text";
8
8
  import { ImageTool } from "../tools/ImageTool";
9
9
  const Tools = () => {
10
10
  const selectTool = (ToolClass) => {
11
- var _a;
12
- const canvas = CanvasState.canvas;
13
- if (!canvas)
11
+ var _a, _b;
12
+ if (!CanvasState.canvas)
14
13
  return;
15
- // Очищаем события старого инструмента
14
+ // очищаем старый инструмент
16
15
  (_a = toolState.tool) === null || _a === void 0 ? void 0 : _a.clearEvents();
17
- // Устанавливаем новый инструмент
18
- toolState.setTool(new ToolClass(canvas));
16
+ // создаём новый инструмент и подключаем слушатели
17
+ const tool = new ToolClass(CanvasState.canvas);
18
+ (_b = tool.listen) === null || _b === void 0 ? void 0 : _b.call(tool); // если инструмент имеет метод listen
19
+ toolState.setTool(tool);
19
20
  };
20
21
  return (_jsxs("div", { style: { marginBottom: "10px" }, children: [_jsx("button", { onClick: () => selectTool(Brush), children: "\u041A\u0438\u0441\u0442\u044C" }), _jsx("button", { onClick: () => selectTool(Rectangle), children: "\u041F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A" }), _jsx("button", { onClick: () => selectTool(Circle), children: "\u041A\u0440\u0443\u0433" }), _jsx("button", { onClick: () => selectTool(TextTool), children: "\u0422\u0435\u043A\u0441\u0442" }), _jsx("button", { onClick: () => selectTool(ImageTool), children: "\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435" })] }));
21
22
  };
@@ -14,7 +14,20 @@ export class ImageTool extends Tool {
14
14
  this.listen();
15
15
  }
16
16
  listen() {
17
- this.canvas.onclick = this.onClickHandler.bind(this);
17
+ const handler = (e) => {
18
+ const evt = e;
19
+ const canvas = evt.target;
20
+ const x = evt.pageX - canvas.offsetLeft;
21
+ const y = evt.pageY - canvas.offsetTop;
22
+ const url = prompt("Введите ссылку на изображение");
23
+ if (!url)
24
+ return;
25
+ const img = new Image();
26
+ img.src = url;
27
+ img.onload = () => this.ctx.drawImage(img, x, y);
28
+ this.clearEvents(); // удаляем обработчики после использования
29
+ };
30
+ this.addListener("mousedown", handler);
18
31
  }
19
32
  onClickHandler(e) {
20
33
  return __awaiter(this, void 0, void 0, function* () {
@@ -6,17 +6,18 @@ export class TextTool extends Tool {
6
6
  }
7
7
  listen() {
8
8
  const handler = (e) => {
9
- const target = e.target;
10
- const x = e.pageX - target.offsetLeft;
11
- const y = e.pageY - target.offsetTop;
9
+ const evt = e; // приводим Event к MouseEvent
10
+ const canvas = evt.target;
11
+ const x = evt.pageX - canvas.offsetLeft;
12
+ const y = evt.pageY - canvas.offsetTop;
12
13
  const text = prompt("Введите текст");
13
14
  if (text) {
14
15
  this.ctx.fillText(text, x, y);
15
16
  }
16
- // убираем событие после первого использования
17
- target.removeEventListener("mousedown", handler);
17
+ // удаляем обработчик после первого использования
18
+ this.clearEvents();
18
19
  };
19
- this.canvas.addEventListener("mousedown", handler);
20
+ this.addListener("mousedown", handler);
20
21
  }
21
22
  onClickHandler(e) {
22
23
  const target = e.target;
@@ -1,10 +1,23 @@
1
1
  export default class Tool {
2
2
  constructor(canvas) {
3
3
  this.canvas = canvas;
4
+ this.events = [];
4
5
  this.ctx = canvas.getContext("2d");
6
+ this.events = [];
5
7
  this.clearEvents();
6
8
  }
9
+ // сохраняем слушатели, чтобы потом удалять
10
+ addListener(type, handler) {
11
+ this.canvas.addEventListener(type, handler);
12
+ this.events.push({ type, handler });
13
+ }
7
14
  clearEvents() {
15
+ // удаляем все зарегистрированные слушатели
16
+ this.events.forEach(({ type, handler }) => {
17
+ this.canvas.removeEventListener(type, handler);
18
+ });
19
+ this.events = [];
20
+ // очищаем стандартные свойства
8
21
  this.canvas.onmousedown = null;
9
22
  this.canvas.onmouseup = null;
10
23
  this.canvas.onmousemove = null;
@@ -2,5 +2,10 @@ export default class Tool {
2
2
  canvas: HTMLCanvasElement;
3
3
  constructor(canvas: HTMLCanvasElement);
4
4
  ctx: CanvasRenderingContext2D;
5
+ events: Array<{
6
+ type: string;
7
+ handler: EventListener;
8
+ }>;
9
+ addListener(type: string, handler: EventListener): void;
5
10
  clearEvents(): void;
6
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "canvas-react-easy",
3
- "version": "1.0.6",
3
+ "version": "1.0.9",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "license": "MIT",
@@ -10,15 +10,17 @@ import { ImageTool } from "../tools/ImageTool";
10
10
  const Tools = () => {
11
11
 
12
12
  const selectTool = (ToolClass: any) => {
13
- const canvas = CanvasState.canvas;
14
- if (!canvas) return;
13
+ if (!CanvasState.canvas) return;
15
14
 
16
- // Очищаем события старого инструмента
15
+ // очищаем старый инструмент
17
16
  toolState.tool?.clearEvents();
18
17
 
19
- // Устанавливаем новый инструмент
20
- toolState.setTool(new ToolClass(canvas));
21
- };
18
+ // создаём новый инструмент и подключаем слушатели
19
+ const tool = new ToolClass(CanvasState.canvas);
20
+ tool.listen?.(); // если инструмент имеет метод listen
21
+ toolState.setTool(tool);
22
+ };
23
+
22
24
 
23
25
  return (
24
26
  <div style={{ marginBottom: "10px" }}>
@@ -7,8 +7,24 @@ export class ImageTool extends Tool {
7
7
  }
8
8
 
9
9
  listen() {
10
- this.canvas.onclick = this.onClickHandler.bind(this);
11
- }
10
+ const handler = (e: Event) => {
11
+ const evt = e as MouseEvent;
12
+ const canvas = evt.target as HTMLCanvasElement;
13
+ const x = evt.pageX - canvas.offsetLeft;
14
+ const y = evt.pageY - canvas.offsetTop;
15
+
16
+ const url = prompt("Введите ссылку на изображение");
17
+ if (!url) return;
18
+
19
+ const img = new Image();
20
+ img.src = url;
21
+ img.onload = () => this.ctx.drawImage(img, x, y);
22
+
23
+ this.clearEvents(); // удаляем обработчики после использования
24
+ };
25
+
26
+ this.addListener("mousedown", handler);
27
+ }
12
28
 
13
29
  async onClickHandler(e: MouseEvent) {
14
30
  const target = e.target as HTMLCanvasElement;
package/src/tools/Text.ts CHANGED
@@ -7,19 +7,23 @@ export class TextTool extends Tool {
7
7
  }
8
8
 
9
9
  listen() {
10
- const handler = (e: MouseEvent) => {
11
- const target = e.target as HTMLCanvasElement;
12
- const x = e.pageX - target.offsetLeft;
13
- const y = e.pageY - target.offsetTop;
10
+ const handler = (e: Event) => {
11
+ const evt = e as MouseEvent; // приводим Event к MouseEvent
12
+ const canvas = evt.target as HTMLCanvasElement;
13
+ const x = evt.pageX - canvas.offsetLeft;
14
+ const y = evt.pageY - canvas.offsetTop;
15
+
14
16
  const text = prompt("Введите текст");
15
17
  if (text) {
16
18
  this.ctx.fillText(text, x, y);
17
19
  }
18
- // убираем событие после первого использования
19
- target.removeEventListener("mousedown", handler);
20
+
21
+ // удаляем обработчик после первого использования
22
+ this.clearEvents();
20
23
  };
21
- this.canvas.addEventListener("mousedown", handler);
22
- }
24
+
25
+ this.addListener("mousedown", handler);
26
+ }
23
27
 
24
28
  onClickHandler(e: MouseEvent) {
25
29
  const target = e.target as HTMLCanvasElement;
package/src/tools/Tool.ts CHANGED
@@ -1,12 +1,27 @@
1
1
  export default class Tool {
2
2
  constructor(public canvas: HTMLCanvasElement) {
3
3
  this.ctx = canvas.getContext("2d")!;
4
+ this.events = [];
4
5
  this.clearEvents();
5
6
  }
6
7
 
7
8
  ctx: CanvasRenderingContext2D;
9
+ events: Array<{ type: string; handler: EventListener }> = [];
10
+
11
+ // сохраняем слушатели, чтобы потом удалять
12
+ addListener(type: string, handler: EventListener) {
13
+ this.canvas.addEventListener(type, handler);
14
+ this.events.push({ type, handler });
15
+ }
8
16
 
9
17
  clearEvents() {
18
+ // удаляем все зарегистрированные слушатели
19
+ this.events.forEach(({ type, handler }) => {
20
+ this.canvas.removeEventListener(type, handler);
21
+ });
22
+ this.events = [];
23
+
24
+ // очищаем стандартные свойства
10
25
  this.canvas.onmousedown = null;
11
26
  this.canvas.onmouseup = null;
12
27
  this.canvas.onmousemove = null;