Odysseus v1.0
This commit is contained in:
46
static/js/editor/tools/wand.js
Normal file
46
static/js/editor/tools/wand.js
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Magic-wand tool — single-click flood-fill selection on the active
|
||||
* layer's pixels. Shift/Alt modifiers override the persistent mode
|
||||
* toggle for the duration of the click (add / subtract).
|
||||
*
|
||||
* Clicking inside an existing selection with no modifier deselects.
|
||||
*
|
||||
* Wand is selection-only — it doesn't mutate the layer until the user
|
||||
* invokes an action (Erase / Copy / etc.) from the panel. That's why
|
||||
* it has just a `click` handler instead of begin/drag/end.
|
||||
*
|
||||
* @param {{
|
||||
* activeLayer: () => object | null,
|
||||
* saveState: () => void,
|
||||
* composite: () => void,
|
||||
* wandHits: (cx: number, cy: number) => boolean,
|
||||
* runMagicWand: (cx: number, cy: number, mode: 'replace'|'add'|'subtract') => void,
|
||||
* }} deps
|
||||
*/
|
||||
import { state } from '../state.js';
|
||||
import { canvasCoords } from '../canvas-coords.js';
|
||||
|
||||
export function createWandTool({ activeLayer, saveState, composite, wandHits, runMagicWand }) {
|
||||
return {
|
||||
click(e) {
|
||||
const layer = activeLayer();
|
||||
if (!layer) return;
|
||||
const coords = canvasCoords(e, state.mainCanvas);
|
||||
// Persistent toggle sets the default mode; Shift forces add, Alt
|
||||
// forces subtract regardless of the toggle (modifiers always win).
|
||||
let mode = state.wandMode || 'replace';
|
||||
if (e.shiftKey) mode = 'add';
|
||||
else if (e.altKey) mode = 'subtract';
|
||||
// Click INSIDE the existing selection with no modifier → deselect.
|
||||
if (mode === 'replace' && wandHits(coords.x, coords.y)) {
|
||||
saveState();
|
||||
state.wandMask = null;
|
||||
state.wandLayerId = null;
|
||||
state.wandLastSeed = null;
|
||||
composite();
|
||||
return;
|
||||
}
|
||||
runMagicWand(coords.x, coords.y, mode);
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user