@gravity-ui/graph
Version:
Modern graph editor component
146 lines (145 loc) • 5.39 kB
TypeScript
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;
}