import React from 'react';
import { getShapeAttrs, getConstraint } from '@antv/g2/lib/geometry/shape/area/util';
// 按需使用需要加载图形
import '@antv/g2/lib/geometry/shape/line';
import '@antv/g2/lib/geometry/shape/area';
import _isObject from '@antv/util/lib/is-object';
import _deepMix from '@antv/util/lib/deep-mix';
import _get from '@antv/util/lib/get';
import _set from '@antv/util/lib/set';
import { registerShape } from '../core';
import * as d3Color from 'd3-color';
import useChartView from '../hooks/useChartView';
import useChartInstance from '../hooks/useChartInstance';
import Line, { ILineGemoProps } from './Line';
import Point, { IPointGemoProps } from './Point';
import Area, { IAreaGemoProps } from './Area';
export interface ILineAdvanceGemoProps extends ILineGemoProps {
point?: boolean | IPointGemoProps,
area?: boolean | IAreaGemoProps,
}
const areaStyle = {
"default":{
"style":{
"fill":"#5B8FF9",
"fillOpacity":0.25,
"stroke":null
}
},
"active":{
"style":{ "fillOpacity":0.5}
},
"inactive":{
"style":{ "fillOpacity":0.4}
},
"selected":{
"style":{"fillOpacity":0.5}
}
}
const LineAdvance = (props: ILineAdvanceGemoProps) => {
const { point, area, shape, ...cfg } = props;
const pointCfg = { shape: 'circle' };
const chart = useChartInstance();
const view = useChartView();
const areaCfg = { shape: shape === 'smooth' ? 'gradient-smooth' : 'gradient' };
const theme = view.getTheme();
// todo: 需要g2层修改
theme.geometries.area.gradient = areaStyle;
// todo: 需要g2层修改
theme.geometries.area['gradient-smooth'] = areaStyle;
if (_get(chart, ['options', 'tooltip']) !== false) {
// 默认为shared
if (_get(view, ['options', 'tooltip', 'shared']) === undefined) {
_set(view, ['options', 'tooltip', 'shared'], true);
};
// 默认showCrosshairs
if (_get(view, ['options', 'tooltip', 'showCrosshairs']) === undefined) {
_set(view, ['options', 'tooltip', 'showCrosshairs'], true);
};
if (_get(view, ['options', 'tooltip', 'showMarkers']) === undefined) {
_set(view, ['options', 'tooltip', 'showMarkers'], true);
};
}
if (_isObject(pointCfg)) {
_deepMix(pointCfg, point);
}
if (_isObject(areaCfg)) {
_deepMix(areaCfg, area);
}
return (<>
{/* */}
{!!area && }
{!!point && }
>)
}
// Area 几何标记默认的 shape:填充的区域图
registerShape('area', 'gradient', {
draw(cfg: any, container: any) {
const attrs = getShapeAttrs(cfg, false, false, this);
const c = attrs.fill;
const clr = d3Color.color(c);
if (clr) {
attrs.fill = `l (90) 0:${d3Color.rgb(clr.r, clr.g, clr.b, 1).formatRgb()} 1:${d3Color.rgb(clr.r, clr.g, clr.b, 0.1).formatRgb()}`;
}
// attrs.fill = 'red';
const shape = container.addShape({
type: 'path',
attrs,
name: 'area',
});
return shape;
},
});
/**
* 填充的平滑曲面图
*/
registerShape('area', 'gradient-smooth', {
draw(cfg, container) {
const { coordinate } = this;
const attrs = getShapeAttrs(cfg, false, true, this, getConstraint(coordinate));
const c = attrs.fill;
const clr = d3Color.color(c);
if (clr) {
attrs.fill = `l (90) 0:${d3Color.rgb(clr.r, clr.g, clr.b, 1).formatRgb()} 1:${d3Color.rgb(clr.r, clr.g, clr.b, 0.1).formatRgb()}`;
}
// attrs.fill = 'red';
const shape = container.addShape({
type: 'path',
attrs,
name: 'area',
});
return shape;
}
});
export default LineAdvance;