From acb305f4370f3c8185ebcfa987c92eb683d665f3 Mon Sep 17 00:00:00 2001 From: kts of kettek Date: Wed, 14 Feb 2024 19:25:45 -0800 Subject: [PATCH] Implement color picker sadly not universal --- frontend/src/App.svelte | 8 +++++--- frontend/src/sections/Editor2D.svelte | 6 +++++- frontend/src/types/tools.ts | 28 +++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index b00ff2a..9418a69 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -14,10 +14,10 @@ import { OverflowMenu, OverflowMenuItem } from "carbon-components-svelte" - import { Close, Erase, PaintBrushAlt, RainDrop, Redo, Select_01, Undo, Scale } from "carbon-icons-svelte" + import { Close, Erase, PaintBrushAlt, RainDrop, Redo, Select_01, Undo, Scale, Eyedropper } from "carbon-icons-svelte" import StackPreview from './sections/StackPreview.svelte' import type { Canvas } from './types/canvas' - import { BrushTool, EraserTool, FillTool, type Tool } from './types/tools'; + import { BrushTool, EraserTool, FillTool, PickerTool, type Tool } from './types/tools'; import BrushSize from './components/BrushSize.svelte'; let theme: 'white'|'g10'|'g80'|'g90'|'g100' = 'g90' @@ -38,6 +38,7 @@ let toolFill = new FillTool() let toolErase = new EraserTool() let toolBrush = new BrushTool() + let toolPicker = new PickerTool() let currentTool: Tool = toolBrush let brushSize: number = 1 @@ -103,6 +104,7 @@ +
@@ -124,7 +126,7 @@ {#each files as file} - + {/each} diff --git a/frontend/src/sections/Editor2D.svelte b/frontend/src/sections/Editor2D.svelte index 97a2eaf..bcd6476 100644 --- a/frontend/src/sections/Editor2D.svelte +++ b/frontend/src/sections/Editor2D.svelte @@ -4,7 +4,7 @@ import type { data } from '../../wailsjs/go/models.ts' import type { LoadedFile } from '../types/file' import type { PixelPosition } from '../types/shapes' - import { BrushTool, EraserTool, FillTool, type Tool } from '../types/tools' + import { BrushTool, EraserTool, FillTool, PickerTool, type Tool } from '../types/tools' import { Button, NumberInput, OverflowMenu, OverflowMenuItem, Slider } from 'carbon-components-svelte'; import { ZoomIn, ZoomOut } from 'carbon-icons-svelte'; @@ -214,6 +214,8 @@ currentTool.pointerDown({file, brushSize}, {x: mousePixelX, y: mousePixelY, id: e.button }) } else if (currentTool instanceof FillTool) { currentTool.pointerDown({file, colorIndex: primaryColorIndex}, {x: mousePixelX, y: mousePixelY, id: e.button }) + } else if (currentTool instanceof PickerTool) { + currentTool.pointerDown({file, setColorIndex: index=>primaryColorIndex=index}, {x: mousePixelX, y: mousePixelY, id: e.button }) } else { currentTool.pointerDown({file}, {x: mousePixelX, y: mousePixelY, id: e.button }) } @@ -274,6 +276,8 @@ currentTool.pointerMove({file, brushSize}, {x: mousePixelX, y: mousePixelY, id: 0 }) } else if (currentTool instanceof FillTool) { currentTool.pointerMove({file, colorIndex: primaryColorIndex}, {x: mousePixelX, y: mousePixelY, id: 0 }) + } else if (currentTool instanceof PickerTool) { + currentTool.pointerMove({file, setColorIndex: index=>primaryColorIndex=index}, {x: mousePixelX, y: mousePixelY, id: e.button }) } else { currentTool.pointerMove({file}, {x: mousePixelX, y: mousePixelY, id: 0 }) } diff --git a/frontend/src/types/tools.ts b/frontend/src/types/tools.ts index c5b782c..c7b24d9 100644 --- a/frontend/src/types/tools.ts +++ b/frontend/src/types/tools.ts @@ -31,6 +31,10 @@ export interface FloodToolContext { colorIndex: number } +export interface PickerToolContext { + setColorIndex(index: number): void +} + export class BrushTool implements Tool { private active: boolean isActive(): boolean { @@ -135,4 +139,28 @@ export class FillTool implements Tool { ctx.file.push(new PixelsPlaceUndoable(this.pixels)) this.active = false } +} + +export class PickerTool implements Tool { + private active: boolean + isActive(): boolean { + return this.active + } + + pointerDown(ctx: ToolContext & PickerToolContext, ptr: Pointer) { + this.active = true + let p = ctx.file.canvas.getPixel(ptr.x, ptr.y) + if (p !== -1) { + ctx.setColorIndex(p) + } + } + pointerMove(ctx: ToolContext & PickerToolContext, ptr: Pointer) { + let p = ctx.file.canvas.getPixel(ptr.x, ptr.y) + if (p !== -1) { + ctx.setColorIndex(p) + } + } + pointerUp(ctx: ToolContext & PickerToolContext, ptr: Pointer) { + this.active = false + } } \ No newline at end of file