Skip to content

Commit

Permalink
fix(delegation): mouse leave failed
Browse files Browse the repository at this point in the history
  • Loading branch information
dxq613 authored and simaQ committed Apr 15, 2020
1 parent b384ebe commit d3a30ed
Show file tree
Hide file tree
Showing 8 changed files with 158 additions and 47 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"@antv/component": "^0.5.0",
"@antv/coord": "^0.2.6",
"@antv/event-emitter": "~0.1.0",
"@antv/g-base": "^0.4.0",
"@antv/g-base": "^0.4.3",
"@antv/g-canvas": "^0.4.0",
"@antv/g-svg": "^0.4.0",
"@antv/matrix-util": "^2.0.4",
Expand Down
32 changes: 14 additions & 18 deletions src/chart/view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1417,7 +1417,7 @@ export class View extends Base {
private onDelegateEvents = (evt: GEvent): void => {
// 阻止继续冒泡,防止重复事件触发
// evt.preventDefault();
const { type, name } = evt;
const { name } = evt;
if (!name.includes(':')) {
return;
}
Expand All @@ -1426,17 +1426,17 @@ export class View extends Base {

// 包含有基本事件、组合事件
this.emit(name, e);
if (evt.delegateObject) {
const events = this.getEvents();
const currentTarget = evt.currentTarget as IShape;
const inhertNames = currentTarget.get('inheritNames');
each(inhertNames, (subName) => {
const eventName = `${subName}:${type}`;
if (events[eventName]) {
this.emit(eventName, e);
}
});
}
// const currentTarget = evt.currentTarget as IShape;
// const inheritNames = currentTarget.get('inheritNames');
// if (evt.delegateObject || inheritNames) {
// const events = this.getEvents();
// each(inheritNames, (subName) => {
// const eventName = `${subName}:${type}`;
// if (events[eventName]) {
// this.emit(eventName, e);
// }
// });
// }
};

/**
Expand Down Expand Up @@ -1846,12 +1846,8 @@ export function registerGeometry(name: string, Ctor: any) {
View.prototype[name.toLowerCase()] = function (cfg: any = {}) {
const props = {
/** 图形容器 */
container: this.middleGroup.addGroup({
name: 'element',
}),
labelsContainer: this.foregroundGroup.addGroup({
name: 'element',
}),
container: this.middleGroup.addGroup(),
labelsContainer: this.foregroundGroup.addGroup(),
...cfg,
};

Expand Down
3 changes: 2 additions & 1 deletion src/geometry/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1870,7 +1870,8 @@ export default class Geometry extends Base {
const labelChildren = label.getChildren();
for (let j = 0; j < labelChildren.length; j++) {
const child = labelChildren[j];
child.set('element', element);
child.cfg.name = [ 'element', 'label'];
child.cfg.element = element;
}
}
}
Expand Down
26 changes: 17 additions & 9 deletions src/geometry/element/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { deepMix, each, get, isArray, isFunction } from '@antv/util';
import { deepMix, each, get, isArray, isFunction, isString } from '@antv/util';
import { doAnimate } from '../../animate';
import Base from '../../base';
import { BBox, IGroup, IShape } from '../../dependents';
Expand Down Expand Up @@ -244,7 +244,8 @@ export default class Element extends Base {
target: this.container,
};
this.container.emit('statechange', eventObject);
propagationDelegate(this.container, 'statechange', eventObject);
//@ts-ignore
propagationDelegate(this.shape, 'statechange', eventObject);
}

/**
Expand Down Expand Up @@ -373,14 +374,17 @@ export default class Element extends Base {

if (this.shape) {
this.setShapeInfo(this.shape, model); // 存储绘图数据
if (!this.shape.get('name')) {
// TODO: 当用户设置了 name 后,为了保证 geometry:eventName 这样的事件能够正常触发,需要加一个 inheritName
// 等 G 事件改造完成后加上
// @ts-ignore
const name = this.shape.cfg.name;
// 附加 element 的 name, name 现在支持数组了,很好用了
if (!name) {
// 这个地方如果用户添加了 name, 则附加 name ,否则就添加自己的 name
// @ts-ignore
this.shape.cfg.name = ['element', this.shapeFactory.geometryType]
} else if(isString(name)) {
// @ts-ignore
this.shape.cfg.name = this.shapeFactory.geometryType
this.shape.cfg.name = ['element', name];
}
// @ts-ignore
this.shape.cfg.inheritName = [ 'element' ];
// 执行入场动画
const animateType = isUpdate ? 'enter' : 'appear';
const animateCfg = this.getAnimateCfg(animateType);
Expand Down Expand Up @@ -435,7 +439,11 @@ export default class Element extends Base {
}
} else {
if (state && state !== 'reset') {
const style = this.getStateStyle(state, sourceShape.get('name') || index); // 如果用户没有设置 name,则默认根据索引值
let name = sourceShape.get('name');
if (isArray(name)) { // 会附加 element 的 name
name = name[1];
}
const style = this.getStateStyle(state, name || index); // 如果用户没有设置 name,则默认根据索引值
targetShape.attr(style);
}
const newAttrs = getReplaceAttrs(sourceShape as IShape, targetShape as IShape);
Expand Down
102 changes: 102 additions & 0 deletions tests/bugs/2307-spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import { Chart } from '../../src';
import { createDiv } from '../util/dom';
import { simulateMouseEvent, getClientPoint} from '../util/simulate';
describe('#2307', () => {
const data = [
{ year: '2014', type: 'Sales', sales: 1000 },
{ year: '2015', type: 'Sales', sales: 1170 },
{ year: '2016', type: 'Sales', sales: 660 },
{ year: '2017', type: 'Sales', sales: 1030 },
{ year: '2014', type: 'Expenses', sales: 400 },
{ year: '2015', type: 'Expenses', sales: 460 },
{ year: '2016', type: 'Expenses', sales: 1120 },
{ year: '2017', type: 'Expenses', sales: 540 },
{ year: '2014', type: 'Profit', sales: 300 },
{ year: '2015', type: 'Profit', sales: 300 },
{ year: '2016', type: 'Profit', sales: 300 },
{ year: '2017', type: 'Profit', sales: 350 },
];

const chart = new Chart({
container: createDiv(),
width: 500,
height: 400,
});
chart.animate(false);

chart.data(data);
chart.scale({
sales: {
max: 2400,
tickInterval: 600,
nice: true,
},
});

chart.tooltip({
showMarkers: false
});

const interval = chart
.interval()
.position('year*sales')
.label('sales')
.color('type')
.adjust('stack');

chart.interaction('element-highlight-by-color');

chart.render();
const canvas = chart.getCanvas();
const el = canvas.get('el');
const elements = interval.elements;
it('element delegation error', () => {
const point = getClientPoint(canvas, 70, 218);

// 在画布上移动
simulateMouseEvent(el, 'mousemove', {
clientX: point.clientX - 10,
clientY: point.clientY
});
// 移动进入第一个 interaval
simulateMouseEvent(el, 'mousemove', point);
expect(elements[0].hasState('active')).toBe(true);
expect(elements[1].hasState('active')).toBe(true);
expect(elements[4].hasState('inactive')).toBe(true);

// 移入 第二个
simulateMouseEvent(el, 'mousemove', {
clientX: point.clientX,
clientY: point.clientY + 40
});

expect(elements[0].hasState('inactive')).toBe(true);
expect(elements[4].hasState('active')).toBe(true);
// 离开
simulateMouseEvent(el, 'mousemove', {
clientX: point.clientX - 10,
clientY: point.clientY
});
expect(elements[0].hasState('inactive')).toBe(false);
expect(elements[4].hasState('active')).toBe(false);
});
it('label active', () => {
const point = getClientPoint(canvas, 441, 63);
// 移入一个文本
simulateMouseEvent(el, 'mousemove', {
clientX: point.clientX,
clientY: point.clientY
});
expect(elements[0].hasState('active')).toBe(true);
expect(elements[1].hasState('active')).toBe(true);
expect(elements[4].hasState('inactive')).toBe(true);
// 移出文本
simulateMouseEvent(el, 'mousemove', {
clientX: point.clientX,
clientY: point.clientY - 20
});
expect(elements[0].hasState('active')).toBe(false);
expect(elements[1].hasState('active')).toBe(false);
expect(elements[4].hasState('inactive')).toBe(false);
});
});
9 changes: 6 additions & 3 deletions tests/unit/chart/controller/gesture-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ describe('Gesture', () => {

new GestureController(view);

xit('swipe', () => {
xit('swipe', (done) => {
let swipe;
view.on('swipe', (e) => swipe = e);
// @ts-ignore
Expand Down Expand Up @@ -64,8 +64,11 @@ describe('Gesture', () => {
]
}
});
expect(swipe).toBeDefined();
expect(swipe.direction).toBe('right');
setTimeout(() => {
expect(swipe).toBeDefined();
// expect(swipe.direction).toBe('right');
done();
}, 50);
});

it('pinch', () => {
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/geometry/element/index-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ describe('Element', () => {
},
});

expect(element.shape.get('name')).toBe('shapes');
expect(element.shape.get('name')).toEqual(["element", "shapes"]);
expect(container.get('children').length).toBe(1);
expect(container.get('children')[0]).toEqual(element.shape);
expect(element.shape.get('visible')).toBe(false);
Expand Down
29 changes: 15 additions & 14 deletions tests/unit/geometry/label/layout/limit-in-canvas-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ describe('GeometryLabel layout', () => {
});

it('limitInCanvas', () => {
const group = canvas.addGroup();
// mock
const text1 = canvas.addShape({
const text1 = group.addShape({
type: 'text',
attrs: {
x: 10,
Expand All @@ -20,7 +21,7 @@ describe('GeometryLabel layout', () => {
fill: 'red',
}
});
const text2 = canvas.addShape({
const text2 = group.addShape({
type: 'text',
attrs: {
x: -3,
Expand All @@ -29,7 +30,7 @@ describe('GeometryLabel layout', () => {
fill: 'red',
}
});
const text3 = canvas.addShape({
const text3 = group.addShape({
type: 'text',
attrs: {
x: 110,
Expand All @@ -38,7 +39,7 @@ describe('GeometryLabel layout', () => {
fill: 'red',
}
});
const text4 = canvas.addShape({
const text4 = group.addShape({
type: 'text',
attrs: {
x: 90,
Expand All @@ -47,7 +48,7 @@ describe('GeometryLabel layout', () => {
fill: 'red',
}
});
const text5 = canvas.addShape({
const text5 = group.addShape({
type: 'text',
attrs: {
x: 50,
Expand All @@ -56,7 +57,7 @@ describe('GeometryLabel layout', () => {
fill: 'red',
}
});
const text6 = canvas.addShape({
const text6 = group.addShape({
type: 'text',
attrs: {
x: 50,
Expand All @@ -65,7 +66,7 @@ describe('GeometryLabel layout', () => {
fill: 'red',
}
});
const text7 = canvas.addShape({
const text7 = group.addShape({
type: 'text',
attrs: {
x: 50,
Expand All @@ -86,16 +87,16 @@ describe('GeometryLabel layout', () => {
height: 100,
};

expect(canvas.getCanvasBBox().minX).toBeLessThan(0);
expect(group.getCanvasBBox().minX).toBeLessThan(0);

// @ts-ignore
limitInCanvas([], canvas.getChildren(), [], region);
limitInCanvas([], group.getChildren(), [], region);
canvas.draw();
expect(canvas.getChildren().length).toBe(7);
expect(canvas.getCanvasBBox().minX).toBe(0);
expect(canvas.getCanvasBBox().minY).toBe(0);
expect(canvas.getCanvasBBox().maxX).toBe(100);
expect(canvas.getCanvasBBox().maxY).toBe(100);
expect(group.getChildren().length).toBe(7);
expect(group.getCanvasBBox().minX).toBe(0);
expect(group.getCanvasBBox().minY).toBe(0);
expect(group.getCanvasBBox().maxX).toBe(100);
expect(group.getCanvasBBox().maxY).toBe(100);
});

afterAll(() => {
Expand Down

0 comments on commit d3a30ed

Please sign in to comment.