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