diff options
Diffstat (limited to 'packages/excalidraw/element/ElementCanvasButtons.tsx')
| -rw-r--r-- | packages/excalidraw/element/ElementCanvasButtons.tsx | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/packages/excalidraw/element/ElementCanvasButtons.tsx b/packages/excalidraw/element/ElementCanvasButtons.tsx new file mode 100644 index 0000000..1bcad97 --- /dev/null +++ b/packages/excalidraw/element/ElementCanvasButtons.tsx @@ -0,0 +1,63 @@ +import type { AppState } from "../types"; +import { sceneCoordsToViewportCoords } from "../utils"; +import type { ElementsMap, NonDeletedExcalidrawElement } from "./types"; +import { getElementAbsoluteCoords } from "."; +import { useExcalidrawAppState } from "../components/App"; + +import "./ElementCanvasButtons.scss"; + +const CONTAINER_PADDING = 5; + +const getContainerCoords = ( + element: NonDeletedExcalidrawElement, + appState: AppState, + elementsMap: ElementsMap, +) => { + const [x1, y1] = getElementAbsoluteCoords(element, elementsMap); + const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords( + { sceneX: x1 + element.width, sceneY: y1 }, + appState, + ); + const x = viewportX - appState.offsetLeft + 10; + const y = viewportY - appState.offsetTop; + return { x, y }; +}; + +export const ElementCanvasButtons = ({ + children, + element, + elementsMap, +}: { + children: React.ReactNode; + element: NonDeletedExcalidrawElement; + elementsMap: ElementsMap; +}) => { + const appState = useExcalidrawAppState(); + + if ( + appState.contextMenu || + appState.newElement || + appState.resizingElement || + appState.isRotating || + appState.openMenu || + appState.viewModeEnabled + ) { + return null; + } + + const { x, y } = getContainerCoords(element, appState, elementsMap); + + return ( + <div + className="excalidraw-canvas-buttons" + style={{ + top: `${y}px`, + left: `${x}px`, + // width: CONTAINER_WIDTH, + padding: CONTAINER_PADDING, + }} + > + {children} + </div> + ); +}; |
