echarts CustomSeries 源码
echarts CustomSeries 代码
文件路径:/src/chart/custom/CustomSeries.ts
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import Displayable from 'zrender/src/graphic/Displayable';
import { ImageProps, ImageStyleProps } from 'zrender/src/graphic/Image';
import { PathProps, PathStyleProps } from 'zrender/src/graphic/Path';
import { ZRenderType } from 'zrender/src/zrender';
import { BarGridLayoutOptionForCustomSeries, BarGridLayoutResult } from '../../layout/barGrid';
import {
AnimationOption,
BlurScope,
CallbackDataParams,
Dictionary,
DimensionLoose,
ItemStyleOption,
LabelOption,
OptionDataValue,
OrdinalRawValue,
ParsedValue,
SeriesDataType,
SeriesEncodeOptionMixin,
SeriesOnCalendarOptionMixin,
SeriesOnCartesianOptionMixin,
SeriesOnGeoOptionMixin,
SeriesOnPolarOptionMixin,
SeriesOnSingleOptionMixin,
SeriesOption,
TextCommonOption,
ZRStyleProps
} from '../../util/types';
import Element from 'zrender/src/Element';
import SeriesData, { DefaultDataVisual } from '../../data/SeriesData';
import GlobalModel from '../../model/Global';
import createSeriesData from '../helper/createSeriesData';
import { makeInner } from '../../util/model';
import { CoordinateSystem } from '../../coord/CoordinateSystem';
import SeriesModel from '../../model/Series';
import {
Arc,
BezierCurve,
Circle,
CompoundPath,
Ellipse,
Line,
Polygon,
Polyline,
Rect,
Ring,
Sector
} from '../../util/graphic';
import { TextProps, TextStyleProps } from 'zrender/src/graphic/Text';
import { GroupProps } from 'zrender/src/graphic/Group';
import {
TransitionOptionMixin,
TransitionBaseDuringAPI,
TransitionDuringAPI
} from '../../animation/customGraphicTransition';
import { TransformProp } from 'zrender/src/core/Transformable';
import { ElementKeyframeAnimationOption } from '../../animation/customGraphicKeyframeAnimation';
export type CustomExtraElementInfo = Dictionary<unknown>;
// Also compat with ec4, where
// `visual('color') visual('borderColor')` is supported.
export const STYLE_VISUAL_TYPE = {
color: 'fill',
borderColor: 'stroke'
} as const;
export type StyleVisualProps = keyof typeof STYLE_VISUAL_TYPE;
export const NON_STYLE_VISUAL_PROPS = {
symbol: 1,
symbolSize: 1,
symbolKeepAspect: 1,
legendIcon: 1,
visualMeta: 1,
liftZ: 1,
decal: 1
} as const;
export type NonStyleVisualProps = keyof typeof NON_STYLE_VISUAL_PROPS;
// Do not declare "Dictionary" in ElementTransitionOptions to restrict the type check.
type ShapeMorphingOption = {
/**
* If do shape morphing animation when type is changed.
* Only available on path.
*/
morph?: boolean
};
export interface CustomBaseElementOption extends Partial<Pick<
Element, TransformProp | 'silent' | 'ignore' | 'textConfig'
>> {
// element type, required.
type: string;
id?: string;
// For animation diff.
name?: string;
info?: CustomExtraElementInfo;
// `false` means remove the textContent.
textContent?: CustomTextOption | false;
// `false` means remove the clipPath
clipPath?: CustomBaseZRPathOption | false;
// `extra` can be set in any el option for custom prop for annimation duration.
extra?: Dictionary<unknown> & TransitionOptionMixin;
// updateDuringAnimation
during?(params: TransitionBaseDuringAPI): void;
enterAnimation?: AnimationOption
updateAnimation?: AnimationOption
leaveAnimation?: AnimationOption
};
export interface CustomDisplayableOption extends CustomBaseElementOption, Partial<Pick<
Displayable, 'zlevel' | 'z' | 'z2' | 'invisible'
>> {
style?: ZRStyleProps;
during?(params: TransitionDuringAPI): void;
/**
* @deprecated
*/
// `false` means remove emphasis trigger.
styleEmphasis?: ZRStyleProps | false;
emphasis?: CustomDisplayableOptionOnState;
blur?: CustomDisplayableOptionOnState;
select?: CustomDisplayableOptionOnState;
}
export interface CustomDisplayableOptionOnState extends Partial<Pick<
Displayable, TransformProp | 'textConfig' | 'z2'
>> {
// `false` means remove emphasis trigger.
style?: ZRStyleProps | false;
}
export interface CustomGroupOption extends CustomBaseElementOption, TransitionOptionMixin<GroupProps>{
type: 'group';
width?: number;
height?: number;
// @deprecated
diffChildrenByName?: boolean;
children: CustomElementOption[];
$mergeChildren?: false | 'byName' | 'byIndex';
keyframeAnimation?: ElementKeyframeAnimationOption<GroupProps> | ElementKeyframeAnimationOption<GroupProps>[]
}
export interface CustomBaseZRPathOption<T extends PathProps['shape'] = PathProps['shape']>
extends CustomDisplayableOption, ShapeMorphingOption, TransitionOptionMixin<PathProps & {shape: T}> {
autoBatch?: boolean;
shape?: T & TransitionOptionMixin<T>;
style?: PathProps['style'] & TransitionOptionMixin<PathStyleProps>
during?(params: TransitionDuringAPI<PathStyleProps, T>): void;
keyframeAnimation?: ElementKeyframeAnimationOption<PathProps & { shape: T }>
| ElementKeyframeAnimationOption<PathProps & { shape: T }>[]
}
interface BuiltinShapes {
circle: Partial<Circle['shape']>
rect: Partial<Rect['shape']>
sector: Partial<Sector['shape']>
polygon: Partial<Polygon['shape']>
polyline: Partial<Polyline['shape']>
line: Partial<Line['shape']>
arc: Partial<Arc['shape']>
bezierCurve: Partial<BezierCurve['shape']>
ring: Partial<Ring['shape']>
ellipse: Partial<Ellipse['shape']>
compoundPath: Partial<CompoundPath['shape']>
}
interface CustomSVGPathShapeOption {
// SVG Path, like 'M0,0 L0,-20 L70,-1 L70,0 Z'
pathData?: string;
// "d" is the alias of `pathData` follows the SVG convention.
d?: string;
layout?: 'center' | 'cover';
x?: number;
y?: number;
width?: number;
height?: number;
}
export interface CustomSVGPathOption extends CustomBaseZRPathOption<CustomSVGPathShapeOption> {
type: 'path';
}
interface CustomBuitinPathOption<T extends keyof BuiltinShapes>
extends CustomBaseZRPathOption<BuiltinShapes[T]> {
type: T
}
type CreateCustomBuitinPathOption<T extends keyof BuiltinShapes> = T extends any
? CustomBuitinPathOption<T> : never;
export type CustomPathOption = CreateCustomBuitinPathOption<keyof BuiltinShapes>
| CustomSVGPathOption;
export interface CustomImageOptionOnState extends CustomDisplayableOptionOnState {
style?: ImageStyleProps;
}
export interface CustomImageOption extends CustomDisplayableOption, TransitionOptionMixin<ImageProps> {
type: 'image';
style?: ImageStyleProps & TransitionOptionMixin<ImageStyleProps>;
emphasis?: CustomImageOptionOnState;
blur?: CustomImageOptionOnState;
select?: CustomImageOptionOnState;
keyframeAnimation?: ElementKeyframeAnimationOption<ImageProps> | ElementKeyframeAnimationOption<ImageProps>[]
}
export interface CustomTextOptionOnState extends CustomDisplayableOptionOnState {
style?: TextStyleProps;
}
export interface CustomTextOption extends CustomDisplayableOption, TransitionOptionMixin<TextProps> {
type: 'text';
style?: TextStyleProps & TransitionOptionMixin<TextStyleProps>;
emphasis?: CustomTextOptionOnState;
blur?: CustomTextOptionOnState;
select?: CustomTextOptionOnState;
keyframeAnimation?: ElementKeyframeAnimationOption<TextProps> | ElementKeyframeAnimationOption<TextProps>[]
}
export type CustomElementOption = CustomPathOption
| CustomImageOption
| CustomTextOption
| CustomGroupOption;
// Can only set focus, blur on the root element.
export type CustomRootElementOption = CustomElementOption & {
focus?: 'none' | 'self' | 'series' | ArrayLike<number>
blurScope?: BlurScope
emphasisDisabled?: boolean
};
export type CustomElementOptionOnState = CustomDisplayableOptionOnState
| CustomImageOptionOnState;
export interface CustomSeriesRenderItemAPI extends
CustomSeriesRenderItemCoordinateSystemAPI {
// Methods from ExtensionAPI.
// NOTE: Not using Pick<ExtensionAPI> here because we don't want to bundle ExtensionAPI into the d.ts
getWidth(): number
getHeight(): number
getZr(): ZRenderType
getDevicePixelRatio(): number
value(dim: DimensionLoose, dataIndexInside?: number): ParsedValue;
ordinalRawValue(dim: DimensionLoose, dataIndexInside?: number): ParsedValue | OrdinalRawValue;
/**
* @deprecated
*/
style(userProps?: ZRStyleProps, dataIndexInside?: number): ZRStyleProps;
/**
* @deprecated
*/
styleEmphasis(userProps?: ZRStyleProps, dataIndexInside?: number): ZRStyleProps;
visual<VT extends NonStyleVisualProps | StyleVisualProps>(
visualType: VT,
dataIndexInside?: number
): VT extends NonStyleVisualProps ? DefaultDataVisual[VT]
: VT extends StyleVisualProps ? PathStyleProps[typeof STYLE_VISUAL_TYPE[VT]]
: void;
barLayout(opt: BarGridLayoutOptionForCustomSeries): BarGridLayoutResult;
currentSeriesIndices(): number[];
font(opt: Pick<TextCommonOption, 'fontStyle' | 'fontWeight' | 'fontSize' | 'fontFamily'>): string;
}
export interface CustomSeriesRenderItemParamsCoordSys {
type: string;
// And extra params for each coordinate systems.
}
export interface CustomSeriesRenderItemCoordinateSystemAPI {
coord(
data: OptionDataValue | OptionDataValue[],
clamp?: boolean
): number[];
size?(
dataSize: OptionDataValue | OptionDataValue[],
dataItem?: OptionDataValue | OptionDataValue[]
): number | number[];
}
export type WrapEncodeDefRet = Dictionary<number[]>;
export interface CustomSeriesRenderItemParams {
context: Dictionary<unknown>;
dataIndex: number;
seriesId: string;
seriesName: string;
seriesIndex: number;
coordSys: CustomSeriesRenderItemParamsCoordSys;
encode: WrapEncodeDefRet;
dataIndexInside: number;
dataInsideLength: number;
actionType?: string;
}
export type CustomSeriesRenderItemReturn = CustomRootElementOption | undefined | null;
export type CustomSeriesRenderItem = (
params: CustomSeriesRenderItemParams,
api: CustomSeriesRenderItemAPI
) => CustomSeriesRenderItemReturn;
export interface CustomSeriesOption extends
SeriesOption<unknown>, // don't support StateOption in custom series.
SeriesEncodeOptionMixin,
SeriesOnCartesianOptionMixin,
SeriesOnPolarOptionMixin,
SeriesOnSingleOptionMixin,
SeriesOnGeoOptionMixin,
SeriesOnCalendarOptionMixin {
type?: 'custom'
// If set as 'none', do not depends on coord sys.
coordinateSystem?: string | 'none';
renderItem?: CustomSeriesRenderItem;
/**
* @deprecated
*/
itemStyle?: ItemStyleOption;
/**
* @deprecated
*/
label?: LabelOption;
/**
* @deprecated
*/
emphasis?: {
/**
* @deprecated
*/
itemStyle?: ItemStyleOption;
/**
* @deprecated
*/
label?: LabelOption;
}
// Only works on polar and cartesian2d coordinate system.
clip?: boolean;
}
export const customInnerStore = makeInner<{
info: CustomExtraElementInfo;
customPathData: string;
customGraphicType: string;
customImagePath: CustomImageOption['style']['image'];
// customText: string;
txConZ2Set: number;
option: CustomElementOption;
}, Element>();
export default class CustomSeriesModel extends SeriesModel<CustomSeriesOption> {
static type = 'series.custom';
readonly type = CustomSeriesModel.type;
static dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar'];
// preventAutoZ = true;
currentZLevel: number;
currentZ: number;
static defaultOption: CustomSeriesOption = {
coordinateSystem: 'cartesian2d', // Can be set as 'none'
// zlevel: 0,
z: 2,
legendHoverLink: true,
// Custom series will not clip by default.
// Some case will use custom series to draw label
// For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight
clip: false
// Cartesian coordinate system
// xAxisIndex: 0,
// yAxisIndex: 0,
// Polar coordinate system
// polarIndex: 0,
// Geo coordinate system
// geoIndex: 0,
};
optionUpdated() {
this.currentZLevel = this.get('zlevel', true);
this.currentZ = this.get('z', true);
}
getInitialData(option: CustomSeriesOption, ecModel: GlobalModel): SeriesData {
return createSeriesData(null, this);
}
getDataParams(dataIndex: number, dataType?: SeriesDataType, el?: Element): CallbackDataParams & {
info: CustomExtraElementInfo
} {
const params = super.getDataParams(dataIndex, dataType) as ReturnType<CustomSeriesModel['getDataParams']>;
el && (params.info = customInnerStore(el).info);
return params;
}
}
export type PrepareCustomInfo = (coordSys: CoordinateSystem) => {
coordSys: CustomSeriesRenderItemParamsCoordSys;
api: CustomSeriesRenderItemCoordinateSystemAPI
};
相关信息
相关文章
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦