import type { Background, Chart, CommentThread, Connection, Display, Fill, Foreground, NormalizedFilter, Outline, Shadow, Shape, Table, Text } from 'modern-idoc'; import type { Path2D, Vector2Like } from 'modern-path2d'; import type { InputEvent, InputEventKey, WebGLRenderer } from '../../../core'; import type { Node, Rectangulable, RectangulableEvents, SceneTree, Viewport } from '../../main'; import type { Node2DEvents, Node2DProperties } from '../Node2D'; import type { Element2DStyleProperties } from './Element2DStyle'; import { Vector2 } from 'modern-path2d'; import { Aabb2D, Obb2D } from '../../../core'; import { ColorFilterEffect, MaskEffect } from '../../effects'; import { Node2D } from '../Node2D'; import { Element2DBackground } from './Element2DBackground'; import { Element2DChart } from './Element2DChart'; import { Element2DComments } from './Element2DComments'; import { Element2DConnection } from './Element2DConnection'; import { Element2DFill } from './Element2DFill'; import { Element2DForeground } from './Element2DForeground'; import { Element2DOutline } from './Element2DOutline'; import { Element2DShadow } from './Element2DShadow'; import { Element2DShape } from './Element2DShape'; import { Element2DStyle } from './Element2DStyle'; import { Element2DTable } from './Element2DTable'; import { Element2DText } from './Element2DText'; import { Flexbox } from './Flexbox'; export interface BaseElement2DEvents extends Node2DEvents, RectangulableEvents { updateStyleProperty: [key: string, value: any, oldValue: any]; } export interface Element2D { on: (event: K, listener: (...args: BaseElement2DEvents[K]) => void) => this; once: (event: K, listener: (...args: BaseElement2DEvents[K]) => void) => this; off: (event: K, listener: (...args: BaseElement2DEvents[K]) => void) => this; emit: (event: K, ...args: BaseElement2DEvents[K]) => this; } export interface Element2DProperties extends Node2DProperties { style: Partial; background: Background; shape: Shape; fill: Fill; outline: Outline; foreground: Foreground; text: Text; shadow: Shadow; connection: Connection; table: Table; chart: Chart; comments: CommentThread[]; /** 元素级结构化滤镜(Effect.filter),转成 CSS filter 后与 style.filter 合并 */ filter: NormalizedFilter; } interface ScrollThumb { x: number; y: number; w: number; h: number; travel: number; span: number; min: number; } export interface ScrollRange { x: { min: number; max: number; }; y: { min: number; max: number; }; content: { w: number; h: number; }; } export declare class Element2D extends Node2D implements Rectangulable { readonly flexbox: Flexbox; readonly aabb: Aabb2D; readonly globalAabb: Aabb2D; protected _parentGlobalDisplay?: Display; protected _globalDisplay?: Display; get globalDisplay(): Display | undefined; readonly size: Vector2; protected _allowPointerEvents: boolean; protected _overflowHidden: boolean; protected _scrollbarMode?: 'scroll' | 'auto'; protected _pointerInside: boolean; protected _scrollbarHoverAxis?: 'x' | 'y'; protected _scrollbarDrag?: { axis: 'x' | 'y'; startScreen: number; startOffset: number; travel: number; span: number; min: number; }; protected _scrollThumbCache: Record<'v' | 'h', { key: string; batchable: any; } | undefined>; protected _style: Element2DStyle; get style(): Element2DStyle; set style(value: Element2DProperties['style'] | undefined); protected _background: Element2DBackground; get background(): Element2DBackground; set background(value: Element2DProperties['background'] | undefined); protected _shape: Element2DShape; get shape(): Element2DShape; set shape(value: Element2DProperties['shape'] | undefined); protected _fill: Element2DFill; get fill(): Element2DFill; set fill(value: Element2DProperties['fill'] | undefined); protected _outline: Element2DOutline; get outline(): Element2DOutline; set outline(value: Element2DProperties['outline'] | undefined); protected _foreground: Element2DForeground; get foreground(): Element2DForeground; set foreground(value: Element2DProperties['foreground'] | undefined); protected _text: Element2DText; get text(): Element2DText; set text(value: Element2DProperties['text'] | undefined); protected _shadow: Element2DShadow; get shadow(): Element2DShadow; set shadow(value: Element2DProperties['shadow'] | undefined); protected _connection: Element2DConnection; get connection(): Element2DConnection; set connection(value: Element2DProperties['connection'] | undefined); protected _table: Element2DTable; get table(): Element2DTable; set table(value: Element2DProperties['table'] | undefined); protected _chart: Element2DChart; get chart(): Element2DChart; set chart(value: Element2DProperties['chart'] | undefined); protected _comments: Element2DComments; get comments(): Element2DComments; set comments(value: Element2DProperties['comments'] | undefined); /** Last routed connection path; identity-compared to skip re-layout when unchanged. */ protected _lastRoutePath?: Path2D; protected _batchDepth: number; protected _pendingTextUpdate: boolean; protected _colorFilterEffect?: ColorFilterEffect; protected _maskEffect?: MaskEffect; constructor(properties?: Partial, nodes?: Node[]); protected _treeEnter(tree: SceneTree): void; setProperties(properties?: Record): this; _updateTransform(): void; /** * 供文字渲染子(Element2DText)在变形/内容改变、渲染范围可能超出布局框时调用, * 按最新的 _getPointArray(已并入变形后字形范围)重算本地/全局 aabb,让选框贴合。 */ updateContentAabb(): void; protected _updateAabb(): void; updateGlobalTransform(): void; protected _updateGlobalAabb(): void; protected _updateMask(): void; protected _updateGlobalDisplay(): void; /** * 批量修改:fn 内对 style 的多次改动只在结束时合并触发一次 text.update()(文字重栅格)。 * 否则逐个改 width/height/fontSize 会各自重栅一次(如 resize 时每帧重栅 3 次)。 */ batch(fn: () => void): void; protected _beginBatch(): void; protected _endBatch(): void; onUpdateStyleProperty(key: string, value: any, oldValue: any): void; protected _updateStyleProperty(key: string, value: any, oldValue: any): void; /** 语义色 token → 实际色(经所属 tree 的当前主题);无 tree / 非 token 时原样返回。 */ protected _resolveThemeColor(value: any): any; /** * 主题变更后重解析本元素的 token 色。仅当 style 里存的是 `@token` 才重设, * 普通字面色不动(用户显式提供的色不受主题影响)。文字色走惰性解析,这里触发重排重栅格。 */ applyThemeColors(): void; requestLayout(): void; protected _process(delta: number): void; protected _updateConnection(): void; /** 上一次渲染时的视口裁剪结果(true=离屏被裁剪)。供非渲染阶段(如 Video2D 解码门控)读取。 */ protected _renderCulled: boolean; protected _cullsRender(): boolean; protected _computeCullsRender(): boolean; protected _intersectsViewport(viewport: Viewport): boolean; protected _styleFilter?: string; protected _elementFilter?: string; protected _updateStyleFilter(value?: string): void; /** 元素级结构化滤镜 Effect.filter → CSS filter,与 style.filter 合并 */ protected _updateElementFilter(filter?: NormalizedFilter): void; protected _applyColorFilter(): void; protected _updateStyleMaskImage(value?: string): void; protected _getPointArray(): Vector2Like[]; getRect(): Aabb2D; getObb(): Obb2D; getGlobalObb(): Obb2D; protected _draw(): void; protected _drawContent(): void; protected _scrollRangeCache?: { rev: number; value: ScrollRange | undefined; }; /** * 内容(子节点本地 AABB 并集)相对自身 box 的可滚动区间。用于滚动条与滚轮: * offset>0 表示内容上/左移、露出下/右侧内容。无子节点返回 undefined。 * * 按全局 geometryRevision 缓存(与连线 route 缓存同款):同一帧内滚轮 handler / * render / thumb 命中检测会多次调用,宿主(如 mce)还经 reactive proxy 访问—— * 子节点上千时每次遍历是数千次 proxy 读,缓存命中则一次都不发生。 */ getScrollRange(): ScrollRange | undefined; protected _computeScrollRange(): ScrollRange | undefined; protected _scrollThumbs(zx: number, zy: number): { v?: ScrollThumb; h?: ScrollThumb; } | undefined; protected _scrollViewport(): Viewport | undefined; render(renderer: WebGLRenderer, next?: () => void): void; protected _drawScrollThumb(renderer: WebGLRenderer, slot: 'v' | 'h', r: ScrollThumb, active: boolean): void; protected _scrollbarInput(event: InputEvent, key: InputEventKey): boolean; input(event: InputEvent, key: InputEventKey): void; protected _positionInput(localPos: Vector2Like, key: InputEventKey): boolean; protected _input(event: InputEvent, key: InputEventKey): void; toJSON(): Record; protected _destroy(): void; } export {};