UNPKG

dotting

Version:

Dotting is a pixel art editor component library for react

156 lines (155 loc) 7.85 kB
import { BaseLayer } from "./BaseLayer"; import { ButtonDirection, UserId } from "./config"; import { BRUSH_PATTERN_ELEMENT, ColorChangeItem, Coord, DottingData, GridIndices, PixelModifyItem, SelectAreaRange } from "./types"; import { PixelChangeRecords } from "../../helpers/PixelChangeRecords"; import { Index } from "../../utils/types"; export default class InteractionLayer extends BaseLayer { private strokedPixelRecords; private erasedPixelRecords; private tempStrokedPixels; private indicatorPixels; private dataLayerRowCount; private dataLayerColumnCount; private backgroundColor; private defaultPixelColor; private backgroundMode; private selectingArea; private brushPattern; private selectedArea; private directionToExtendSelectedArea; private movingSelectedArea; private movingSelectedPixels; private extendingSelectedArea; private extendingSelectedPixels; private capturedBaseExtendingSelectedArea; private capturedBaseExtendingSelectedAreaPixels; private selectedAreaPixels; private capturedData; private capturedDataOriginalIndices; private hoveredPixel; private previewPoints; private gridSquareLength; constructor({ columnCount, rowCount, canvas, }: { columnCount: number; rowCount: number; canvas: HTMLCanvasElement; }); getCapturedData(): DottingData; getDirectionToExtendSelectedArea(): ButtonDirection; getCapturedDataOriginalIndices(): GridIndices; getBrushPattern(): BRUSH_PATTERN_ELEMENT[][]; setPreviewPoints(points: Array<{ rowIndex: number; columnIndex: number; }> | null): void; setBrushPattern(pattern: Array<Array<BRUSH_PATTERN_ELEMENT>>): void; setGridSquareLength(length: number): void; setDefaultPixelColor(color: string): void; setDataLayerColumnCount(columnCount: number): void; setDataLayerRowCount(rowCount: number): void; setDirectionToExtendSelectedArea(direction: ButtonDirection | null): void; setSelectedArea(area: SelectAreaRange | null): void; setSelectingArea(area: Omit<SelectAreaRange, "startPixelIndex" | "endPixelIndex"> | null): void; setMovingSelectedPixels(pixels: Array<ColorChangeItem> | null): void; setMovingSelectedArea(area: SelectAreaRange | null): void; setExtendingSelectedPixels(pixels: Array<ColorChangeItem | null> | null): void; setExtendingSelectedArea(area: SelectAreaRange | null): void; setSelectedAreaPixels(pixelArray: Array<ColorChangeItem>): void; setBackgroundColor(color: string): void; setCapturedData(gridChangeStartCapturedData: DottingData): void; setCapturedBaseExtendingSelectedArea(capturedBaseExtendingSelectedArea: SelectAreaRange | null): void; setCapturedBaseExtendingSelectedAreaPixels(capturedBaseExtendingSelectedAreaPixels: Array<ColorChangeItem> | null): void; resetCapturedData(): void; getPreviewPoints(): { rowIndex: number; columnIndex: number; }[]; getHoveredPixel(): { rowIndex: number; columnIndex: number; color: string; }; getMovingSelectedPixels(): ColorChangeItem[]; getMovingSelectedArea(): SelectAreaRange; getExtendingSelectedArea(): SelectAreaRange; getExtendingSelectedPixels(): ColorChangeItem[]; setHoveredPixel(hoveredPixel: { rowIndex: number; columnIndex: number; color: string; } | null): void; getSelectingArea(): Omit<SelectAreaRange, "startPixelIndex" | "endPixelIndex">; getSelectedArea(): SelectAreaRange; getSelectedAreaPixels(): ColorChangeItem[]; getStrokedPixelRecords(): Map<string, PixelChangeRecords>; getEffectiveStrokePixelChanges(userId: UserId): ColorChangeItem[]; getErasedPixelRecords(): Map<string, PixelChangeRecords>; getEffectiveEraserPixelChanges(userId: UserId): ColorChangeItem[]; getIndicatorPixels(): PixelModifyItem[]; detectSelectedAreaExtendDirection(coord: Coord): ButtonDirection | null; extendSelectedAreaSideWays(direction: ButtonDirection, extendToCoord: Coord, isAltPressed: boolean): void; extendSelectedAreaDiagonally(direction: ButtonDirection, extendToCoord: Coord, isAltPressed: boolean): void; extendSelectedArea(direction: ButtonDirection, extendToCoord: Coord, isAltPressed: boolean): void; extendCapturedData(direction: ButtonDirection): void; shortenCapturedData(direction: ButtonDirection): boolean; setIndicatorPixels(indicatorPixels: Array<PixelModifyItem>): void; /** * In the interaction layer, * This will only collect information of presence updating information * @param userId User id of the user who is changing the dimension * (the user of the current device will have id "current-device-user-id" * @param dimensionChangeRecord */ addToStrokePixelRecords(userId: UserId, pixelItem: ColorChangeItem): void; getAllStrokePixels(): ColorChangeItem[]; addToErasedPixelRecords(userId: UserId, pixelItem: ColorChangeItem): void; getAllErasedPixels(): ColorChangeItem[]; deleteErasedPixelRecord(userId: UserId): void; deleteStrokePixelRecord(userId: UserId): void; colorPixels(data: Array<PixelModifyItem>): void; erasePixels(data: Array<{ rowIndex: number; columnIndex: number; }>): void; renderStrokedPixels(correctedLeftTopScreenPoint: Coord, squareLength: number): void; renderErasedPixels(correctedLeftTopScreenPoint: Coord, squareLength: number): void; renderMovingSelectedPixels(correctedLeftTopScreenPoint: Coord, squareLength: number): void; renderExtendingSelectedPixels(correctedLeftTopScreenPoint: Coord, squareLength: number): void; /** * @description While user is extending the pixel canvas, * this function hides the datalayer with background color when canvas is shrinked * or notifies the extended area with DefaultPixelColor when canvas is extended * @param correctedLeftTopScreenPoint The left top point of the canvas * @param squareLength The length of the square * @returns void */ renderCanvasMask(correctedLeftTopScreenPoint: Coord, squareLength: number): void; renderIndicatorPixels(correctedLeftTopScreenPoint: Coord, squareLength: number): void; renderHoveredPixel(correctedLeftTopScreenPoint: Coord, squareLength: number): void; getLinePoints(startPoint: Coord, endPoint: Coord, currentData: DottingData): Array<{ rowIndex: number; columnIndex: number; }>; getRectanglePoints(startPoint: Coord, endPoint: Coord, currentData: DottingData, filled: boolean): Array<{ rowIndex: number; columnIndex: number; }>; getEllipsePoints(startPoint: Coord, endPoint: Coord, currentData: DottingData, filled: boolean): Array<{ rowIndex: number; columnIndex: number; }>; drawLine(startPoint: Coord, endPoint: Coord, color: string, currentData: DottingData): void; drawRectangle(startPoint: Coord, endPoint: Coord, color: string, currentData: DottingData, filled: boolean): void; drawEllipse(startPoint: Coord, endPoint: Coord, color: string, currentData: DottingData, filled: boolean): void; protected drawPoints(points: Index[], color: any, currentData: DottingData): void; renderPreviewPoints(correctedLeftTopScreenPoint: Coord, squareLength: number): void; /** * Interaction Layer render will be called when: * 1. The canvas is resized * 2. The canvas is panned or zoomed * 3. The canvas is mouse clicked or touched * 4. The pixel grid is hovered * 5. The indicator pixel changes */ render(): void; }