actionLinearEditor.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { DEFAULT_CATEGORIES } from "../components/CommandPalette/CommandPalette";
  2. import { LinearElementEditor } from "../element/linearElementEditor";
  3. import { isLinearElement } from "../element/typeChecks";
  4. import { ExcalidrawLinearElement } from "../element/types";
  5. import { StoreAction } from "../store";
  6. import { register } from "./register";
  7. import { ToolButton } from "../components/ToolButton";
  8. import { t } from "../i18n";
  9. import { lineEditorIcon } from "../components/icons";
  10. export const actionToggleLinearEditor = register({
  11. name: "toggleLinearEditor",
  12. category: DEFAULT_CATEGORIES.elements,
  13. label: (elements, appState, app) => {
  14. const selectedElement = app.scene.getSelectedElements({
  15. selectedElementIds: appState.selectedElementIds,
  16. })[0] as ExcalidrawLinearElement | undefined;
  17. return selectedElement?.type === "arrow"
  18. ? "labels.lineEditor.editArrow"
  19. : "labels.lineEditor.edit";
  20. },
  21. keywords: ["line"],
  22. trackEvent: {
  23. category: "element",
  24. },
  25. predicate: (elements, appState, _, app) => {
  26. const selectedElements = app.scene.getSelectedElements(appState);
  27. if (
  28. !appState.editingLinearElement &&
  29. selectedElements.length === 1 &&
  30. isLinearElement(selectedElements[0])
  31. ) {
  32. return true;
  33. }
  34. return false;
  35. },
  36. perform(elements, appState, _, app) {
  37. const selectedElement = app.scene.getSelectedElements({
  38. selectedElementIds: appState.selectedElementIds,
  39. includeBoundTextElement: true,
  40. })[0] as ExcalidrawLinearElement;
  41. const editingLinearElement =
  42. appState.editingLinearElement?.elementId === selectedElement.id
  43. ? null
  44. : new LinearElementEditor(selectedElement);
  45. return {
  46. appState: {
  47. ...appState,
  48. editingLinearElement,
  49. },
  50. storeAction: StoreAction.CAPTURE,
  51. };
  52. },
  53. PanelComponent: ({ appState, updateData, app }) => {
  54. const selectedElement = app.scene.getSelectedElements({
  55. selectedElementIds: appState.selectedElementIds,
  56. })[0] as ExcalidrawLinearElement;
  57. const label = t(
  58. selectedElement.type === "arrow"
  59. ? "labels.lineEditor.editArrow"
  60. : "labels.lineEditor.edit",
  61. );
  62. return (
  63. <ToolButton
  64. type="button"
  65. icon={lineEditorIcon}
  66. title={label}
  67. aria-label={label}
  68. onClick={() => updateData(null)}
  69. />
  70. );
  71. },
  72. });