canvas-react-easy 1.0.5 → 1.0.7

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.
@@ -7,11 +7,17 @@ import { Circle } from "../tools/Circle";
7
7
  import { TextTool } from "../tools/Text";
8
8
  import { ImageTool } from "../tools/ImageTool";
9
9
  const Tools = () => {
10
- const selectBrush = () => CanvasState.canvas && toolState.setTool(new Brush(CanvasState.canvas));
11
- const selectRectangle = () => CanvasState.canvas && toolState.setTool(new Rectangle(CanvasState.canvas));
12
- const selectCircle = () => CanvasState.canvas && toolState.setTool(new Circle(CanvasState.canvas));
13
- const selectText = () => CanvasState.canvas && toolState.setTool(new TextTool(CanvasState.canvas));
14
- const selectImage = () => CanvasState.canvas && toolState.setTool(new ImageTool(CanvasState.canvas));
15
- return (_jsxs("div", { style: { marginBottom: "10px" }, children: [_jsx("button", { onClick: selectBrush, children: "\u041A\u0438\u0441\u0442\u044C" }), _jsx("button", { onClick: selectRectangle, children: "\u041F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A" }), _jsx("button", { onClick: selectCircle, children: "\u041A\u0440\u0443\u0433" }), _jsx("button", { onClick: selectText, children: "\u0422\u0435\u043A\u0441\u0442" }), _jsx("button", { onClick: selectImage, children: "\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435" })] }));
10
+ const selectTool = (ToolClass) => {
11
+ var _a, _b;
12
+ if (!CanvasState.canvas)
13
+ return;
14
+ // очищаем старый инструмент
15
+ (_a = toolState.tool) === null || _a === void 0 ? void 0 : _a.clearEvents();
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);
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" })] }));
16
22
  };
17
23
  export default Tools;
@@ -14,7 +14,22 @@ 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 canvas = e.target;
19
+ const x = e.pageX - canvas.offsetLeft;
20
+ const y = e.pageY - canvas.offsetTop;
21
+ const url = prompt("Введите ссылку на изображение");
22
+ if (!url)
23
+ return;
24
+ const img = new Image();
25
+ img.src = url;
26
+ img.onload = () => {
27
+ this.ctx.drawImage(img, x, y);
28
+ };
29
+ // удаляем обработчик после первого использования
30
+ canvas.removeEventListener("mousedown", handler);
31
+ };
32
+ this.canvas.addEventListener("mousedown", handler);
18
33
  }
19
34
  onClickHandler(e) {
20
35
  return __awaiter(this, void 0, void 0, function* () {
@@ -5,7 +5,18 @@ export class TextTool extends Tool {
5
5
  this.listen();
6
6
  }
7
7
  listen() {
8
- this.canvas.onclick = this.onClickHandler.bind(this);
8
+ const handler = (e) => {
9
+ const target = e.target;
10
+ const x = e.pageX - target.offsetLeft;
11
+ const y = e.pageY - target.offsetTop;
12
+ const text = prompt("Введите текст");
13
+ if (text) {
14
+ this.ctx.fillText(text, x, y);
15
+ }
16
+ // убираем событие после первого использования
17
+ target.removeEventListener("mousedown", handler);
18
+ };
19
+ this.canvas.addEventListener("mousedown", handler);
9
20
  }
10
21
  onClickHandler(e) {
11
22
  const target = e.target;
@@ -1,15 +1,12 @@
1
1
  export default class Tool {
2
2
  constructor(canvas) {
3
3
  this.canvas = canvas;
4
- const context = canvas.getContext("2d");
5
- if (!context)
6
- throw new Error("Canvas context is null");
7
- this.ctx = context;
8
- this.destroyEvents();
4
+ this.ctx = canvas.getContext("2d");
5
+ this.clearEvents();
9
6
  }
10
- destroyEvents() {
11
- this.canvas.onmousemove = null;
7
+ clearEvents() {
12
8
  this.canvas.onmousedown = null;
13
9
  this.canvas.onmouseup = null;
10
+ this.canvas.onmousemove = null;
14
11
  }
15
12
  }
@@ -1,6 +1,6 @@
1
1
  export default class Tool {
2
2
  canvas: HTMLCanvasElement;
3
- ctx: CanvasRenderingContext2D;
4
3
  constructor(canvas: HTMLCanvasElement);
5
- destroyEvents(): void;
4
+ ctx: CanvasRenderingContext2D;
5
+ clearEvents(): void;
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "canvas-react-easy",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "license": "MIT",
@@ -8,19 +8,28 @@ import { TextTool } from "../tools/Text";
8
8
  import { ImageTool } from "../tools/ImageTool";
9
9
 
10
10
  const Tools = () => {
11
- const selectBrush = () => CanvasState.canvas && toolState.setTool(new Brush(CanvasState.canvas));
12
- const selectRectangle = () => CanvasState.canvas && toolState.setTool(new Rectangle(CanvasState.canvas));
13
- const selectCircle = () => CanvasState.canvas && toolState.setTool(new Circle(CanvasState.canvas));
14
- const selectText = () => CanvasState.canvas && toolState.setTool(new TextTool(CanvasState.canvas));
15
- const selectImage = () => CanvasState.canvas && toolState.setTool(new ImageTool(CanvasState.canvas));
16
11
 
12
+ const selectTool = (ToolClass: any) => {
13
+ if (!CanvasState.canvas) return;
14
+
15
+ // очищаем старый инструмент
16
+ toolState.tool?.clearEvents();
17
+
18
+ // создаём новый инструмент и подключаем слушатели
19
+ const tool = new ToolClass(CanvasState.canvas);
20
+ tool.listen?.(); // если инструмент имеет метод listen
21
+ toolState.setTool(tool);
22
+ };
23
+
24
+
17
25
  return (
18
26
  <div style={{ marginBottom: "10px" }}>
19
- <button onClick={selectBrush}>Кисть</button>
20
- <button onClick={selectRectangle}>Прямоугольник</button>
21
- <button onClick={selectCircle}>Круг</button>
22
- <button onClick={selectText}>Текст</button>
23
- <button onClick={selectImage}>Изображение</button>
27
+ <button onClick={() => selectTool(Brush)}>Кисть</button>
28
+ <button onClick={() => selectTool(Rectangle)}>Прямоугольник</button>
29
+ <button onClick={() => selectTool(Circle)}>Круг</button>
30
+ <button onClick={() => selectTool(TextTool)}>Текст</button>
31
+ <button onClick={() => selectTool(ImageTool)}>Изображение</button>
32
+
24
33
  </div>
25
34
  );
26
35
  };
@@ -7,8 +7,26 @@ 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: MouseEvent) => {
11
+ const canvas = e.target as HTMLCanvasElement;
12
+ const x = e.pageX - canvas.offsetLeft;
13
+ const y = e.pageY - canvas.offsetTop;
14
+
15
+ const url = prompt("Введите ссылку на изображение");
16
+ if (!url) return;
17
+
18
+ const img = new Image();
19
+ img.src = url;
20
+ img.onload = () => {
21
+ this.ctx.drawImage(img, x, y);
22
+ };
23
+
24
+ // удаляем обработчик после первого использования
25
+ canvas.removeEventListener("mousedown", handler);
26
+ };
27
+
28
+ this.canvas.addEventListener("mousedown", handler);
29
+ }
12
30
 
13
31
  async onClickHandler(e: MouseEvent) {
14
32
  const target = e.target as HTMLCanvasElement;
package/src/tools/Text.ts CHANGED
@@ -7,7 +7,18 @@ export class TextTool extends Tool {
7
7
  }
8
8
 
9
9
  listen() {
10
- this.canvas.onclick = this.onClickHandler.bind(this);
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;
14
+ const text = prompt("Введите текст");
15
+ if (text) {
16
+ this.ctx.fillText(text, x, y);
17
+ }
18
+ // убираем событие после первого использования
19
+ target.removeEventListener("mousedown", handler);
20
+ };
21
+ this.canvas.addEventListener("mousedown", handler);
11
22
  }
12
23
 
13
24
  onClickHandler(e: MouseEvent) {
package/src/tools/Tool.ts CHANGED
@@ -1,19 +1,14 @@
1
1
  export default class Tool {
2
- canvas: HTMLCanvasElement;
3
- ctx: CanvasRenderingContext2D;
4
-
5
- constructor(canvas: HTMLCanvasElement) {
6
- this.canvas = canvas;
7
- const context = canvas.getContext("2d");
8
- if (!context) throw new Error("Canvas context is null");
9
- this.ctx = context;
10
- this.destroyEvents();
11
- }
12
-
13
- destroyEvents() {
14
- this.canvas.onmousemove = null;
2
+ constructor(public canvas: HTMLCanvasElement) {
3
+ this.ctx = canvas.getContext("2d")!;
4
+ this.clearEvents();
5
+ }
6
+
7
+ ctx: CanvasRenderingContext2D;
8
+
9
+ clearEvents() {
15
10
  this.canvas.onmousedown = null;
16
11
  this.canvas.onmouseup = null;
17
- }
12
+ this.canvas.onmousemove = null;
18
13
  }
19
-
14
+ }