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