| /* | 
 | * 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 BrushController, { BrushControllerEvents, BrushCoverConfig } from '../helper/BrushController'; | 
 | import {layoutCovers} from './visualEncoding'; | 
 | import BrushModel from './BrushModel'; | 
 | import GlobalModel from '../../model/Global'; | 
 | import ExtensionAPI from '../../core/ExtensionAPI'; | 
 | import { Payload } from '../../util/types'; | 
 | import ComponentView from '../../view/Component'; | 
 |  | 
 |  | 
 | class BrushView extends ComponentView { | 
 |  | 
 |     static type = 'brush'; | 
 |     readonly type = BrushView.type; | 
 |  | 
 |     ecModel: GlobalModel; | 
 |     api: ExtensionAPI; | 
 |     model: BrushModel; | 
 |     private _brushController: BrushController; | 
 |  | 
 |     init(ecModel: GlobalModel, api: ExtensionAPI): void { | 
 |         this.ecModel = ecModel; | 
 |         this.api = api; | 
 |         this.model; | 
 |  | 
 |         (this._brushController = new BrushController(api.getZr())) | 
 |             .on('brush', zrUtil.bind(this._onBrush, this)) | 
 |             .mount(); | 
 |     } | 
 |  | 
 |     render(brushModel: BrushModel, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload): void { | 
 |         this.model = brushModel; | 
 |         this._updateController(brushModel, ecModel, api, payload); | 
 |     } | 
 |  | 
 |     updateTransform(brushModel: BrushModel, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload) { | 
 |         // PENDING: `updateTransform` is a little tricky, whose layout need | 
 |         // to be calculate mandatorily and other stages will not be performed. | 
 |         // Take care the correctness of the logic. See #11754 . | 
 |         layoutCovers(ecModel); | 
 |         this._updateController(brushModel, ecModel, api, payload); | 
 |     } | 
 |  | 
 |     updateVisual(brushModel: BrushModel, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload) { | 
 |         this.updateTransform(brushModel, ecModel, api, payload); | 
 |     } | 
 |  | 
 |     updateView(brushModel: BrushModel, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload) { | 
 |         this._updateController(brushModel, ecModel, api, payload); | 
 |     } | 
 |  | 
 |     private _updateController(brushModel: BrushModel, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload) { | 
 |         // Do not update controller when drawing. | 
 |         (!payload || payload.$from !== brushModel.id) && this._brushController | 
 |             .setPanels(brushModel.brushTargetManager.makePanelOpts(api)) | 
 |             .enableBrush(brushModel.brushOption) | 
 |             .updateCovers(brushModel.areas.slice() as BrushCoverConfig[]); | 
 |     } | 
 |  | 
 |     // updateLayout: updateController, | 
 |  | 
 |     // updateVisual: updateController, | 
 |  | 
 |     dispose() { | 
 |         this._brushController.dispose(); | 
 |     } | 
 |  | 
 |     private _onBrush(eventParam: BrushControllerEvents['brush']): void { | 
 |         const modelId = this.model.id; | 
 |  | 
 |         const areas = this.model.brushTargetManager.setOutputRanges(eventParam.areas, this.ecModel); | 
 |  | 
 |         // Action is not dispatched on drag end, because the drag end | 
 |         // emits the same params with the last drag move event, and | 
 |         // may have some delay when using touch pad, which makes | 
 |         // animation not smooth (when using debounce). | 
 |         (!eventParam.isEnd || eventParam.removeOnClick) && this.api.dispatchAction({ | 
 |             type: 'brush', | 
 |             brushId: modelId, | 
 |             areas: zrUtil.clone(areas), | 
 |             $from: modelId | 
 |         }); | 
 |         eventParam.isEnd && this.api.dispatchAction({ | 
 |             type: 'brushEnd', | 
 |             brushId: modelId, | 
 |             areas: zrUtil.clone(areas), | 
 |             $from: modelId | 
 |         }); | 
 |     } | 
 |  | 
 | } | 
 |  | 
 | export default BrushView; |