Spaces:
Running
Running
| /* | |
| * 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 * as zrUtil from 'zrender/src/core/util'; | |
| import ComponentModel from '../../model/Component'; | |
| import Parallel from './Parallel'; | |
| import { DimensionName, ComponentOption, BoxLayoutOptionMixin } from '../../util/types'; | |
| import ParallelAxisModel, { ParallelAxisOption } from './AxisModel'; | |
| import GlobalModel from '../../model/Global'; | |
| import ParallelSeriesModel from '../../chart/parallel/ParallelSeries'; | |
| import SeriesModel from '../../model/Series'; | |
| export type ParallelLayoutDirection = 'horizontal' | 'vertical'; | |
| export interface ParallelCoordinateSystemOption extends ComponentOption, BoxLayoutOptionMixin { | |
| mainType?: 'parallel'; | |
| layout?: ParallelLayoutDirection; | |
| axisExpandable?: boolean; | |
| axisExpandCenter?: number; | |
| axisExpandCount?: number; | |
| axisExpandWidth?: number; // TODO '10%' ? | |
| axisExpandTriggerOn?: 'click' | 'mousemove'; | |
| // Not ready to expose to users yet. | |
| axisExpandRate?: number; | |
| // Not ready to expose to users yet. | |
| axisExpandDebounce?: number; | |
| // Not ready to expose to users yet. | |
| // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full. | |
| // Do not doc to user until necessary. | |
| axisExpandSlideTriggerArea?: [number, number, number]; | |
| // Not ready to expose to users yet. | |
| axisExpandWindow?: number[]; | |
| parallelAxisDefault?: ParallelAxisOption | |
| } | |
| class ParallelModel extends ComponentModel<ParallelCoordinateSystemOption> { | |
| static type = 'parallel'; | |
| readonly type = ParallelModel.type; | |
| static dependencies = ['parallelAxis']; | |
| coordinateSystem: Parallel; | |
| /** | |
| * Each item like: 'dim0', 'dim1', 'dim2', ... | |
| */ | |
| dimensions: DimensionName[]; | |
| /** | |
| * Corresponding to dimensions. | |
| */ | |
| parallelAxisIndex: number[]; | |
| static layoutMode = 'box' as const; | |
| static defaultOption: ParallelCoordinateSystemOption = { | |
| // zlevel: 0, | |
| z: 0, | |
| left: 80, | |
| top: 60, | |
| right: 80, | |
| bottom: 60, | |
| // width: {totalWidth} - left - right, | |
| // height: {totalHeight} - top - bottom, | |
| layout: 'horizontal', // 'horizontal' or 'vertical' | |
| // FIXME | |
| // naming? | |
| axisExpandable: false, | |
| axisExpandCenter: null, | |
| axisExpandCount: 0, | |
| axisExpandWidth: 50, // FIXME '10%' ? | |
| axisExpandRate: 17, | |
| axisExpandDebounce: 50, | |
| // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full. | |
| // Do not doc to user until necessary. | |
| axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4], | |
| axisExpandTriggerOn: 'click', // 'mousemove' or 'click' | |
| parallelAxisDefault: null | |
| }; | |
| init() { | |
| super.init.apply(this, arguments as any); | |
| this.mergeOption({}); | |
| } | |
| mergeOption(newOption: ParallelCoordinateSystemOption) { | |
| const thisOption = this.option; | |
| newOption && zrUtil.merge(thisOption, newOption, true); | |
| this._initDimensions(); | |
| } | |
| /** | |
| * Whether series or axis is in this coordinate system. | |
| */ | |
| contains(model: SeriesModel | ParallelAxisModel, ecModel: GlobalModel): boolean { | |
| const parallelIndex = (model as ParallelSeriesModel).get('parallelIndex'); | |
| return parallelIndex != null | |
| && ecModel.getComponent('parallel', parallelIndex) === this; | |
| } | |
| setAxisExpand(opt: { | |
| axisExpandable?: boolean, | |
| axisExpandCenter?: number, | |
| axisExpandCount?: number, | |
| axisExpandWidth?: number, | |
| axisExpandWindow?: number[] | |
| }): void { | |
| zrUtil.each( | |
| [ | |
| 'axisExpandable', | |
| 'axisExpandCenter', | |
| 'axisExpandCount', | |
| 'axisExpandWidth', | |
| 'axisExpandWindow' | |
| ] as const, | |
| function (name) { | |
| if (opt.hasOwnProperty(name)) { | |
| // @ts-ignore FIXME: why "never" inferred in this.option[name]? | |
| this.option[name] = opt[name]; | |
| } | |
| }, | |
| this | |
| ); | |
| } | |
| private _initDimensions(): void { | |
| const dimensions = this.dimensions = [] as DimensionName[]; | |
| const parallelAxisIndex = this.parallelAxisIndex = [] as number[]; | |
| const axisModels = zrUtil.filter( | |
| this.ecModel.queryComponents({ mainType: 'parallelAxis' }), | |
| function (axisModel: ParallelAxisModel) { | |
| // Can not use this.contains here, because | |
| // initialization has not been completed yet. | |
| return (axisModel.get('parallelIndex') || 0) === this.componentIndex; | |
| }, | |
| this | |
| ); | |
| zrUtil.each(axisModels, function (axisModel: ParallelAxisModel) { | |
| dimensions.push('dim' + axisModel.get('dim')); | |
| parallelAxisIndex.push(axisModel.componentIndex); | |
| }); | |
| } | |
| } | |
| export default ParallelModel; | |