feat: blocks replacer

This commit is contained in:
trafficlunar 2024-12-27 22:52:01 +00:00
parent 0f3df546c2
commit 1721d08cf3
6 changed files with 94 additions and 3 deletions

View file

@ -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>

View file

@ -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"

View 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;

View file

@ -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 />

View file

@ -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
View file

@ -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;
} }