2021-11-16 16:01:29 +00:00
|
|
|
import * as React from 'react'
|
|
|
|
import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
|
2021-11-19 10:19:06 +00:00
|
|
|
import { Panel } from '~components/Primitives/Panel'
|
|
|
|
import { ToolButton } from '~components/Primitives/ToolButton'
|
2021-11-16 16:01:29 +00:00
|
|
|
import { TDShapeType, TDToolType } from '~types'
|
|
|
|
import { useTldrawApp } from '~hooks'
|
|
|
|
import { SquareIcon, CircleIcon } from '@radix-ui/react-icons'
|
2021-11-19 10:19:06 +00:00
|
|
|
import { Tooltip } from '~components/Primitives/Tooltip'
|
2021-11-22 12:28:56 +00:00
|
|
|
import { LineIcon } from '~components/Primitives/icons'
|
2021-11-16 16:01:29 +00:00
|
|
|
|
|
|
|
interface ShapesMenuProps {
|
|
|
|
activeTool: TDToolType
|
|
|
|
isToolLocked: boolean
|
|
|
|
}
|
|
|
|
|
2021-11-22 12:28:56 +00:00
|
|
|
type ShapeShape = TDShapeType.Rectangle | TDShapeType.Ellipse | TDShapeType.Line
|
|
|
|
const shapeShapes: ShapeShape[] = [TDShapeType.Rectangle, TDShapeType.Ellipse, TDShapeType.Line]
|
2021-11-16 16:01:29 +00:00
|
|
|
const shapeShapeIcons = {
|
|
|
|
[TDShapeType.Rectangle]: <SquareIcon />,
|
|
|
|
[TDShapeType.Ellipse]: <CircleIcon />,
|
2021-11-22 12:28:56 +00:00
|
|
|
[TDShapeType.Line]: <LineIcon />,
|
2021-11-16 16:01:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export const ShapesMenu = React.memo(function ShapesMenu({
|
|
|
|
activeTool,
|
|
|
|
isToolLocked,
|
|
|
|
}: ShapesMenuProps) {
|
|
|
|
const app = useTldrawApp()
|
|
|
|
|
|
|
|
const [lastActiveTool, setLastActiveTool] = React.useState<ShapeShape>(TDShapeType.Rectangle)
|
|
|
|
|
|
|
|
React.useEffect(() => {
|
|
|
|
if (shapeShapes.includes(activeTool as ShapeShape) && lastActiveTool !== activeTool) {
|
|
|
|
setLastActiveTool(activeTool as ShapeShape)
|
|
|
|
}
|
|
|
|
}, [activeTool])
|
|
|
|
|
|
|
|
const selectShapeTool = React.useCallback(() => {
|
|
|
|
app.selectTool(lastActiveTool)
|
|
|
|
}, [activeTool, app])
|
|
|
|
|
|
|
|
const handleDoubleClick = React.useCallback(() => {
|
|
|
|
app.toggleToolLock()
|
|
|
|
}, [app])
|
|
|
|
|
|
|
|
const isActive = shapeShapes.includes(activeTool as ShapeShape)
|
|
|
|
|
|
|
|
return (
|
|
|
|
<DropdownMenu.Root dir="ltr" onOpenChange={selectShapeTool}>
|
|
|
|
<DropdownMenu.Trigger dir="ltr" asChild>
|
|
|
|
<ToolButton
|
|
|
|
variant="primary"
|
|
|
|
onDoubleClick={handleDoubleClick}
|
|
|
|
isToolLocked={isActive && isToolLocked}
|
|
|
|
isActive={isActive}
|
|
|
|
>
|
|
|
|
{shapeShapeIcons[lastActiveTool]}
|
|
|
|
</ToolButton>
|
|
|
|
</DropdownMenu.Trigger>
|
|
|
|
<DropdownMenu.Content asChild dir="ltr" side="top" sideOffset={12}>
|
|
|
|
<Panel side="center">
|
|
|
|
{shapeShapes.map((shape, i) => (
|
|
|
|
<Tooltip
|
|
|
|
key={shape}
|
|
|
|
label={shape[0].toUpperCase() + shape.slice(1)}
|
|
|
|
kbd={(4 + i).toString()}
|
|
|
|
>
|
|
|
|
<DropdownMenu.Item asChild>
|
|
|
|
<ToolButton
|
|
|
|
variant="primary"
|
|
|
|
onClick={() => {
|
|
|
|
app.selectTool(shape)
|
|
|
|
setLastActiveTool(shape)
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{shapeShapeIcons[shape]}
|
|
|
|
</ToolButton>
|
|
|
|
</DropdownMenu.Item>
|
|
|
|
</Tooltip>
|
|
|
|
))}
|
|
|
|
</Panel>
|
|
|
|
</DropdownMenu.Content>
|
|
|
|
</DropdownMenu.Root>
|
|
|
|
)
|
|
|
|
})
|