UNPKG

@gravity-ui/graph

Version:

Modern graph editor component

146 lines (145 loc) 5.39 kB
import { Graph } from "../../graph"; import { Emitter } from "../../utils/Emitter"; import { TRect } from "../../utils/types/shapes"; export type TCameraState = { x: number; y: number; width: number; height: number; scale: number; scaleMin: number; scaleMax: number; relativeX: number; relativeY: number; relativeWidth: number; relativeHeight: number; /** * Insets of visible viewport inside the canvas area (in screen space, pixels) * Use these to specify drawers/side panels overlaying the canvas. All values are >= 0. */ viewportInsets: { left: number; right: number; top: number; bottom: number; }; /** * Auto-panning mode enabled state * When enabled, the camera will automatically pan when the mouse is near the viewport edges */ autoPanningEnabled: boolean; }; export declare enum ECameraScaleLevel { Minimalistic = 100, Schematic = 200, Detailed = 300 } export declare const getInitCameraState: () => TCameraState; export type ICamera = Interface<CameraService>; export declare class CameraService extends Emitter { protected graph: Graph; protected state: TCameraState; constructor(graph: Graph, state?: TCameraState); resize(newState: Partial<TCameraState>): void; set(newState: Partial<TCameraState>): void; private updateRelative; getCameraRect(): TRect; /** * Returns the visible camera rect in screen space that accounts for the viewport insets. * @returns {TRect} Visible rectangle inside the canvas after applying insets */ getVisibleCameraRect(): TRect; /** * Returns camera viewport rectangle in camera-relative space. * By default returns full canvas-relative viewport (ignores insets). * When options.respectInsets is true, returns viewport of the visible area (with insets applied). * @param {Object} [options] * @param {boolean} [options.respectInsets] * @returns {TRect} Relative viewport rectangle */ getRelativeViewportRect(options?: { respectInsets?: boolean; }): TRect; getCameraScale(): number; getCameraBlockScaleLevel(cameraScale?: number): ECameraScaleLevel; getCameraState(): TCameraState; move(dx?: number, dy?: number): void; getRelative(n: number, scale?: number): number; getRelativeXY(x: number, y: number): number[]; /** * Converts relative coordinate to absolute (screen space). * Inverse of getRelative. * @param {number} n Relative coordinate * @param {number} [scale=this.state.scale] Scale to use for conversion * @returns {number} Absolute coordinate in screen space */ getAbsolute(n: number, scale?: number): number; /** * Converts relative coordinates to absolute (screen space). * Inverse of getRelativeXY. * @param {number} x Relative x * @param {number} y Relative y * @returns {number[]} Absolute [x, y] in screen space */ getAbsoluteXY(x: number, y: number): number[]; /** * Zoom to a screen point. * @param {number} x Screen x where zoom anchors * @param {number} y Screen y where zoom anchors * @param {number} scale Target scale value * @returns {void} */ zoom(x: number, y: number, scale: number): void; getScaleRelativeDimensionsBySide(size: number, axis: "width" | "height", options?: { respectInsets?: boolean; }): number; getScaleRelativeDimensions(width: number, height: number, options?: { respectInsets?: boolean; }): number; getXYRelativeCenterDimensions(dimensions: TRect, scale: number, options?: { respectInsets?: boolean; }): { x: number; y: number; }; isRectVisible(x: number, y: number, w: number, h: number): boolean; isLineVisible(x1: number, y1: number, x2: number, y2: number): boolean; applyToPoint(x: number, y: number): [number, number]; applyToRect(...arg: number[]): number[]; /** * Update viewport insets (screen-space paddings inside canvas) and optionally keep the * world point under the visible center unchanged. * @param {Object} insets Partial insets to update * @param {number} [insets.left] * @param {number} [insets.right] * @param {number} [insets.top] * @param {number} [insets.bottom] * @param {string} [maintain=center] Preserve visual anchor; allowed values: center or none. "center" keeps the * same world point under visible center * @returns {void} */ setViewportInsets(insets: Partial<TCameraState["viewportInsets"]>, params?: { maintain?: "center"; }): void; /** * Returns current viewport insets. * @returns {{left: number, right: number, top: number, bottom: number}} Current insets of visible viewport */ getViewportInsets(): TCameraState["viewportInsets"]; /** * Enable auto-panning mode. * When enabled, the camera will automatically pan when the mouse is near the viewport edges. * @returns {void} */ enableAutoPanning(): void; /** * Disable auto-panning mode. * @returns {void} */ disableAutoPanning(): void; /** * Check if auto-panning mode is enabled. * @returns {boolean} True if auto-panning is enabled */ isAutoPanningEnabled(): boolean; }