| /* | 
 | * 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 * as visualSolution from '../../visual/visualSolution'; | 
 | import Model from '../../model/Model'; | 
 | import { ComponentOption, ZRColor, VisualOptionFixed } from '../../util/types'; | 
 | import ComponentModel from '../../model/Component'; | 
 | import BrushTargetManager from '../helper/BrushTargetManager'; | 
 | import { | 
 |     BrushCoverCreatorConfig, BrushMode, BrushCoverConfig, BrushDimensionMinMax, | 
 |     BrushAreaRange, BrushTypeUncertain, BrushType | 
 | } from '../helper/BrushController'; | 
 | import { ModelFinderObject } from '../../util/model'; | 
 |  | 
 | const DEFAULT_OUT_OF_BRUSH_COLOR = '#ddd'; | 
 |  | 
 | /** | 
 |  * The input to define brush areas. | 
 |  * (1) Can be created by user when calling dispatchAction. | 
 |  * (2) Can be created by `BrushController` | 
 |  * for brush behavior. area params are picked from `cover.__brushOptoin`. | 
 |  * In `BrushController`, "covers" are create or updated for each "area". | 
 |  */ | 
 | export interface BrushAreaParam extends ModelFinderObject { | 
 |     brushType: BrushCoverConfig['brushType']; | 
 |     id?: BrushCoverConfig['id']; | 
 |     range?: BrushCoverConfig['range']; | 
 |  | 
 |     // `ModelFinderObject` and `panelId` are used to match "coord sys target" | 
 |     // for this area. See `BrushTargetManager['setInputRanges']`. | 
 |     // If panelId specified, use it to match panel firstly. | 
 |     // If not specified, use `ModelFinderObject` to match panel, | 
 |     // and then assign the panelId to the area. | 
 |     // If finally no panel matched, panelId keep null/undefined, | 
 |     // means global area. | 
 |     // PENDING: this feature should better belong to BrushController | 
 |     // rather than brush component? | 
 |     panelId?: BrushCoverConfig['panelId']; | 
 |  | 
 |     // Range in local coordinates of certain coordinate system. | 
 |     // When dispatchAction, if the area is the global area, | 
 |     // `range` is the input. if the area is not the global area, | 
 |     // `coordRange` is the input, and then convert to `range`. | 
 |     coordRange?: BrushAreaRange; | 
 |     // coord ranges, used in multiple cartesian in one grid. | 
 |     // Only for output to users. | 
 |     coordRanges?: BrushAreaRange[]; | 
 |  | 
 |     __rangeOffset?: { | 
 |         offset: BrushDimensionMinMax[] | BrushDimensionMinMax, | 
 |         xyMinMax: BrushDimensionMinMax[] | 
 |     } | 
 | } | 
 |  | 
 | /** | 
 |  * Generated by `brushModel.setAreas`, which merges | 
 |  * `area: BrushAreaParam` and `brushModel.option: BrushOption`. | 
 |  * See `generateBrushOption`. | 
 |  */ | 
 | export interface BrushAreaParamInternal extends BrushAreaParam { | 
 |     brushMode: BrushMode; | 
 |     brushStyle: BrushCoverConfig['brushStyle']; | 
 |     transformable: BrushCoverConfig['transformable']; | 
 |     removeOnClick: BrushCoverConfig['removeOnClick']; | 
 |     z: BrushCoverConfig['z']; | 
 |  | 
 |     __rangeOffset?: { | 
 |         offset: BrushDimensionMinMax | BrushDimensionMinMax[]; | 
 |         xyMinMax: BrushDimensionMinMax[] | 
 |     }; | 
 | } | 
 |  | 
 | export type BrushToolboxIconType = BrushType | 'keep' | 'clear'; | 
 |  | 
 | export interface BrushOption extends ComponentOption, ModelFinderObject { | 
 |     mainType?: 'brush'; | 
 |  | 
 |     // Default value see preprocessor. | 
 |     toolbox?: BrushToolboxIconType[]; | 
 |  | 
 |     // Series indices array, broadcast using dataIndex. | 
 |     // or 'all', which means all series. 'none'/null/undefined means no series. | 
 |     brushLink?: number[] | 'all' | 'none'; | 
 |  | 
 |     // Throttle in brushSelected event. 'fixRate' or 'debounce'. | 
 |     // If null, no throttle. Valid only in the first brush component | 
 |     throttleType?: 'fixRate' | 'debounce'; | 
 |     // Unit: ms, 0 means every event will be triggered. | 
 |     throttleDelay?: number; | 
 |  | 
 |     inBrush?: VisualOptionFixed; | 
 |     outOfBrush?: VisualOptionFixed; | 
 |  | 
 |     // --- Current painting brush options --- | 
 |     // Default type of brush | 
 |     brushType?: BrushTypeUncertain; | 
 |     brushStyle?: { | 
 |         borderWidth?: number; | 
 |         color?: ZRColor; | 
 |         borderColor?: ZRColor; | 
 |     }; | 
 |     transformable?: boolean; | 
 |     brushMode?: BrushMode; | 
 |     removeOnClick?: boolean; | 
 | } | 
 |  | 
 | class BrushModel extends ComponentModel<BrushOption> { | 
 |  | 
 |     static type = 'brush' as const; | 
 |     type = BrushModel.type; | 
 |  | 
 |     static dependencies = ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series']; | 
 |  | 
 |     static defaultOption: BrushOption = { | 
 |         seriesIndex: 'all', | 
 |         brushType: 'rect', | 
 |         brushMode: 'single', | 
 |         transformable: true, | 
 |         brushStyle: { | 
 |             borderWidth: 1, | 
 |             color: 'rgba(210,219,238,0.3)', | 
 |             borderColor: '#D2DBEE' | 
 |         }, | 
 |         throttleType: 'fixRate', | 
 |         throttleDelay: 0, | 
 |         removeOnClick: true, | 
 |         z: 10000 | 
 |     }; | 
 |  | 
 |     /** | 
 |      * @readOnly | 
 |      */ | 
 |     areas: BrushAreaParamInternal[] = []; | 
 |  | 
 |     /** | 
 |      * Current activated brush type. | 
 |      * If null, brush is inactived. | 
 |      * see module:echarts/component/helper/BrushController | 
 |      * @readOnly | 
 |      */ | 
 |     brushType: BrushTypeUncertain; | 
 |  | 
 |     /** | 
 |      * Current brush painting area settings. | 
 |      * @readOnly | 
 |      */ | 
 |     brushOption: BrushCoverCreatorConfig = {} as BrushCoverCreatorConfig; | 
 |  | 
 |     // Inject | 
 |     brushTargetManager: BrushTargetManager; | 
 |  | 
 |  | 
 |     optionUpdated(newOption: BrushOption, isInit: boolean): void { | 
 |         const thisOption = this.option; | 
 |  | 
 |         !isInit && visualSolution.replaceVisualOption( | 
 |             thisOption, newOption, ['inBrush', 'outOfBrush'] | 
 |         ); | 
 |  | 
 |         const inBrush = thisOption.inBrush = thisOption.inBrush || {}; | 
 |         // Always give default visual, consider setOption at the second time. | 
 |         thisOption.outOfBrush = thisOption.outOfBrush || {color: DEFAULT_OUT_OF_BRUSH_COLOR}; | 
 |  | 
 |         if (!inBrush.hasOwnProperty('liftZ')) { | 
 |             // Bigger than the highlight z lift, otherwise it will | 
 |             // be effected by the highlight z when brush. | 
 |             inBrush.liftZ = 5; | 
 |         } | 
 |     } | 
 |  | 
 |     /** | 
 |      * If `areas` is null/undefined, range state remain. | 
 |      */ | 
 |     setAreas(areas?: BrushAreaParam[]): void { | 
 |         if (__DEV__) { | 
 |             zrUtil.assert(zrUtil.isArray(areas)); | 
 |             zrUtil.each(areas, function (area) { | 
 |                 zrUtil.assert(area.brushType, 'Illegal areas'); | 
 |             }); | 
 |         } | 
 |  | 
 |         // If areas is null/undefined, range state remain. | 
 |         // This helps user to dispatchAction({type: 'brush'}) with no areas | 
 |         // set but just want to get the current brush select info from a `brush` event. | 
 |         if (!areas) { | 
 |             return; | 
 |         } | 
 |  | 
 |         this.areas = zrUtil.map(areas, function (area) { | 
 |             return generateBrushOption(this.option, area); | 
 |         }, this); | 
 |     } | 
 |  | 
 |     /** | 
 |      * Set the current painting brush option. | 
 |      */ | 
 |     setBrushOption(brushOption: BrushCoverCreatorConfig): void { | 
 |         this.brushOption = generateBrushOption(this.option, brushOption); | 
 |         this.brushType = this.brushOption.brushType; | 
 |     } | 
 |  | 
 | } | 
 |  | 
 |  | 
 | function generateBrushOption( | 
 |     option: BrushOption, brushOption: BrushAreaParam | 
 | ): BrushAreaParamInternal; | 
 | function generateBrushOption( | 
 |     option: BrushOption, brushOption: BrushCoverCreatorConfig | 
 | ): BrushCoverCreatorConfig; | 
 | function generateBrushOption( | 
 |     option: BrushOption, brushOption: BrushAreaParam | BrushCoverCreatorConfig | 
 | ): BrushAreaParamInternal | BrushCoverCreatorConfig { | 
 |     return zrUtil.merge( | 
 |         { | 
 |             brushType: option.brushType, | 
 |             brushMode: option.brushMode, | 
 |             transformable: option.transformable, | 
 |             brushStyle: new Model(option.brushStyle).getItemStyle(), | 
 |             removeOnClick: option.removeOnClick, | 
 |             z: option.z | 
 |         }, | 
 |         brushOption, | 
 |         true | 
 |     ); | 
 | } | 
 |  | 
 | export default BrushModel; |