|
@@ -12,6 +12,7 @@ import {
|
|
|
canChangeSharpness,
|
|
|
} from "../scene";
|
|
|
import { ButtonSelect } from "../components/ButtonSelect";
|
|
|
+import { ButtonIconSelect } from "../components/ButtonIconSelect";
|
|
|
import {
|
|
|
isTextElement,
|
|
|
redrawTextBoundingBox,
|
|
@@ -25,6 +26,20 @@ import { register } from "./register";
|
|
|
import { newElementWith } from "../element/mutateElement";
|
|
|
import { DEFAULT_FONT_SIZE, DEFAULT_FONT_FAMILY } from "../constants";
|
|
|
import { randomInteger } from "../random";
|
|
|
+import {
|
|
|
+ FillHachureIcon,
|
|
|
+ FillCrossHatchIcon,
|
|
|
+ FillSolidIcon,
|
|
|
+ StrokeWidthIcon,
|
|
|
+ StrokeStyleSolidIcon,
|
|
|
+ StrokeStyleDashedIcon,
|
|
|
+ StrokeStyleDottedIcon,
|
|
|
+ EdgeSharpIcon,
|
|
|
+ EdgeRoundIcon,
|
|
|
+ SloppinessArchitectIcon,
|
|
|
+ SloppinessArtistIcon,
|
|
|
+ SloppinessCartoonistIcon,
|
|
|
+} from "../components/icons";
|
|
|
|
|
|
const changeProperty = (
|
|
|
elements: readonly ExcalidrawElement[],
|
|
@@ -141,11 +156,23 @@ export const actionChangeFillStyle = register({
|
|
|
PanelComponent: ({ elements, appState, updateData }) => (
|
|
|
<fieldset>
|
|
|
<legend>{t("labels.fill")}</legend>
|
|
|
- <ButtonSelect
|
|
|
+ <ButtonIconSelect
|
|
|
options={[
|
|
|
- { value: "hachure", text: t("labels.hachure") },
|
|
|
- { value: "cross-hatch", text: t("labels.crossHatch") },
|
|
|
- { value: "solid", text: t("labels.solid") },
|
|
|
+ {
|
|
|
+ value: "hachure",
|
|
|
+ text: t("labels.hachure"),
|
|
|
+ icon: <FillHachureIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "cross-hatch",
|
|
|
+ text: t("labels.crossHatch"),
|
|
|
+ icon: <FillCrossHatchIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "solid",
|
|
|
+ text: t("labels.solid"),
|
|
|
+ icon: <FillSolidIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
]}
|
|
|
group="fill"
|
|
|
value={getFormValue(
|
|
@@ -178,12 +205,39 @@ export const actionChangeStrokeWidth = register({
|
|
|
PanelComponent: ({ elements, appState, updateData }) => (
|
|
|
<fieldset>
|
|
|
<legend>{t("labels.strokeWidth")}</legend>
|
|
|
- <ButtonSelect
|
|
|
+ <ButtonIconSelect
|
|
|
group="stroke-width"
|
|
|
options={[
|
|
|
- { value: 1, text: t("labels.thin") },
|
|
|
- { value: 2, text: t("labels.bold") },
|
|
|
- { value: 4, text: t("labels.extraBold") },
|
|
|
+ {
|
|
|
+ value: 1,
|
|
|
+ text: t("labels.thin"),
|
|
|
+ icon: (
|
|
|
+ <StrokeWidthIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ strokeWidth={2}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: 2,
|
|
|
+ text: t("labels.bold"),
|
|
|
+ icon: (
|
|
|
+ <StrokeWidthIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ strokeWidth={6}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: 4,
|
|
|
+ text: t("labels.extraBold"),
|
|
|
+ icon: (
|
|
|
+ <StrokeWidthIcon
|
|
|
+ appearance={appState.appearance}
|
|
|
+ strokeWidth={10}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ },
|
|
|
]}
|
|
|
value={getFormValue(
|
|
|
elements,
|
|
@@ -214,12 +268,24 @@ export const actionChangeSloppiness = register({
|
|
|
PanelComponent: ({ elements, appState, updateData }) => (
|
|
|
<fieldset>
|
|
|
<legend>{t("labels.sloppiness")}</legend>
|
|
|
- <ButtonSelect
|
|
|
+ <ButtonIconSelect
|
|
|
group="sloppiness"
|
|
|
options={[
|
|
|
- { value: 0, text: t("labels.architect") },
|
|
|
- { value: 1, text: t("labels.artist") },
|
|
|
- { value: 2, text: t("labels.cartoonist") },
|
|
|
+ {
|
|
|
+ value: 0,
|
|
|
+ text: t("labels.architect"),
|
|
|
+ icon: <SloppinessArchitectIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: 1,
|
|
|
+ text: t("labels.artist"),
|
|
|
+ icon: <SloppinessArtistIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: 2,
|
|
|
+ text: t("labels.cartoonist"),
|
|
|
+ icon: <SloppinessCartoonistIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
]}
|
|
|
value={getFormValue(
|
|
|
elements,
|
|
@@ -249,12 +315,24 @@ export const actionChangeStrokeStyle = register({
|
|
|
PanelComponent: ({ elements, appState, updateData }) => (
|
|
|
<fieldset>
|
|
|
<legend>{t("labels.strokeStyle")}</legend>
|
|
|
- <ButtonSelect
|
|
|
+ <ButtonIconSelect
|
|
|
group="strokeStyle"
|
|
|
options={[
|
|
|
- { value: "solid", text: t("labels.strokeStyle_solid") },
|
|
|
- { value: "dashed", text: t("labels.strokeStyle_dashed") },
|
|
|
- { value: "dotted", text: t("labels.strokeStyle_dotted") },
|
|
|
+ {
|
|
|
+ value: "solid",
|
|
|
+ text: t("labels.strokeStyle_solid"),
|
|
|
+ icon: <StrokeStyleSolidIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "dashed",
|
|
|
+ text: t("labels.strokeStyle_dashed"),
|
|
|
+ icon: <StrokeStyleDashedIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "dotted",
|
|
|
+ text: t("labels.strokeStyle_dotted"),
|
|
|
+ icon: <StrokeStyleDottedIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
]}
|
|
|
value={getFormValue(
|
|
|
elements,
|
|
@@ -488,11 +566,19 @@ export const actionChangeSharpness = register({
|
|
|
PanelComponent: ({ elements, appState, updateData }) => (
|
|
|
<fieldset>
|
|
|
<legend>{t("labels.edges")}</legend>
|
|
|
- <ButtonSelect
|
|
|
+ <ButtonIconSelect
|
|
|
group="edges"
|
|
|
options={[
|
|
|
- { value: "sharp", text: t("labels.sharp") },
|
|
|
- { value: "round", text: t("labels.round") },
|
|
|
+ {
|
|
|
+ value: "sharp",
|
|
|
+ text: t("labels.sharp"),
|
|
|
+ icon: <EdgeSharpIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: "round",
|
|
|
+ text: t("labels.round"),
|
|
|
+ icon: <EdgeRoundIcon appearance={appState.appearance} />,
|
|
|
+ },
|
|
|
]}
|
|
|
value={getFormValue(
|
|
|
elements,
|