| /* | 
 | * 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; |