diff --git a/frontend/realtime/src/KonvaApp/constants.ts b/frontend/realtime/src/KonvaApp/constants.ts index 2acee38532..79e10cbae9 100644 --- a/frontend/realtime/src/KonvaApp/constants.ts +++ b/frontend/realtime/src/KonvaApp/constants.ts @@ -2,6 +2,8 @@ export enum AppModes { INIT = "INIT", PREVIEW = "PREVIEW", SELECT = "SELECT", + PAINT = "PAINT", + ERASER = "ERASER", RENDERING = "RENDERING", } diff --git a/frontend/realtime/src/KonvaRootComponent/SignaledToolbarMain.tsx b/frontend/realtime/src/KonvaRootComponent/SignaledToolbarMain.tsx index 2bb107ca1b..f3baac309e 100644 --- a/frontend/realtime/src/KonvaRootComponent/SignaledToolbarMain.tsx +++ b/frontend/realtime/src/KonvaRootComponent/SignaledToolbarMain.tsx @@ -50,6 +50,10 @@ export const SignaledToolbarMain = ({ return () => dispatchUiEvents.addShapeToEngine({ shape: "triangle" }); case ToolbarMainButtonNames.ADD_SQUARE: return () => dispatchUiEvents.addShapeToEngine({ shape: "square" }); + case ToolbarMainButtonNames.SELECT: + case ToolbarMainButtonNames.ERASER: + case ToolbarMainButtonNames.PAINT: + return (e: React.MouseEvent) => { toolbarMain.setMode(buttonName); dispatchers[buttonName](e); }; default: return dispatchers[buttonName]; } diff --git a/frontend/realtime/src/signals/uiAccess/toolbarMain/toolbarMain.ts b/frontend/realtime/src/signals/uiAccess/toolbarMain/toolbarMain.ts index 28ba56f36f..0a6c0911ee 100644 --- a/frontend/realtime/src/signals/uiAccess/toolbarMain/toolbarMain.ts +++ b/frontend/realtime/src/signals/uiAccess/toolbarMain/toolbarMain.ts @@ -1,5 +1,6 @@ import { signal } from "@preact/signals-react"; import { ToolbarMainButtonNames } from "~/components/features/ToolbarMain/enum"; +import { isToolbarMode } from "~/signals/uiEvents/toolbarMain/toolbarMain"; interface ToolbarMainSignalInterface { disabled: boolean; @@ -42,6 +43,17 @@ export const toolbarMain = { }, }; }, + + setMode(mode: ToolbarMainButtonNames) { + if (!isToolbarMode(mode)) { + return; + } + + this.changeButtonState(ToolbarMainButtonNames.SELECT, { active: false }); + this.changeButtonState(ToolbarMainButtonNames.ERASER, { active: false }); + this.changeButtonState(ToolbarMainButtonNames.PAINT, { active: false }); + this.changeButtonState(mode, { active: true }); + } }; function initButtonStates() { diff --git a/frontend/realtime/src/signals/uiEvents/toolbarMain/toolbarMain.ts b/frontend/realtime/src/signals/uiEvents/toolbarMain/toolbarMain.ts index 10a97a5ff2..60092475e9 100644 --- a/frontend/realtime/src/signals/uiEvents/toolbarMain/toolbarMain.ts +++ b/frontend/realtime/src/signals/uiEvents/toolbarMain/toolbarMain.ts @@ -2,6 +2,7 @@ import { MouseEventHandler } from "react"; import { signal, effect, Signal } from "@preact/signals-react"; import { ToolbarMainButtonNames } from "~/components/features/ToolbarMain/enum"; +import { AppModes } from "~/KonvaApp/constants"; const events = Object.values(ToolbarMainButtonNames).reduce( (acc, buttonName) => { @@ -25,22 +26,35 @@ const effectsCleanups = Object.values(ToolbarMainButtonNames).reduce( [key in ToolbarMainButtonNames]: (() => void) | undefined; }, ); + +export const isToolbarMode = (buttonName: ToolbarMainButtonNames) => { + return appModeMap[buttonName] !== undefined; +} + +export const appModeMap: Record = { + [ToolbarMainButtonNames.SELECT]: AppModes.SELECT, + [ToolbarMainButtonNames.ERASER]: AppModes.ERASER, + [ToolbarMainButtonNames.PAINT]: AppModes.PAINT, +} + +const defaultHandler = (buttonName: ToolbarMainButtonNames, callback: MouseEventHandler) => { + if (effectsCleanups[buttonName]) { + effectsCleanups[buttonName](); + } + effectsCleanups[buttonName] = effect(() => { + if (events[buttonName].value) { + callback(events[buttonName].value); + events[buttonName].value = undefined; + } + }); +} + export const buttonEventsHandlers = Object.values( ToolbarMainButtonNames, ).reduce( (acc, buttonName) => { acc[buttonName] = { - onClick: (callback: MouseEventHandler) => { - if (effectsCleanups[buttonName]) { - effectsCleanups[buttonName](); - } - effectsCleanups[buttonName] = effect(() => { - if (events[buttonName].value) { - callback(events[buttonName].value); - events[buttonName].value = undefined; - } - }); - }, + onClick: (callback: MouseEventHandler) => { defaultHandler(buttonName, callback) }, }; return acc; },