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