echarts helper 源码
echarts helper 代码
文件路径:/src/component/dataZoom/helper.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 { Payload } from '../../util/types';
import GlobalModel from '../../model/Global';
import DataZoomModel from './DataZoomModel';
import { indexOf, createHashMap, assert, HashMap } from 'zrender/src/core/util';
import SeriesModel from '../../model/Series';
import { CoordinateSystemHostModel } from '../../coord/CoordinateSystem';
import { AxisBaseModel } from '../../coord/AxisBaseModel';
export interface DataZoomPayloadBatchItem {
dataZoomId: string;
start?: number;
end?: number;
startValue?: number;
endValue?: number;
}
export interface DataZoomReferCoordSysInfo {
model: CoordinateSystemHostModel;
// Notice: if two dataZooms refer the same coordinamte system model,
// (1) The axis they refered may different
// (2) The sequence the axisModels matters, may different in
// different dataZooms.
axisModels: AxisBaseModel[];
}
export const DATA_ZOOM_AXIS_DIMENSIONS = [
'x', 'y', 'radius', 'angle', 'single'
] as const;
export type DataZoomAxisDimension =
'x' | 'y' | 'radius' | 'angle' | 'single';
type DataZoomAxisMainType =
'xAxis' | 'yAxis' | 'radiusAxis' | 'angleAxis' | 'singleAxis';
type DataZoomAxisIndexPropName =
'xAxisIndex' | 'yAxisIndex' | 'radiusAxisIndex' | 'angleAxisIndex' | 'singleAxisIndex';
type DataZoomAxisIdPropName =
'xAxisId' | 'yAxisId' | 'radiusAxisId' | 'angleAxisId' | 'singleAxisId';
export type DataZoomCoordSysMainType = 'polar' | 'grid' | 'singleAxis';
// Supported coords.
// FIXME: polar has been broken (but rarely used).
const SERIES_COORDS = ['cartesian2d', 'polar', 'singleAxis'] as const;
export function isCoordSupported(seriesModel: SeriesModel): boolean {
const coordType = seriesModel.get('coordinateSystem');
return indexOf(SERIES_COORDS, coordType) >= 0;
}
export function getAxisMainType(axisDim: DataZoomAxisDimension): DataZoomAxisMainType {
if (__DEV__) {
assert(axisDim);
}
return axisDim + 'Axis' as DataZoomAxisMainType;
}
export function getAxisIndexPropName(axisDim: DataZoomAxisDimension): DataZoomAxisIndexPropName {
if (__DEV__) {
assert(axisDim);
}
return axisDim + 'AxisIndex' as DataZoomAxisIndexPropName;
}
export function getAxisIdPropName(axisDim: DataZoomAxisDimension): DataZoomAxisIdPropName {
if (__DEV__) {
assert(axisDim);
}
return axisDim + 'AxisId' as DataZoomAxisIdPropName;
}
/**
* If two dataZoomModels has the same axis controlled, we say that they are 'linked'.
* This function finds all linked dataZoomModels start from the given payload.
*/
export function findEffectedDataZooms(ecModel: GlobalModel, payload: Payload): DataZoomModel[] {
// Key: `DataZoomAxisDimension`
const axisRecords = createHashMap<boolean[], DataZoomAxisDimension>();
const effectedModels: DataZoomModel[] = [];
// Key: uid of dataZoomModel
const effectedModelMap = createHashMap<boolean>();
// Find the dataZooms specified by payload.
ecModel.eachComponent(
{ mainType: 'dataZoom', query: payload },
function (dataZoomModel: DataZoomModel) {
if (!effectedModelMap.get(dataZoomModel.uid)) {
addToEffected(dataZoomModel);
}
}
);
// Start from the given dataZoomModels, travel the graph to find
// all of the linked dataZoom models.
let foundNewLink;
do {
foundNewLink = false;
ecModel.eachComponent('dataZoom', processSingle);
}
while (foundNewLink);
function processSingle(dataZoomModel: DataZoomModel): void {
if (!effectedModelMap.get(dataZoomModel.uid) && isLinked(dataZoomModel)) {
addToEffected(dataZoomModel);
foundNewLink = true;
}
}
function addToEffected(dataZoom: DataZoomModel): void {
effectedModelMap.set(dataZoom.uid, true);
effectedModels.push(dataZoom);
markAxisControlled(dataZoom);
}
function isLinked(dataZoomModel: DataZoomModel): boolean {
let isLink = false;
dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {
const axisIdxArr = axisRecords.get(axisDim);
if (axisIdxArr && axisIdxArr[axisIndex]) {
isLink = true;
}
});
return isLink;
}
function markAxisControlled(dataZoomModel: DataZoomModel) {
dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {
(
axisRecords.get(axisDim) || axisRecords.set(axisDim, [])
)[axisIndex] = true;
});
}
return effectedModels;
}
/**
* Find the first target coordinate system.
* Available after model built.
*
* @return Like {
* grid: [
* {model: coord0, axisModels: [axis1, axis3], coordIndex: 1},
* {model: coord1, axisModels: [axis0, axis2], coordIndex: 0},
* ...
* ], // cartesians must not be null/undefined.
* polar: [
* {model: coord0, axisModels: [axis4], coordIndex: 0},
* ...
* ], // polars must not be null/undefined.
* singleAxis: [
* {model: coord0, axisModels: [], coordIndex: 0}
* ]
* }
*/
export function collectReferCoordSysModelInfo(dataZoomModel: DataZoomModel): {
infoList: DataZoomReferCoordSysInfo[];
// Key: coordSysModel.uid
infoMap: HashMap<DataZoomReferCoordSysInfo, string>;
} {
const ecModel = dataZoomModel.ecModel;
const coordSysInfoWrap = {
infoList: [] as DataZoomReferCoordSysInfo[],
infoMap: createHashMap<DataZoomReferCoordSysInfo, string>()
};
dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {
const axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex) as AxisBaseModel;
if (!axisModel) {
return;
}
const coordSysModel = axisModel.getCoordSysModel();
if (!coordSysModel) {
return;
}
const coordSysUid = coordSysModel.uid;
let coordSysInfo = coordSysInfoWrap.infoMap.get(coordSysUid);
if (!coordSysInfo) {
coordSysInfo = { model: coordSysModel, axisModels: [] };
coordSysInfoWrap.infoList.push(coordSysInfo);
coordSysInfoWrap.infoMap.set(coordSysUid, coordSysInfo);
}
coordSysInfo.axisModels.push(axisModel);
});
return coordSysInfoWrap;
}
相关信息
相关文章
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦