12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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;
- }
|