Skip to main content

image-editor-tools

Architecture and patterns for developing image editor tools and UI in the SwarmUI image editor. Not to be confused with the 'advanced media editor', that is separate.

소스 정보

저장소
mcmonkeyprojects/SwarmUI
최근 소스 활동
2026년 9월 16일 11:03
감지된 SKILL.md 언어
영어
스타
4,673
포크
474

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
image-editor-tools
description
Architecture and patterns for developing image editor tools and UI in the SwarmUI image editor. Not to be confused with the 'advanced media editor', that is separate.
# Image Editor Tools Guide to the image editor tool system in `src/wwwroot/js/genpage/helpers/image_editor.js`. ## When to Use - Use this skill when adding or modifying image editor tools - Use this skill when working with layers, color controls, or the image editor toolbar - Use this skill when adding new helper JS files that interact with the image editor - Do not use if you are working on the 'advanced media editor', that is a separate tool ## Architecture ### Class Hierarchy - `ImageEditorTool` - Base class. Creates `this.div` (toolbar button) and `this.configDiv` (bottom bar config area) via `makeDivs()`. Has lifecycle methods: `setActive()`, `setInactive()`, `draw()`, mouse handlers, `onLayerChanged()`. - `ImageEditorTempTool` - Extends base. Overrides `makeDivs()` with a no-op, so `this.div` is **undefined**. Used for hidden sub-tools (e.g., the eyedropper color picker tool). Any code accessing `.div` on a tool must null-check for this case. - `ImageEditorToolWithColor` - Extends base. Adds color control support: `getColorControlsHTML()`, `wireColorControls()`, `setColor(col)`, and color-aware `onLayerChanged()` with dual mask/image color memory. Tools that need a color picker (Brush, Bucket, Shape) extend this. - `ImageEditorToolSam2Base` - Extends base. Shared SAM2 warmup/clear-mask/request-tracking logic. Subclasses override `addWarmupGenData(genData, cx, cy)` and optionally `onClearMask()`. SAM2Points and SAM2BBox extend this. - Concrete tools extend the appropriate base: `ImageEditorToolBrush`/`ImageEditorToolBucket`/`ImageEditorToolShape` extend `ImageEditorToolWithColor`; `ImageEditorToolSam2Points`/`ImageEditorToolSam2BBox` extend `ImageEditorToolSam2Base`; others extend `ImageEditorTool`. ### Tool Registration Tools are registered in the `ImageEditor` constructor via `this.addTool(new ToolClass(...))`. Order matters for toolbar display. The tool ID string (e.g., `'brush'`, `'paintbucket'`) is used with `this.editor.activateTool(id)`. ### Layer System - Layers have a boolean `isMask` property. - `onLayerChanged(oldLayer, newLayer)` is called on every tool when the active layer changes (via `setActiveLayer()`). The old layer is passed directly so tools can compare previous vs new state. - The base `onLayerChanged` handles `isMaskOnly` tools (hides them when not on a mask). - Tools with color can override `onLayerChanged` to adapt (e.g., compress color to grayscale for masks, swap stored color based on `oldLayer.isMask` vs `newLayer.isMask`). ### Color Controls Pattern Tools that use color extend `ImageEditorToolWithColor`, which provides: 1. **`getColorControlsHTML()`**: Returns HTML for a `.image-editor-tool-block` div with hex text input (`.id-col1`), color swatch (`.id-col2`), and eyedrop button (`.id-col3`). Uses `this.color` for the default value. 2. **`wireColorControls()`**: Call after setting `configDiv.innerHTML` to wire up the color picker, swatch click, and eyedropper button. Opens the picker via the singleton `colorPickerHelper` (from `color_picker.js`). 3. **`setColor(col)`**: Updates `this.color`, the text input, and the swatch background. 4. **Dual color memory**: `imageColor` and `maskColor` fields store separate colors for image vs mask layers. The inherited `onLayerChanged` swaps between them (guarded by `this.colorText` existing, so tools like the eraser that skip `wireColorControls()` are unaffected). 5. **Grayscale enforcement**: When on a mask layer, colors are compressed to grayscale via `colorPickerHelper.hexToGrayscale()`, and the picker opens in grayscale mode. ### Bottom Bar Config Each tool's config UI is in `this.configDiv`, a flex row at the bottom of the editor. Common sub-blocks use `.image-editor-tool-block` with `align-items: center`. Sliders use `enableSliderForBox()` from `site.js`. ## Instructions - When adding a new tool, extend `ImageEditorTool` (or `ImageEditorTempTool` if it should be hidden). - Register it in the `ImageEditor` constructor with `this.addTool(new YourTool(this))`. - If the tool needs a new helper JS file, add it to `src/Pages/Text2Image.cshtml` in the `@section Scripts` block **before** `image_editor.js`. - Use `createDiv()` from `util.js` for DOM creation. - Use theme CSS variables (`--popup-back`, `--light-border`, etc.) for styling. - Always null-check `.div` when working with tools that might be TempTools. - If adding color controls, extend `ImageEditorToolWithColor`, pass the default color to `super()`, call `this.getColorControlsHTML()` when building config HTML, and call `this.wireColorControls()` after setting `configDiv.innerHTML`. The base class handles `setColor()`, `onLayerChanged()` color swapping, and grayscale enforcement automatically.
GitHub에서 보기