Skip to content

Commit

Permalink
feat(cache): tool settings support
Browse files Browse the repository at this point in the history
  • Loading branch information
EGRrqq committed Jan 28, 2024
1 parent b107b4b commit 4a42051
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 24 deletions.
19 changes: 17 additions & 2 deletions src/canvasController/canvasData/Data/ElementDataController.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { IStrokeSettings } from "../../tools/IStrokeTool";
import { IElement } from "./IElement";

interface IElementDataController {
export interface IElementDataController {
elementData: IElement;

onPointerDown: (x: number, y: number, type: string) => void;
Expand All @@ -13,6 +14,7 @@ interface IElementDataController {
// like: ToolData.remove({id: "ryue25jfeoirieogh"});
// static remove(id: string): void {}
export class ElementDataController implements IElementDataController {
#ctx: CanvasRenderingContext2D;
#captureFlag = false;

#id: string = "";
Expand All @@ -21,8 +23,12 @@ export class ElementDataController implements IElementDataController {
#x: number = 0;
#y: number = 0;
#lastPoint: [number, number] = [0, 0];
#settings: IStrokeSettings;

constructor(ctx: CanvasRenderingContext2D, settings: IStrokeSettings) {
this.#ctx = ctx;
this.#settings = settings;

constructor() {
this.#generateId(3);
}

Expand All @@ -34,6 +40,7 @@ export class ElementDataController implements IElementDataController {
x: this.#x,
y: this.#y,
lastPoint: this.#lastPoint,
settings: this.#settings,
};
}

Expand Down Expand Up @@ -61,6 +68,7 @@ export class ElementDataController implements IElementDataController {

onPointerUp = () => {
this.#captureFlag = false;
this.#assignSettings(this.#settings);

// set width/height
};
Expand All @@ -78,4 +86,11 @@ export class ElementDataController implements IElementDataController {
i++;
}
}

#assignSettings(settings: IStrokeSettings) {
for (let prop in settings) {
//@ts-ignore
settings[prop] = this.#ctx[prop];
}
}
}
4 changes: 3 additions & 1 deletion src/canvasController/canvasData/Data/IElement.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { IStrokeSettings } from "../../tools/IStrokeTool";

export interface IElement {
id: string;

Expand All @@ -14,7 +16,7 @@ export interface IElement {
points: [number, number][];
lastPoint: [number, number];

// settings: IElementSettings;
settings: IStrokeSettings;

// boundingRect help to set width and height values
// width?: number;
Expand Down
58 changes: 41 additions & 17 deletions src/canvasController/canvasData/cache/cacheController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,53 @@ import {
IData,
IElement,
} from "../Data";
import { IElementDataController } from "../Data/ElementDataController";

export interface ICacheController {
appData: IData;

mouseAttach(canvasEl: HTMLCanvasElement): void;
touchAttach(canvasEl: HTMLCanvasElement): void;
mouseAttach(ctx: CanvasRenderingContext2D): void;
touchAttach(ctx: CanvasRenderingContext2D): void;

iterateOverPoints: (points: IElement["points"]) => void;
iterateOverPoints: (
points: IElement["points"],
settings: IElement["settings"]
) => void;

storeDataElement: (element: IElement) => void;
clearDataElements: () => void;
}

export class CacheController implements ICacheController {
#elementDataController = new ElementDataController();
#elementDataController: IElementDataController;
#appDataController = new AppDataController();
#storageDataKey = "LittleNotes";

#toolsController: ITollsController;
#ctx: CanvasRenderingContext2D;

constructor(toolsController: ITollsController) {
constructor(
ctx: CanvasRenderingContext2D,
toolsController: ITollsController
) {
this.#ctx = ctx;
this.#toolsController = toolsController;

this.#elementDataController = new ElementDataController(
ctx,
toolsController.activeTool.settings
);

// also need to restore last element settings
this.#restoreDataElements();
}

mouseAttach(canvasEl: HTMLCanvasElement): void {
canvasEl.addEventListener("mousedown", (e: MouseEvent) => {
this.#elementDataController = new ElementDataController();
mouseAttach(): void {
this.#ctx.canvas.addEventListener("mousedown", (e: MouseEvent) => {
this.#elementDataController = new ElementDataController(
this.#ctx,
this.#toolsController.activeTool.settings
);

this.#elementDataController.onPointerDown(
e.clientX,
Expand All @@ -42,20 +60,23 @@ export class CacheController implements ICacheController {
);
});

canvasEl.addEventListener("mousemove", (e: MouseEvent) =>
this.#ctx.canvas.addEventListener("mousemove", (e: MouseEvent) =>
this.#elementDataController.onPointerMove(e.clientX, e.clientY)
);

canvasEl.addEventListener("mouseup", () => {
this.#ctx.canvas.addEventListener("mouseup", () => {
this.#elementDataController.onPointerUp();

this.storeDataElement(this.#elementDataController.elementData);
});
}

touchAttach(canvasEl: HTMLCanvasElement): void {
canvasEl.addEventListener("touchstart", (e: TouchEvent) => {
this.#elementDataController = new ElementDataController();
touchAttach(): void {
this.#ctx.canvas.addEventListener("touchstart", (e: TouchEvent) => {
this.#elementDataController = new ElementDataController(
this.#ctx,
this.#toolsController.activeTool.settings
);

this.#elementDataController.onPointerDown(
Math.round(e.touches[0].clientX),
Expand All @@ -64,29 +85,32 @@ export class CacheController implements ICacheController {
);
});

canvasEl.addEventListener("touchmove", (e: TouchEvent) =>
this.#ctx.canvas.addEventListener("touchmove", (e: TouchEvent) =>
this.#elementDataController.onPointerMove(
Math.round(e.touches[0].clientX),
Math.round(e.touches[0].clientY)
)
);

canvasEl.addEventListener("touchend", () => {
this.#ctx.canvas.addEventListener("touchend", () => {
this.#elementDataController.onPointerUp();

this.storeDataElement(this.#elementDataController.elementData);
});
}

iterateOverPoints = (points: IElement["points"]) => {
iterateOverPoints = (
points: IElement["points"],
settings: IElement["settings"]
) => {
for (let i = 0, length = points.length - 1; i < length; i++) {
let x0 = points[i][0];
let y0 = points[i][1];

let x1 = points[i + 1][0];
let y1 = points[i + 1][1];

this.#toolsController.activeTool.draw(x0, y0, x1, y1);
this.#toolsController.activeTool.draw(x0, y0, x1, y1, settings);
}
};

Expand Down
11 changes: 7 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,19 @@ if (boardController.ctx) {
touchController.attach();

// cache setup
const cacheController = new CacheController(toolsController);
const cacheController = new CacheController(
boardController.ctx,
toolsController
);

cacheController.mouseAttach(board);
cacheController.touchAttach(board);
cacheController.mouseAttach();
cacheController.touchAttach();

// canvas setup
function iterateOverData() {
for (let element of cacheController.appData.elements) {
boardController.moveOriginPointTo(element.x, element.y);
cacheController.iterateOverPoints(element.points);
cacheController.iterateOverPoints(element.points, element.settings);
boardController.resetOriginPoint(windowData.dpr);
}
}
Expand Down

0 comments on commit 4a42051

Please sign in to comment.