feat: blocks replacer
This commit is contained in:
parent
0f3df546c2
commit
1721d08cf3
6 changed files with 94 additions and 3 deletions
|
|
@ -29,6 +29,9 @@ function ViewMenu() {
|
||||||
<MenubarCheckboxItem checked={settings.colorPicker} onCheckedChange={onCheckedChange("colorPicker")}>
|
<MenubarCheckboxItem checked={settings.colorPicker} onCheckedChange={onCheckedChange("colorPicker")}>
|
||||||
Color Picker
|
Color Picker
|
||||||
</MenubarCheckboxItem>
|
</MenubarCheckboxItem>
|
||||||
|
<MenubarCheckboxItem checked={settings.blocksReplacer} onCheckedChange={onCheckedChange("blocksReplacer")}>
|
||||||
|
Blocks Replacer
|
||||||
|
</MenubarCheckboxItem>
|
||||||
<MenubarCheckboxItem checked={settings.radiusChanger} onCheckedChange={onCheckedChange("radiusChanger")}>
|
<MenubarCheckboxItem checked={settings.radiusChanger} onCheckedChange={onCheckedChange("radiusChanger")}>
|
||||||
Radius Changer
|
Radius Changer
|
||||||
</MenubarCheckboxItem>
|
</MenubarCheckboxItem>
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,13 @@ import { useContext } from "react";
|
||||||
|
|
||||||
import { ToolContext } from "@/context/Tool";
|
import { ToolContext } from "@/context/Tool";
|
||||||
import { Input } from "@/components/ui/input";
|
import { Input } from "@/components/ui/input";
|
||||||
import { Label } from "../ui/label";
|
import { Label } from "@/components/ui/label";
|
||||||
|
|
||||||
function Radius() {
|
function Radius() {
|
||||||
const { radius, setRadius } = useContext(ToolContext);
|
const { radius, setRadius } = useContext(ToolContext);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="grid grid-cols-2 items-center">
|
<div className="grid grid-cols-2 items-center gap-2">
|
||||||
<Label htmlFor="radius">Radius</Label>
|
<Label htmlFor="radius">Radius</Label>
|
||||||
<Input
|
<Input
|
||||||
name="radius"
|
name="radius"
|
||||||
|
|
|
||||||
78
src/components/tool-settings/Replace.tsx
Normal file
78
src/components/tool-settings/Replace.tsx
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
import { useContext, useEffect, useState } from "react";
|
||||||
|
import { Container, Sprite, Stage } from "@pixi/react";
|
||||||
|
|
||||||
|
import { CanvasContext } from "@/context/Canvas";
|
||||||
|
import { ToolContext } from "@/context/Tool";
|
||||||
|
import { TexturesContext } from "@/context/Textures";
|
||||||
|
|
||||||
|
import { Label } from "@/components/ui/label";
|
||||||
|
import { Button } from "../ui/button";
|
||||||
|
|
||||||
|
function Replace() {
|
||||||
|
const { setBlocks } = useContext(CanvasContext);
|
||||||
|
const { selectedBlock, tool, setTool } = useContext(ToolContext);
|
||||||
|
const { missingTexture, textures } = useContext(TexturesContext);
|
||||||
|
|
||||||
|
const [oldTool, setOldTool] = useState<Tool>("hand");
|
||||||
|
const [waitingId, setWaitingId] = useState<number | null>(null);
|
||||||
|
const [block1, setBlock1] = useState<string>("");
|
||||||
|
const [block2, setBlock2] = useState<string>("");
|
||||||
|
|
||||||
|
const onClickBlockButton = (id: number) => {
|
||||||
|
setWaitingId(id);
|
||||||
|
setOldTool(tool);
|
||||||
|
setTool("eyedropper");
|
||||||
|
};
|
||||||
|
|
||||||
|
const onClickReplace = () => {
|
||||||
|
setBlocks((prevBlocks) => prevBlocks.map((block) => (block.name === block1 ? { ...block, name: block2 } : block)));
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!waitingId) return;
|
||||||
|
|
||||||
|
if (waitingId == 1) {
|
||||||
|
setBlock1(selectedBlock);
|
||||||
|
} else if (waitingId == 2) {
|
||||||
|
setBlock2(selectedBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
setTool(oldTool);
|
||||||
|
setWaitingId(null);
|
||||||
|
}, [selectedBlock]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="grid grid-cols-2 items-center gap-2">
|
||||||
|
<Label htmlFor="radius">Block 1</Label>
|
||||||
|
<button
|
||||||
|
onClick={() => onClickBlockButton(1)}
|
||||||
|
className="h-10 rounded-md border border-zinc-200 dark:border-zinc-800 dark:bg-zinc-950 flex justify-center items-center"
|
||||||
|
>
|
||||||
|
<Stage width={32} height={32} options={{ backgroundAlpha: 0 }}>
|
||||||
|
<Container>
|
||||||
|
<Sprite texture={textures[`${block1}.png`] ?? missingTexture} scale={2} />
|
||||||
|
</Container>
|
||||||
|
</Stage>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<Label htmlFor="radius">Block 2</Label>
|
||||||
|
<button
|
||||||
|
onClick={() => onClickBlockButton(2)}
|
||||||
|
className="h-10 rounded-md border border-zinc-200 dark:border-zinc-800 dark:bg-zinc-950 flex justify-center items-center"
|
||||||
|
>
|
||||||
|
<Stage width={32} height={32} options={{ backgroundAlpha: 0 }}>
|
||||||
|
<Container>
|
||||||
|
<Sprite texture={textures[`${block2}.png`] ?? missingTexture} scale={2} />
|
||||||
|
</Container>
|
||||||
|
</Stage>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<Button variant="outline" onClick={onClickReplace} className="h-8">
|
||||||
|
Replace
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Replace;
|
||||||
|
|
@ -6,6 +6,7 @@ import { Input } from "@/components/ui/input";
|
||||||
import { Separator } from "@/components/ui/separator";
|
import { Separator } from "@/components/ui/separator";
|
||||||
|
|
||||||
import ColorPicker from "./ColorPicker";
|
import ColorPicker from "./ColorPicker";
|
||||||
|
import Replace from "./Replace";
|
||||||
import Radius from "./Radius";
|
import Radius from "./Radius";
|
||||||
import SelectorBlocks from "./SelectorBlocks";
|
import SelectorBlocks from "./SelectorBlocks";
|
||||||
|
|
||||||
|
|
@ -24,7 +25,7 @@ function ToolSettings() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{(settings.colorPicker || settings.radiusChanger || settings.blockSelector) && (
|
{(settings.colorPicker || settings.blocksReplacer || settings.radiusChanger || settings.blockSelector) && (
|
||||||
<div className="w-72 border-l border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-950 p-2 pb-0 flex flex-col h-full gap-2">
|
<div className="w-72 border-l border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-950 p-2 pb-0 flex flex-col h-full gap-2">
|
||||||
{settings.colorPicker && (
|
{settings.colorPicker && (
|
||||||
<>
|
<>
|
||||||
|
|
@ -33,6 +34,13 @@ function ToolSettings() {
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{settings.blocksReplacer && (
|
||||||
|
<>
|
||||||
|
<Replace />
|
||||||
|
<Separator />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
{settings.radiusChanger && (
|
{settings.radiusChanger && (
|
||||||
<>
|
<>
|
||||||
<Radius />
|
<Radius />
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ const defaultSettings: Settings = {
|
||||||
grid: true,
|
grid: true,
|
||||||
canvasBorder: false,
|
canvasBorder: false,
|
||||||
colorPicker: false,
|
colorPicker: false,
|
||||||
|
blocksReplacer: true,
|
||||||
radiusChanger: true,
|
radiusChanger: true,
|
||||||
blockSelector: true,
|
blockSelector: true,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
1
src/types.d.ts
vendored
1
src/types.d.ts
vendored
|
|
@ -27,6 +27,7 @@ interface Settings {
|
||||||
grid: boolean;
|
grid: boolean;
|
||||||
canvasBorder: boolean;
|
canvasBorder: boolean;
|
||||||
colorPicker: boolean;
|
colorPicker: boolean;
|
||||||
|
blocksReplacer: boolean;
|
||||||
radiusChanger: boolean;
|
radiusChanger: boolean;
|
||||||
blockSelector: boolean;
|
blockSelector: boolean;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue