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