142 lines
4.0 KiB
Java
142 lines
4.0 KiB
Java
import { each, get } from '@antv/util';
|
|
import { getComponents, isInBox } from './action/util';
|
|
/**
|
|
* 交互的上下文
|
|
*/
|
|
var Context = /** @class */ (function () {
|
|
function Context(view) {
|
|
/** 当前所有的 Action */
|
|
this.actions = [];
|
|
/** 当前事件对象 */
|
|
this.event = null;
|
|
this.cacheMap = {};
|
|
this.view = view;
|
|
}
|
|
/**
|
|
* 缓存信息
|
|
* @param params 缓存的字段
|
|
* - 如果一个字段则获取缓存
|
|
* - 两个字段则设置缓存
|
|
*/
|
|
Context.prototype.cache = function () {
|
|
var params = [];
|
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
params[_i] = arguments[_i];
|
|
}
|
|
if (params.length === 1) {
|
|
return this.cacheMap[params[0]];
|
|
}
|
|
else if (params.length === 2) {
|
|
this.cacheMap[params[0]] = params[1];
|
|
}
|
|
};
|
|
/**
|
|
* 获取 Action
|
|
* @param name Action 的名称
|
|
*/
|
|
Context.prototype.getAction = function (name) {
|
|
return this.actions.find(function (action) { return action.name === name; });
|
|
};
|
|
/**
|
|
* 获取 Action
|
|
* @param action Action 对象
|
|
*/
|
|
Context.prototype.addAction = function (action) {
|
|
this.actions.push(action);
|
|
};
|
|
/**
|
|
* 移除 Action
|
|
* @param action Action 对象
|
|
*/
|
|
Context.prototype.removeAction = function (action) {
|
|
var actions = this.actions;
|
|
var index = this.actions.indexOf(action);
|
|
if (index >= 0) {
|
|
actions.splice(index, 1);
|
|
}
|
|
};
|
|
/**
|
|
* 获取当前的点
|
|
*/
|
|
Context.prototype.getCurrentPoint = function () {
|
|
var event = this.event;
|
|
if (event) {
|
|
if (event.target instanceof HTMLElement) {
|
|
var canvas = this.view.getCanvas();
|
|
var point = canvas.getPointByClient(event.clientX, event.clientY);
|
|
return point;
|
|
}
|
|
else {
|
|
return {
|
|
x: event.x,
|
|
y: event.y,
|
|
};
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
/**
|
|
* 获取当前 shape
|
|
* @returns current shape
|
|
*/
|
|
Context.prototype.getCurrentShape = function () {
|
|
return get(this.event, ['gEvent', 'shape']);
|
|
};
|
|
/**
|
|
* 当前的触发是否在 View 内
|
|
*/
|
|
Context.prototype.isInPlot = function () {
|
|
var point = this.getCurrentPoint();
|
|
if (point) {
|
|
return this.view.isPointInPlot(point);
|
|
}
|
|
return false;
|
|
};
|
|
/**
|
|
* 是否在指定的图形内
|
|
* @param name shape 的 name
|
|
*/
|
|
Context.prototype.isInShape = function (name) {
|
|
var shape = this.getCurrentShape(); // 不再考虑在 shape 的 parent 内的情况
|
|
if (shape) {
|
|
return shape.get('name') === name;
|
|
}
|
|
return false;
|
|
};
|
|
/**
|
|
* 当前的触发是组件内部
|
|
* @param name 组件名,可以为空
|
|
*/
|
|
Context.prototype.isInComponent = function (name) {
|
|
var components = getComponents(this.view);
|
|
var point = this.getCurrentPoint();
|
|
if (point) {
|
|
return !!components.find(function (component) {
|
|
var bbox = component.getBBox();
|
|
if (name) {
|
|
return component.get('name') === name && isInBox(bbox, point);
|
|
}
|
|
else {
|
|
return isInBox(bbox, point);
|
|
}
|
|
});
|
|
}
|
|
return false;
|
|
};
|
|
/**
|
|
* 销毁
|
|
*/
|
|
Context.prototype.destroy = function () {
|
|
this.view = null;
|
|
this.event = null;
|
|
// 先销毁 action 再清空,一边遍历,一边删除,所以数组需要更新引用
|
|
each(this.actions.slice(), function (action) {
|
|
action.destroy();
|
|
});
|
|
this.actions = null;
|
|
this.cacheMap = null;
|
|
};
|
|
return Context;
|
|
}());
|
|
export default Context;
|
|
//# sourceMappingURL=context.js.map |