StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.3 KiB
153 lines
4.3 KiB
import InteractEvent from "../core/InteractEvent.js";
|
|
import { ActionName } from "../core/scope.js";
|
|
import * as utils from "../utils/index.js";
|
|
ActionName.Gesture = 'gesture';
|
|
|
|
function install(scope) {
|
|
const {
|
|
actions,
|
|
Interactable,
|
|
defaults
|
|
} = scope;
|
|
/**
|
|
* ```js
|
|
* interact(element).gesturable({
|
|
* onstart: function (event) {},
|
|
* onmove : function (event) {},
|
|
* onend : function (event) {},
|
|
*
|
|
* // limit multiple gestures.
|
|
* // See the explanation in {@link Interactable.draggable} example
|
|
* max: Infinity,
|
|
* maxPerElement: 1,
|
|
* })
|
|
*
|
|
* var isGestureable = interact(element).gesturable()
|
|
* ```
|
|
*
|
|
* Gets or sets whether multitouch gestures can be performed on the target
|
|
*
|
|
* @param {boolean | object} [options] true/false or An object with event
|
|
* listeners to be fired on gesture events (makes the Interactable gesturable)
|
|
* @return {boolean | Interactable} A boolean indicating if this can be the
|
|
* target of gesture events, or this Interactable
|
|
*/
|
|
|
|
Interactable.prototype.gesturable = function (options) {
|
|
if (utils.is.object(options)) {
|
|
this.options.gesture.enabled = options.enabled !== false;
|
|
this.setPerAction(ActionName.Gesture, options);
|
|
this.setOnEvents(ActionName.Gesture, options);
|
|
return this;
|
|
}
|
|
|
|
if (utils.is.bool(options)) {
|
|
this.options.gesture.enabled = options;
|
|
return this;
|
|
}
|
|
|
|
return this.options.gesture;
|
|
};
|
|
|
|
actions[ActionName.Gesture] = gesture;
|
|
actions.names.push(ActionName.Gesture);
|
|
utils.arr.merge(actions.eventTypes, ['gesturestart', 'gesturemove', 'gestureend']);
|
|
actions.methodDict.gesture = 'gesturable';
|
|
defaults.actions.gesture = gesture.defaults;
|
|
}
|
|
|
|
function updateGestureProps({
|
|
interaction,
|
|
iEvent,
|
|
event,
|
|
phase
|
|
}) {
|
|
if (interaction.prepared.name !== 'gesture') {
|
|
return;
|
|
}
|
|
|
|
const pointers = interaction.pointers.map(p => p.pointer);
|
|
const starting = phase === 'start';
|
|
const ending = phase === 'end';
|
|
const deltaSource = interaction.interactable.options.deltaSource;
|
|
iEvent.touches = [pointers[0], pointers[1]];
|
|
|
|
if (starting) {
|
|
iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource);
|
|
iEvent.box = utils.pointer.touchBBox(pointers);
|
|
iEvent.scale = 1;
|
|
iEvent.ds = 0;
|
|
iEvent.angle = utils.pointer.touchAngle(pointers, deltaSource);
|
|
iEvent.da = 0;
|
|
interaction.gesture.startDistance = iEvent.distance;
|
|
interaction.gesture.startAngle = iEvent.angle;
|
|
} else if (ending || event instanceof InteractEvent) {
|
|
const prevEvent = interaction.prevEvent;
|
|
iEvent.distance = prevEvent.distance;
|
|
iEvent.box = prevEvent.box;
|
|
iEvent.scale = prevEvent.scale;
|
|
iEvent.ds = 0;
|
|
iEvent.angle = prevEvent.angle;
|
|
iEvent.da = 0;
|
|
} else {
|
|
iEvent.distance = utils.pointer.touchDistance(pointers, deltaSource);
|
|
iEvent.box = utils.pointer.touchBBox(pointers);
|
|
iEvent.scale = iEvent.distance / interaction.gesture.startDistance;
|
|
iEvent.angle = utils.pointer.touchAngle(pointers, deltaSource);
|
|
iEvent.ds = iEvent.scale - interaction.gesture.scale;
|
|
iEvent.da = iEvent.angle - interaction.gesture.angle;
|
|
}
|
|
|
|
interaction.gesture.distance = iEvent.distance;
|
|
interaction.gesture.angle = iEvent.angle;
|
|
|
|
if (utils.is.number(iEvent.scale) && iEvent.scale !== Infinity && !isNaN(iEvent.scale)) {
|
|
interaction.gesture.scale = iEvent.scale;
|
|
}
|
|
}
|
|
|
|
const gesture = {
|
|
id: 'actions/gesture',
|
|
before: ['actions/drag', 'actions/resize'],
|
|
install,
|
|
listeners: {
|
|
'interactions:action-start': updateGestureProps,
|
|
'interactions:action-move': updateGestureProps,
|
|
'interactions:action-end': updateGestureProps,
|
|
'interactions:new': ({
|
|
interaction
|
|
}) => {
|
|
interaction.gesture = {
|
|
angle: 0,
|
|
distance: 0,
|
|
scale: 1,
|
|
startAngle: 0,
|
|
startDistance: 0
|
|
};
|
|
},
|
|
'auto-start:check': arg => {
|
|
if (arg.interaction.pointers.length < 2) {
|
|
return undefined;
|
|
}
|
|
|
|
const gestureOptions = arg.interactable.options.gesture;
|
|
|
|
if (!(gestureOptions && gestureOptions.enabled)) {
|
|
return undefined;
|
|
}
|
|
|
|
arg.action = {
|
|
name: ActionName.Gesture
|
|
};
|
|
return false;
|
|
}
|
|
},
|
|
defaults: {},
|
|
|
|
getCursor() {
|
|
return '';
|
|
}
|
|
|
|
};
|
|
export default gesture;
|
|
//# sourceMappingURL=gesture.js.map
|