TableElementOperate.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { useMemo } from 'react';
  2. import { useCanvasStore } from '@/lib/store';
  3. import type { PPTTableElement } from '@/lib/types/slides';
  4. import type { OperateResizeHandlers } from '@/lib/types/edit';
  5. import { useCommonOperate } from '../hooks/useCommonOperate';
  6. import { RotateHandler } from './RotateHandler';
  7. import { ResizeHandler } from './ResizeHandler';
  8. import { BorderLine } from './BorderLine';
  9. interface TableElementOperateProps {
  10. readonly elementInfo: PPTTableElement;
  11. readonly handlerVisible: boolean;
  12. readonly rotateElement: (e: React.MouseEvent, element: PPTTableElement) => void;
  13. readonly scaleElement: (
  14. e: React.MouseEvent,
  15. element: PPTTableElement,
  16. command: OperateResizeHandlers,
  17. ) => void;
  18. }
  19. export function TableElementOperate({
  20. elementInfo,
  21. handlerVisible,
  22. rotateElement,
  23. scaleElement,
  24. }: TableElementOperateProps) {
  25. const canvasScale = useCanvasStore.use.canvasScale();
  26. const outlineWidth = useMemo(() => elementInfo.outline.width || 1, [elementInfo.outline.width]);
  27. const scaleWidth = useMemo(
  28. () => (elementInfo.width + outlineWidth) * canvasScale,
  29. [elementInfo.width, outlineWidth, canvasScale],
  30. );
  31. const scaleHeight = useMemo(
  32. () => elementInfo.height * canvasScale,
  33. [elementInfo.height, canvasScale],
  34. );
  35. const { resizeHandlers, borderLines } = useCommonOperate(scaleWidth, scaleHeight);
  36. return (
  37. <div className="table-element-operate">
  38. {borderLines.map((line) => (
  39. <BorderLine
  40. key={line.type}
  41. type={line.type}
  42. style={line.style}
  43. className="operate-border-line"
  44. />
  45. ))}
  46. {handlerVisible && (
  47. <>
  48. {resizeHandlers.map((point) => (
  49. <ResizeHandler
  50. key={point.direction}
  51. type={point.direction}
  52. rotate={elementInfo.rotate}
  53. style={point.style}
  54. className="operate-resize-handler"
  55. onMouseDown={(e) => {
  56. e.stopPropagation();
  57. scaleElement(e, elementInfo, point.direction);
  58. }}
  59. />
  60. ))}
  61. <RotateHandler
  62. className="operate-rotate-handler"
  63. style={{ left: scaleWidth / 2 + 'px' }}
  64. onMouseDown={(e) => {
  65. e.stopPropagation();
  66. rotateElement(e, elementInfo);
  67. }}
  68. />
  69. </>
  70. )}
  71. </div>
  72. );
  73. }