import type { DisplayObjectConfig } from '@antv/g';
import type { Graph } from '../runtime/graph';
import type { ElementDatum, StyleIterationContext } from '../types';
/**
* 计算支持回调的动态样式
*
* compute dynamic style that supports callback
* @param callableStyle - 动态样式 | dynamic style
* @param context - 样式计算迭代上下文 | style iteration context
* @returns 静态样式 | static style
*/
export function computeElementCallbackStyle(
callableStyle:
| Record
| ((this: Graph, datum: ElementDatum) => Record)
| {
[key: string]: (this: Graph, datum: ElementDatum) => unknown;
},
context: StyleIterationContext,
) {
const { datum, graph } = context;
if (typeof callableStyle === 'function') return callableStyle.call(graph, datum);
return Object.fromEntries(
Object.entries(callableStyle).map(([key, style]) => {
if (typeof style === 'function') return [key, style.call(graph, datum)];
return [key, style];
}),
);
}
/**
* 合并图形配置项
*
* Merge shape configuration
* @param defaultOptions - 配置项1 | configuration 1
* @param modifiedOptions - 配置项2 | configuration 2
* @returns 合并后的配置项 | merged configuration
*/
export function mergeOptions(
defaultOptions: DisplayObjectConfig,
modifiedOptions: DisplayObjectConfig,
): DisplayObjectConfig {
const s1 = defaultOptions?.style || {};
const s2 = modifiedOptions?.style || {};
for (const key in s1) {
if (!(key in s2)) s2[key] = s1[key];
}
return Object.assign({}, defaultOptions, modifiedOptions, {
style: s2,
});
}
/**
* 获取图形子图形样式
*
* Get the style of the sub-shape of the shape
* @param style - 图形样式 | shape style
* @returns 子图形样式 | sub-shape style
* @remarks
* 从给定的属性对象中提取图形样式属性。删除特定的属性,如位置、变换和类名
*
* Extracts the shape styles from a given attribute object.
* Removes specific styles like position, transformation, and class name.
*/
export function getSubShapeStyle>(
style: T,
): Omit {
const { x, y, z, class: cls, className, transform, transformOrigin, zIndex, visibility, ...rest } = style;
return rest;
}