drawDB/src/components/control_panel.jsx

195 lines
6.8 KiB
React
Raw Normal View History

2023-09-19 20:47:16 +08:00
import { React, useState } from "react";
2023-09-19 20:47:50 +08:00
import {menu} from "../data/data";
2023-09-19 20:47:16 +08:00
import {
IconCaretUp,
IconCaretDown,
IconRight,
} from "@arco-design/web-react/icon";
2023-09-19 20:47:15 +08:00
import "@arco-design/web-react/dist/css/arco.css";
2023-09-19 20:46:48 +08:00
export default function ControlPanel() {
2023-09-19 20:47:16 +08:00
let cursor = 0;
const iota = (restart = false) => {
const temp = cursor;
cursor++;
return temp;
};
const Tool = {
TOOLBAR: iota(),
ZOOM: iota(),
UNDO: iota(),
REDO: iota(),
ADD: iota(),
COUNT: iota(),
};
const [showToolBar, setShowToolBar] = useState(true);
const [openZoom, setOpenZoom] = useState(false);
const [openAdd, setOpenAdd] = useState(false);
const invert = (e, tool) => {
switch (tool) {
case Tool.TOOLBAR:
setShowToolBar((prev) => !prev);
break;
case Tool.ZOOM:
setOpenZoom((prev) => !prev);
2023-09-19 20:47:17 +08:00
setOpenAdd(false);
2023-09-19 20:47:16 +08:00
break;
case Tool.ADD:
setOpenAdd((prev) => !prev);
2023-09-19 20:47:17 +08:00
setOpenZoom(false);
2023-09-19 20:47:16 +08:00
break;
default:
break;
}
};
2023-09-19 20:46:48 +08:00
return (
2023-09-19 20:47:15 +08:00
<nav className="bg-gray-200 relative">
2023-09-19 20:46:48 +08:00
<div className="flex justify-between items-center">
2023-09-19 20:47:15 +08:00
<ul className="flex justify-start text-md ms-3 select-none relative">
{Object.keys(menu).map((category) => (
<div key={category}>
2023-09-19 20:47:16 +08:00
<div className="peer px-3 py-1 bg-gray-200 hover:bg-gray-300 relative z-50">
2023-09-19 20:47:15 +08:00
{category}
</div>
2023-09-19 20:47:16 +08:00
<ul className="hidden peer-hover:flex hover:flex w-[200px] flex-col bg-white drop-shadow-lg absolute z-50">
2023-09-19 20:47:15 +08:00
{Object.keys(menu[category]).map((item, index) => {
if (menu[category][item].length > 0) {
return (
<div
key={index}
2023-09-19 20:47:16 +08:00
className="group relative px-5 py-3 hover:bg-gray-200 z-50"
2023-09-19 20:47:15 +08:00
>
<div className="flex justify-between items-center">
<li>{item}</li>
<IconRight />
</div>
2023-09-19 20:47:16 +08:00
<ul className="hidden group-hover:flex hover:flex w-[200px] flex-col bg-white drop-shadow-lg absolute z-50 top-0 left-full">
2023-09-19 20:47:15 +08:00
{menu[category][item].map((e) => (
<li
key={e}
2023-09-19 20:47:16 +08:00
className="px-5 py-3 hover:bg-gray-200 z-50"
2023-09-19 20:47:15 +08:00
>
{e}
</li>
))}
</ul>
</div>
);
}
return (
<li
2023-09-19 20:47:16 +08:00
className="px-5 py-3 hover:bg-gray-200 relative z-50"
2023-09-19 20:47:15 +08:00
key={index}
>
{item}
</li>
);
})}
</ul>
</div>
))}
2023-09-19 20:46:48 +08:00
</ul>
2023-09-19 20:47:16 +08:00
<button onClick={(e) => invert(e, Tool.TOOLBAR)} className="me-3">
{showToolBar ? <IconCaretUp /> : <IconCaretDown />}
2023-09-19 20:46:48 +08:00
</button>
</div>
2023-09-19 20:47:16 +08:00
{showToolBar && (
<div className="p-1 flex justify-start items-center">
<div className="relative">
<button
className="ms-2 py-2 px-3 hover:bg-gray-300 relative"
onClick={(e) => invert(e, Tool.ZOOM)}
>
zoom <IconCaretDown />
</button>
<ul
className={`${
openZoom ? "" : "hidden"
} w-[200px] flex-col drop-shadow-lg bg-white py-1 ms-2 absolute z-20 top-full`}
>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Fit window
</li>
<hr />
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">25%</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">50%</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">75%</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
100%
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
125%
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
150%
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
175%
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
200%
</li>
<hr />
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Custom
</li>
</ul>
</div>
<button className="py-1 px-2 hover:bg-gray-300" title="Zoom in">
<i className="fa-solid fa-magnifying-glass-plus"></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Zoom out">
<i className="fa-solid fa-magnifying-glass-minus"></i>
</button>
2023-09-19 20:47:17 +08:00
<button className="py-1 px-2 hover:bg-gray-300" title="Undo">
2023-09-19 20:47:16 +08:00
<i className="fa-solid fa-rotate-left "></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Redo">
<i className="fa-solid fa-rotate-right"></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Edit">
<i className="fa-solid fa-pen-to-square"></i>
</button>
<div className="relative">
<button
className="py-1 px-2 hover:bg-gray-300 relative"
title="Add"
onClick={(e) => invert(e, Tool.ADD)}
>
2023-09-19 20:47:24 +08:00
<i className="fa-solid fa-plus"></i> <IconCaretDown />
2023-09-19 20:47:16 +08:00
</button>
<ul
className={`${
openAdd ? "" : "hidden"
} w-[200px] flex-col drop-shadow-lg bg-white py-1 absolute z-20 top-full`}
>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Table
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Relationship
</li>
<li className="px-5 py-3 hover:bg-gray-200 relative z-20">
Note
</li>
</ul>
</div>
<button className="py-1 px-2 hover:bg-gray-300" title="Delete">
<i className="fa-solid fa-trash"></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Move">
<i className="fa-regular fa-hand"></i>
</button>
<button className="py-1 px-2 hover:bg-gray-300" title="Commit">
<i className="fa-solid fa-code-commit"></i>
</button>
</div>
)}
2023-09-19 20:46:48 +08:00
</nav>
);
}