diff --git a/frontend/realtime/src/KonvaApp/Engine.ts b/frontend/realtime/src/KonvaApp/Engine.ts index f0d1fd182c..7be2a9ce05 100644 --- a/frontend/realtime/src/KonvaApp/Engine.ts +++ b/frontend/realtime/src/KonvaApp/Engine.ts @@ -366,7 +366,7 @@ export class Engine { // Listen to Toolbar Main uiEvents.toolbarMain.UNDO.onClick(() => this.undoStackManager.undo()); uiEvents.toolbarMain.REDO.onClick(() => this.undoStackManager.redo()); - + uiEvents.toolbarMain.SAVE.onClick(async (/*event*/) => { await this.realTimeDrawEngine.saveOutput(); @@ -400,8 +400,7 @@ export class Engine { this.addImage(image); }); - - + uiEvents.onAddTextToEngine((textdata) => { this.addText(textdata); }); @@ -432,7 +431,7 @@ export class Engine { } } }); - + uiEvents.promptEvents.onPromptStrengthChanged((strength) => { this.realTimeDrawEngine.currentStrength = strength; }); @@ -440,6 +439,11 @@ export class Engine { uiEvents.promptEvents.onPromptTextChanged((prompt) => { this.realTimeDrawEngine.currentPrompt = prompt; }); + + uiEvents.onAddShapeToEngine((shapeData) => { + // TODO: Do something with shapes + console.log("Shape Data", shapeData); + }) } disableAllButtons() { @@ -475,7 +479,7 @@ export class Engine { } // Sandbox is quickly a way to test your idea. - public async sandbox() {} + public async sandbox() { } public onMessage(event: MessageEvent) { console.log("Message From Shared Worker"); @@ -603,7 +607,7 @@ export class Engine { if ( longestVideoNode === undefined || node.videoComponent.duration > - longestVideoNode.videoComponent.duration + longestVideoNode.videoComponent.duration ) { longestVideoNode = node; } diff --git a/frontend/realtime/src/KonvaApp/NodesManagers/SelectionManager.ts b/frontend/realtime/src/KonvaApp/NodesManagers/SelectionManager.ts index b903add420..8a7858b66e 100644 --- a/frontend/realtime/src/KonvaApp/NodesManagers/SelectionManager.ts +++ b/frontend/realtime/src/KonvaApp/NodesManagers/SelectionManager.ts @@ -279,8 +279,10 @@ export class SelectionManager { } if (node instanceof TextNode) { showOrUpdate({ + // TODO: Add ID to identify/mutate the color? locked: node.isLocked(), buttonStates: getTextNodeButtonStates({ locked: node.isLocked() }), + color: node.getNodeData({ x: 0, y: 0 }).textNodeData?.color ?? "#000000", }); } if (node instanceof VideoNode) { diff --git a/frontend/realtime/src/KonvaApp/NodesManagers/ToolbarNodeUtilities.ts b/frontend/realtime/src/KonvaApp/NodesManagers/ToolbarNodeUtilities.ts index 8a33cb2611..9b82c82d5d 100644 --- a/frontend/realtime/src/KonvaApp/NodesManagers/ToolbarNodeUtilities.ts +++ b/frontend/realtime/src/KonvaApp/NodesManagers/ToolbarNodeUtilities.ts @@ -51,7 +51,8 @@ export function getImageNodeButtonStates( buttonName === ButtonNames.AI_STYLIZE || buttonName === ButtonNames.SEGMENTATION || buttonName === ButtonNames.DOWNLOAD || - buttonName === ButtonNames.CHROMA + buttonName === ButtonNames.CHROMA || + buttonName === ButtonNames.COLOR ) { buttonStates[buttonName] = { disabled: true, @@ -130,7 +131,9 @@ export function getVideoNodeButtonStates( return buttonStates; } // soon to come feature is disabled - if (buttonName === ButtonNames.AI_STYLIZE) { + if (buttonName === ButtonNames.AI_STYLIZE || + buttonName === ButtonNames.COLOR + ) { buttonStates[buttonName] = { disabled: true, hidden: true, @@ -170,7 +173,8 @@ export function getMultiSelectButtonStates( buttonName === ButtonNames.AI_STYLIZE || buttonName === ButtonNames.SEGMENTATION || buttonName === ButtonNames.DOWNLOAD || - buttonName === ButtonNames.CHROMA + buttonName === ButtonNames.CHROMA || + buttonName === ButtonNames.COLOR ) { buttonStates[buttonName] = { disabled: true, diff --git a/frontend/realtime/src/KonvaRootComponent/ContextualToolbarNode.tsx b/frontend/realtime/src/KonvaRootComponent/ContextualToolbarNode.tsx index 5a362ade64..16d32a0c0d 100644 --- a/frontend/realtime/src/KonvaRootComponent/ContextualToolbarNode.tsx +++ b/frontend/realtime/src/KonvaRootComponent/ContextualToolbarNode.tsx @@ -71,6 +71,8 @@ export const ContextualToolbarNode = () => { onLockClicked={(e) => { dispatchUiEvents.toolbarNode.lock(e); }} + color={uiAccess.toolbarNode.signal.value.color} + onColorChange={(color) => { uiAccess.toolbarNode.setColor(color) }} /> ); diff --git a/frontend/realtime/src/KonvaRootComponent/SignaledToolbarMain.tsx b/frontend/realtime/src/KonvaRootComponent/SignaledToolbarMain.tsx index b9a546eb6d..633687fcb7 100644 --- a/frontend/realtime/src/KonvaRootComponent/SignaledToolbarMain.tsx +++ b/frontend/realtime/src/KonvaRootComponent/SignaledToolbarMain.tsx @@ -12,6 +12,7 @@ import { LayoutSignalType } from "./contextSignals/layout"; import { AppUiContextInterface } from "./contextSignals/appUi"; import { twMerge } from "tailwind-merge"; import { paperWrapperStyles } from "~/components/styles"; +import { dispatchUiEvents } from "~/signals"; export const SignaledToolbarMain = ({ // layoutSignal, @@ -43,6 +44,12 @@ export const SignaledToolbarMain = ({ return () => appUiContext.openAddImage(); case ToolbarMainButtonNames.ADD_VIDEO: return () => appUiContext.openAddVideo(); + case ToolbarMainButtonNames.ADD_CIRCLE: + return () => dispatchUiEvents.addShapeToEngine({ shape: "circle" }); + case ToolbarMainButtonNames.ADD_TRIANGLE: + return () => dispatchUiEvents.addShapeToEngine({ shape: "triangle" }); + case ToolbarMainButtonNames.ADD_SQUARE: + return () => dispatchUiEvents.addShapeToEngine({ shape: "square" }); default: return dispatchers[buttonName]; } diff --git a/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx b/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx index 28e1401756..ef88aed47a 100644 --- a/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx +++ b/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx @@ -5,13 +5,17 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faArrowRotateLeft, faArrowRotateRight, + faCircle, faFilePlus, faFilm, faFloppyDisk, faImage, faLocationArrow, faMagicWandSparkles, + faShapes, + faSquare, faText, + faTriangle, } from "@fortawesome/pro-solid-svg-icons"; import { ToolbarButton } from "../ToolbarButton"; @@ -41,7 +45,7 @@ export const ToolbarMain = ({ "flex w-fit items-center divide-x divide-ui-border", paperWrapperStyles, disabled && - "pointer-events-none cursor-default bg-ui-border shadow-md", + "pointer-events-none cursor-default bg-ui-border shadow-md", )} >