json / src /containers /Toolbar /ZoomMenu.tsx
xinnni's picture
Upload 146 files
f909d7c verified
import React from "react";
import { Menu, Flex, Input, Text } from "@mantine/core";
import { getHotkeyHandler, useHotkeys } from "@mantine/hooks";
import { CgChevronDown } from "react-icons/cg";
import useGraph from "src/store/useGraph";
import * as Styles from "./styles";
export const ZoomMenu = () => {
const zoomIn = useGraph(state => state.zoomIn);
const zoomOut = useGraph(state => state.zoomOut);
const centerView = useGraph(state => state.centerView);
const setZoomFactor = useGraph(state => state.setZoomFactor);
const zoomFactor = useGraph(state => state.viewPort?.zoomFactor || 1);
const [tempZoomValue, setTempZoomValue] = React.useState(zoomFactor);
React.useEffect(() => {
if (!Number.isNaN(zoomFactor)) setTempZoomValue(zoomFactor);
}, [zoomFactor]);
useHotkeys([
["shift+Digit0", () => setZoomFactor(100 / 100)],
["shift+Digit1", centerView],
]);
return (
<Menu shadow="md" trigger="click" closeOnItemClick={false} withArrow>
<Menu.Target>
<Styles.StyledToolElement>
<Flex gap={4} align="center">
{Math.round(zoomFactor * 100)}%
<CgChevronDown />
</Flex>
</Styles.StyledToolElement>
</Menu.Target>
<Menu.Dropdown>
<Menu.Item>
<Input
type="number"
value={Math.round(tempZoomValue * 100)}
onChange={e => setTempZoomValue(e.currentTarget.valueAsNumber / 100)}
onKeyDown={getHotkeyHandler([["Enter", () => setZoomFactor(tempZoomValue)]])}
size="xs"
rightSection="%"
/>
</Menu.Item>
<Menu.Item rightSection="+" onClick={zoomIn}>
<Text size="xs">Zoom in</Text>
</Menu.Item>
<Menu.Item rightSection="-" onClick={zoomOut}>
<Text size="xs">Zoom out</Text>
</Menu.Item>
<Menu.Item rightSection="⇧ 1" onClick={centerView}>
<Text size="xs">Zoom to fit</Text>
</Menu.Item>
<Menu.Item onClick={() => setZoomFactor(50 / 100)}>
<Text size="xs">Zoom to %50</Text>
</Menu.Item>
<Menu.Item rightSection="⇧ 0" onClick={() => setZoomFactor(100 / 100)}>
<Text size="xs">Zoom to %100</Text>
</Menu.Item>
<Menu.Item onClick={() => setZoomFactor(200 / 100)}>
<Text size="xs">Zoom to %200</Text>
</Menu.Item>
</Menu.Dropdown>
</Menu>
);
};