|
@@ -1,4 +1,5 @@
|
|
|
import React from "react";
|
|
|
+import { getLanguage } from "../i18n";
|
|
|
import {
|
|
|
ExcalidrawElement,
|
|
|
ExcalidrawTextElement,
|
|
@@ -16,7 +17,7 @@ import {
|
|
|
} from "../scene";
|
|
|
import { ButtonSelect } from "../components/ButtonSelect";
|
|
|
import { ButtonIconSelect } from "../components/ButtonIconSelect";
|
|
|
-import { ButtonIconCycle } from "../components/ButtonIconCycle";
|
|
|
+import { IconPicker } from "../components/IconPicker";
|
|
|
import {
|
|
|
isTextElement,
|
|
|
redrawTextBoundingBox,
|
|
@@ -43,7 +44,10 @@ import {
|
|
|
SloppinessArchitectIcon,
|
|
|
SloppinessArtistIcon,
|
|
|
SloppinessCartoonistIcon,
|
|
|
- ArrowArrowheadIcon,
|
|
|
+ ArrowheadArrowIcon,
|
|
|
+ ArrowheadBarIcon,
|
|
|
+ ArrowheadDotIcon,
|
|
|
+ ArrowheadNoneIcon,
|
|
|
} from "../components/icons";
|
|
|
import { EVENT_CHANGE, trackEvent } from "../analytics";
|
|
|
import colors from "../colors";
|
|
@@ -671,66 +675,124 @@ export const actionChangeArrowhead = register({
|
|
|
commitToHistory: true,
|
|
|
};
|
|
|
},
|
|
|
- PanelComponent: ({ elements, appState, updateData }) => (
|
|
|
- <fieldset>
|
|
|
- <legend>{t("labels.arrowheads")}</legend>
|
|
|
- <div className="buttonList buttonListIcon">
|
|
|
- <ButtonIconCycle
|
|
|
- group="arrowhead_start"
|
|
|
- options={[
|
|
|
- {
|
|
|
- value: null,
|
|
|
- text: t("labels.arrowhead_none"),
|
|
|
- icon: <StrokeStyleSolidIcon appearance={appState.appearance} />,
|
|
|
- },
|
|
|
- {
|
|
|
- value: "arrow",
|
|
|
- text: t("labels.arrowhead_arrow"),
|
|
|
- icon: (
|
|
|
- <ArrowArrowheadIcon
|
|
|
- appearance={appState.appearance}
|
|
|
- flip={true}
|
|
|
- />
|
|
|
- ),
|
|
|
- },
|
|
|
- ]}
|
|
|
- value={getFormValue<Arrowhead | null>(
|
|
|
- elements,
|
|
|
- appState,
|
|
|
- (element) =>
|
|
|
- isLinearElement(element) && canHaveArrowheads(element.type)
|
|
|
- ? element.startArrowhead
|
|
|
- : appState.currentItemArrowheads.start,
|
|
|
- appState.currentItemArrowheads.start,
|
|
|
- )}
|
|
|
- onChange={(value) => updateData({ position: "start", type: value })}
|
|
|
- />
|
|
|
- <ButtonIconCycle
|
|
|
- group="arrowhead_end"
|
|
|
- options={[
|
|
|
- {
|
|
|
- value: null,
|
|
|
- text: t("labels.arrowhead_none"),
|
|
|
- icon: <StrokeStyleSolidIcon appearance={appState.appearance} />,
|
|
|
- },
|
|
|
- {
|
|
|
- value: "arrow",
|
|
|
- text: t("labels.arrowhead_arrow"),
|
|
|
- icon: <ArrowArrowheadIcon appearance={appState.appearance} />,
|
|
|
- },
|
|
|
- ]}
|
|
|
- value={getFormValue<Arrowhead | null>(
|
|
|
- elements,
|
|
|
- appState,
|
|
|
- (element) =>
|
|
|
- isLinearElement(element) && canHaveArrowheads(element.type)
|
|
|
- ? element.endArrowhead
|
|
|
- : appState.currentItemArrowheads.end,
|
|
|
- appState.currentItemArrowheads.end,
|
|
|
- )}
|
|
|
- onChange={(value) => updateData({ position: "end", type: value })}
|
|
|
- />
|
|
|
- </div>
|
|
|
- </fieldset>
|
|
|
- ),
|
|
|
+ PanelComponent: ({ elements, appState, updateData }) => {
|
|
|
+ const isRTL = getLanguage().rtl;
|
|
|
+
|
|
|
+ return (
|
|
|
+ <fieldset>
|
|
|
+ <legend>{t("labels.arrowheads")}</legend>
|
|
|
+ <div className="iconSelectList">
|
|
|
+ <IconPicker
|
|
|
+ label="arrowhead_start"
|
|
|
+ options={[
|
|
|
+ {
|
|
|
+ value: null,
|
|
|
+ text: t("labels.arrowhead_none"),
|
|
|
+ icon: <ArrowheadNoneIcon appearance={appState.appearance} />,
|
|
|
+ keyBinding: "q",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "arrow",
|
|
|
+ text: t("labels.arrowhead_arrow"),
|
|
|
+ icon: (
|
|
|
+ <ArrowheadArrowIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ flip={!isRTL}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ keyBinding: "w",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "bar",
|
|
|
+ text: t("labels.arrowhead_bar"),
|
|
|
+ icon: (
|
|
|
+ <ArrowheadBarIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ flip={!isRTL}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ keyBinding: "e",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "dot",
|
|
|
+ text: t("labels.arrowhead_dot"),
|
|
|
+ icon: (
|
|
|
+ <ArrowheadDotIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ flip={!isRTL}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ keyBinding: "r",
|
|
|
+ },
|
|
|
+ ]}
|
|
|
+ value={getFormValue<Arrowhead | null>(
|
|
|
+ elements,
|
|
|
+ appState,
|
|
|
+ (element) =>
|
|
|
+ isLinearElement(element) && canHaveArrowheads(element.type)
|
|
|
+ ? element.startArrowhead
|
|
|
+ : appState.currentItemArrowheads.start,
|
|
|
+ appState.currentItemArrowheads.start,
|
|
|
+ )}
|
|
|
+ onChange={(value) => updateData({ position: "start", type: value })}
|
|
|
+ />
|
|
|
+ <IconPicker
|
|
|
+ label="arrowhead_end"
|
|
|
+ group="arrowheads"
|
|
|
+ options={[
|
|
|
+ {
|
|
|
+ value: null,
|
|
|
+ text: t("labels.arrowhead_none"),
|
|
|
+ keyBinding: "q",
|
|
|
+ icon: <ArrowheadNoneIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "arrow",
|
|
|
+ text: t("labels.arrowhead_arrow"),
|
|
|
+ keyBinding: "w",
|
|
|
+ icon: (
|
|
|
+ <ArrowheadArrowIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ flip={isRTL}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "bar",
|
|
|
+ text: t("labels.arrowhead_bar"),
|
|
|
+ keyBinding: "e",
|
|
|
+ icon: (
|
|
|
+ <ArrowheadBarIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ flip={isRTL}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "dot",
|
|
|
+ text: t("labels.arrowhead_dot"),
|
|
|
+ keyBinding: "r",
|
|
|
+ icon: (
|
|
|
+ <ArrowheadDotIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ flip={isRTL}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ ]}
|
|
|
+ value={getFormValue<Arrowhead | null>(
|
|
|
+ elements,
|
|
|
+ appState,
|
|
|
+ (element) =>
|
|
|
+ isLinearElement(element) && canHaveArrowheads(element.type)
|
|
|
+ ? element.endArrowhead
|
|
|
+ : appState.currentItemArrowheads.end,
|
|
|
+ appState.currentItemArrowheads.end,
|
|
|
+ )}
|
|
|
+ onChange={(value) => updateData({ position: "end", type: value })}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </fieldset>
|
|
|
+ );
|
|
|
+ },
|
|
|
});
|