import Displayable from '../graphic/Displayable';
|
import { liftColor } from '../tool/color';
|
import { BrushScope, SVGVNodeAttrs } from './core';
|
import { getClassId } from './cssClassId';
|
|
export function createCSSEmphasis(
|
el: Displayable,
|
attrs: SVGVNodeAttrs,
|
scope: BrushScope
|
) {
|
if (!el.ignore) {
|
if (el.isSilent()) {
|
// If el is silent, it can not be hovered nor selected.
|
// So set pointer-events to pass through.
|
const style = {
|
'pointer-events': 'none'
|
};
|
setClassAttribute(style, attrs, scope, true);
|
}
|
else {
|
const emphasisStyle = el.states.emphasis && el.states.emphasis.style
|
? el.states.emphasis.style
|
: {};
|
let fill = emphasisStyle.fill;
|
if (!fill) {
|
// No empahsis fill, lift color
|
const normalFill = el.style && el.style.fill;
|
const selectFill = el.states.select
|
&& el.states.select.style
|
&& el.states.select.style.fill;
|
const fromFill = el.currentStates.indexOf('select') >= 0
|
? (selectFill || normalFill)
|
: normalFill;
|
if (fromFill) {
|
fill = liftColor(fromFill);
|
}
|
}
|
let lineWidth = emphasisStyle.lineWidth;
|
if (lineWidth) {
|
// Symbols use transform to set size, so lineWidth
|
// should be divided by scaleX
|
const scaleX = (!emphasisStyle.strokeNoScale && el.transform)
|
? el.transform[0]
|
: 1;
|
lineWidth = lineWidth / scaleX;
|
}
|
const style = {
|
cursor: 'pointer', // TODO: Should this be customized?
|
} as any;
|
if (fill) {
|
style.fill = fill;
|
}
|
if (emphasisStyle.stroke) {
|
style.stroke = emphasisStyle.stroke;
|
}
|
if (lineWidth) {
|
style['stroke-width'] = lineWidth;
|
}
|
setClassAttribute(style, attrs, scope, true);
|
}
|
}
|
}
|
|
function setClassAttribute(style: object, attrs: SVGVNodeAttrs, scope: BrushScope, withHover: boolean) {
|
const styleKey = JSON.stringify(style);
|
let className = scope.cssStyleCache[styleKey];
|
if (!className) {
|
className = scope.zrId + '-cls-' + getClassId();
|
scope.cssStyleCache[styleKey] = className;
|
scope.cssNodes['.' + className + (withHover ? ':hover' : '')] = style as any;
|
}
|
attrs.class = attrs.class ? (attrs.class + ' ' + className) : className;
|
}
|