|  | /* | 
|  | * 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 {Group, Rect} from '../../util/graphic'; | 
|  | import * as formatUtil from '../../util/format'; | 
|  | import * as layout from '../../util/layout'; | 
|  | import VisualMapping from '../../visual/VisualMapping'; | 
|  | import ComponentView from '../../view/Component'; | 
|  | import GlobalModel from '../../model/Global'; | 
|  | import ExtensionAPI from '../../core/ExtensionAPI'; | 
|  | import VisualMapModel from './VisualMapModel'; | 
|  | import { VisualOptionUnit, ColorString } from '../../util/types'; | 
|  |  | 
|  | type VisualState = VisualMapModel['stateList'][number]; | 
|  |  | 
|  | class VisualMapView extends ComponentView { | 
|  | static type = 'visualMap'; | 
|  | type = VisualMapView.type; | 
|  |  | 
|  | autoPositionValues = {left: 1, right: 1, top: 1, bottom: 1} as const; | 
|  |  | 
|  | ecModel: GlobalModel; | 
|  |  | 
|  | api: ExtensionAPI; | 
|  |  | 
|  | visualMapModel: VisualMapModel; | 
|  |  | 
|  | init(ecModel: GlobalModel, api: ExtensionAPI) { | 
|  | this.ecModel = ecModel; | 
|  | this.api = api; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @protected | 
|  | */ | 
|  | render( | 
|  | visualMapModel: VisualMapModel, | 
|  | ecModel: GlobalModel, | 
|  | api: ExtensionAPI, | 
|  | payload: unknown    // TODO: TYPE | 
|  | ) { | 
|  | this.visualMapModel = visualMapModel; | 
|  |  | 
|  | if (visualMapModel.get('show') === false) { | 
|  | this.group.removeAll(); | 
|  | return; | 
|  | } | 
|  |  | 
|  | this.doRender(visualMapModel, ecModel, api, payload); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @protected | 
|  | */ | 
|  | renderBackground(group: Group) { | 
|  | const visualMapModel = this.visualMapModel; | 
|  | const padding = formatUtil.normalizeCssArray(visualMapModel.get('padding') || 0); | 
|  | const rect = group.getBoundingRect(); | 
|  |  | 
|  | group.add(new Rect({ | 
|  | z2: -1, // Lay background rect on the lowest layer. | 
|  | silent: true, | 
|  | shape: { | 
|  | x: rect.x - padding[3], | 
|  | y: rect.y - padding[0], | 
|  | width: rect.width + padding[3] + padding[1], | 
|  | height: rect.height + padding[0] + padding[2] | 
|  | }, | 
|  | style: { | 
|  | fill: visualMapModel.get('backgroundColor'), | 
|  | stroke: visualMapModel.get('borderColor'), | 
|  | lineWidth: visualMapModel.get('borderWidth') | 
|  | } | 
|  | })); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @protected | 
|  | * @param targetValue can be Infinity or -Infinity | 
|  | * @param visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize' | 
|  | * @param opts | 
|  | * @param opts.forceState Specify state, instead of using getValueState method. | 
|  | * @param opts.convertOpacityToAlpha For color gradient in controller widget. | 
|  | * @return {*} Visual value. | 
|  | */ | 
|  | protected getControllerVisual( | 
|  | targetValue: number, | 
|  | visualCluster: 'color' | 'opacity' | 'symbol' | 'symbolSize', | 
|  | opts?: { | 
|  | forceState?: VisualState | 
|  | convertOpacityToAlpha?: boolean | 
|  | } | 
|  | ) { | 
|  |  | 
|  | opts = opts || {}; | 
|  |  | 
|  | const forceState = opts.forceState; | 
|  | const visualMapModel = this.visualMapModel; | 
|  | const visualObj: {[key in typeof visualCluster]?: VisualOptionUnit[key]} = {}; | 
|  |  | 
|  | // Default values. | 
|  | if (visualCluster === 'color') { | 
|  | const defaultColor = visualMapModel.get('contentColor'); | 
|  | visualObj.color = defaultColor as ColorString; | 
|  | } | 
|  |  | 
|  | function getter(key: typeof visualCluster) { | 
|  | return visualObj[key]; | 
|  | } | 
|  |  | 
|  | function setter(key: typeof visualCluster, value: any) { | 
|  | (visualObj as any)[key] = value; | 
|  | } | 
|  |  | 
|  | const mappings = visualMapModel.controllerVisuals[ | 
|  | forceState || visualMapModel.getValueState(targetValue) | 
|  | ]; | 
|  | const visualTypes = VisualMapping.prepareVisualTypes(mappings); | 
|  |  | 
|  | zrUtil.each(visualTypes, function (type) { | 
|  | let visualMapping = mappings[type]; | 
|  | if (opts.convertOpacityToAlpha && type === 'opacity') { | 
|  | type = 'colorAlpha'; | 
|  | visualMapping = mappings.__alphaForOpacity; | 
|  | } | 
|  | if (VisualMapping.dependsOn(type, visualCluster)) { | 
|  | visualMapping && visualMapping.applyVisual( | 
|  | targetValue, getter, setter | 
|  | ); | 
|  | } | 
|  | }); | 
|  |  | 
|  | return visualObj[visualCluster]; | 
|  | } | 
|  |  | 
|  | protected positionGroup(group: Group) { | 
|  | const model = this.visualMapModel; | 
|  | const api = this.api; | 
|  |  | 
|  | layout.positionElement( | 
|  | group, | 
|  | model.getBoxLayoutParams(), | 
|  | {width: api.getWidth(), height: api.getHeight()} | 
|  | ); | 
|  | } | 
|  |  | 
|  | protected doRender( | 
|  | visualMapModel: VisualMapModel, | 
|  | ecModel: GlobalModel, | 
|  | api: ExtensionAPI, | 
|  | payload: unknown | 
|  | ) {} | 
|  | } | 
|  |  | 
|  | export default VisualMapView; |