feat: eyedropper tool
This commit is contained in:
parent
7803275267
commit
abd869bf0a
3 changed files with 35 additions and 9 deletions
|
|
@ -29,7 +29,7 @@ function Canvas() {
|
||||||
const { setLoading } = useContext(LoadingContext);
|
const { setLoading } = useContext(LoadingContext);
|
||||||
const { settings } = useContext(SettingsContext);
|
const { settings } = useContext(SettingsContext);
|
||||||
const { missingTexture, textures, solidTextures } = useContext(TexturesContext);
|
const { missingTexture, textures, solidTextures } = useContext(TexturesContext);
|
||||||
const { tool, radius, selectedBlock, cssCursor, setTool, setCssCursor } = useContext(ToolContext);
|
const { tool, radius, selectedBlock, cssCursor, setTool, setSelectedBlock, setCssCursor } = useContext(ToolContext);
|
||||||
|
|
||||||
const stageContainerRef = useRef<HTMLDivElement>(null);
|
const stageContainerRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
|
@ -189,11 +189,22 @@ function Canvas() {
|
||||||
);
|
);
|
||||||
|
|
||||||
const onClick = useCallback(() => {
|
const onClick = useCallback(() => {
|
||||||
if (tool === "zoom") {
|
switch (tool) {
|
||||||
const scaleChange = holdingAlt ? -0.1 : 0.1;
|
case "eyedropper": {
|
||||||
const newScale = Math.min(Math.max(scale + scaleChange * scale, 0.1), 32);
|
const mouseBlock = blocks.find((block) => block.x === mouseCoords.x && block.y === mouseCoords.y);
|
||||||
setScale(newScale);
|
if (mouseBlock) setSelectedBlock(mouseBlock.name);
|
||||||
zoomToMousePosition(newScale);
|
break;
|
||||||
|
}
|
||||||
|
case "zoom": {
|
||||||
|
const scaleChange = holdingAlt ? -0.1 : 0.1;
|
||||||
|
const newScale = Math.min(Math.max(scale + scaleChange * scale, 0.1), 32);
|
||||||
|
setScale(newScale);
|
||||||
|
zoomToMousePosition(newScale);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}, [tool, holdingAlt, scale, zoomToMousePosition, setScale]);
|
}, [tool, holdingAlt, scale, zoomToMousePosition, setScale]);
|
||||||
|
|
||||||
|
|
@ -215,6 +226,9 @@ function Canvas() {
|
||||||
setTool("eraser");
|
setTool("eraser");
|
||||||
break;
|
break;
|
||||||
case "4":
|
case "4":
|
||||||
|
setTool("eyedropper");
|
||||||
|
break;
|
||||||
|
case "5":
|
||||||
setTool("zoom");
|
setTool("zoom");
|
||||||
break;
|
break;
|
||||||
case "Alt":
|
case "Alt":
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { useContext } from "react";
|
import { useContext } from "react";
|
||||||
import { EraserIcon, HandIcon, PencilIcon, ZoomInIcon } from "lucide-react";
|
import { EraserIcon, HandIcon, PencilIcon, PipetteIcon, ZoomInIcon } from "lucide-react";
|
||||||
|
|
||||||
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
|
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
|
||||||
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
|
||||||
|
|
@ -57,6 +57,18 @@ function Toolbar() {
|
||||||
</TooltipContent>
|
</TooltipContent>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
||||||
|
{/* Eyedropper */}
|
||||||
|
<Tooltip delayDuration={0}>
|
||||||
|
<TooltipTrigger>
|
||||||
|
<ToggleGroupItem value="eyedropper" className="!p-0 !h-8 !min-w-8">
|
||||||
|
<PipetteIcon />
|
||||||
|
</ToggleGroupItem>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent side="right" sideOffset={10}>
|
||||||
|
<p>Eyedropper (4)</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
|
||||||
{/* Zoom */}
|
{/* Zoom */}
|
||||||
<Tooltip delayDuration={0}>
|
<Tooltip delayDuration={0}>
|
||||||
<TooltipTrigger>
|
<TooltipTrigger>
|
||||||
|
|
@ -65,7 +77,7 @@ function Toolbar() {
|
||||||
</ToggleGroupItem>
|
</ToggleGroupItem>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
<TooltipContent side="right" sideOffset={10}>
|
<TooltipContent side="right" sideOffset={10}>
|
||||||
<p>Zoom (4)</p>
|
<p>Zoom (5)</p>
|
||||||
</TooltipContent>
|
</TooltipContent>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
||||||
|
|
|
||||||
2
src/types.d.ts
vendored
2
src/types.d.ts
vendored
|
|
@ -21,7 +21,7 @@ interface Block extends Position {
|
||||||
name: string;
|
name: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
type Tool = "hand" | "pencil" | "eraser" | "zoom";
|
type Tool = "hand" | "pencil" | "eraser" | "eyedropper" | "zoom";
|
||||||
|
|
||||||
interface Settings {
|
interface Settings {
|
||||||
blockSelectorWindow: boolean;
|
blockSelectorWindow: boolean;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue