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.
78 lines
2.4 KiB
78 lines
2.4 KiB
4 years ago
|
import { ActionName } from "../core/scope.js";
|
||
|
import { parentNode } from "../utils/domUtils.js";
|
||
|
import * as is from "../utils/is.js";
|
||
|
import autoStart from "./base.js";
|
||
|
|
||
|
function beforeStart({
|
||
|
interaction,
|
||
|
eventTarget,
|
||
|
dx,
|
||
|
dy
|
||
|
}, scope) {
|
||
|
if (interaction.prepared.name !== 'drag') {
|
||
|
return;
|
||
|
} // check if a drag is in the correct axis
|
||
|
|
||
|
|
||
|
const absX = Math.abs(dx);
|
||
|
const absY = Math.abs(dy);
|
||
|
const targetOptions = interaction.interactable.options.drag;
|
||
|
const startAxis = targetOptions.startAxis;
|
||
|
const currentAxis = absX > absY ? 'x' : absX < absY ? 'y' : 'xy';
|
||
|
interaction.prepared.axis = targetOptions.lockAxis === 'start' ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'
|
||
|
: targetOptions.lockAxis; // if the movement isn't in the startAxis of the interactable
|
||
|
|
||
|
if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {
|
||
|
// cancel the prepared action
|
||
|
interaction.prepared.name = null; // then try to get a drag from another ineractable
|
||
|
|
||
|
let element = eventTarget;
|
||
|
|
||
|
const getDraggable = function (interactable) {
|
||
|
if (interactable === interaction.interactable) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const options = interaction.interactable.options.drag;
|
||
|
|
||
|
if (!options.manualStart && interactable.testIgnoreAllow(options, element, eventTarget)) {
|
||
|
const action = interactable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);
|
||
|
|
||
|
if (action && action.name === ActionName.Drag && checkStartAxis(currentAxis, interactable) && autoStart.validateAction(action, interactable, element, eventTarget, scope)) {
|
||
|
return interactable;
|
||
|
}
|
||
|
}
|
||
|
}; // check all interactables
|
||
|
|
||
|
|
||
|
while (is.element(element)) {
|
||
|
const interactable = scope.interactables.forEachMatch(element, getDraggable);
|
||
|
|
||
|
if (interactable) {
|
||
|
interaction.prepared.name = ActionName.Drag;
|
||
|
interaction.interactable = interactable;
|
||
|
interaction.element = element;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
element = parentNode(element);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function checkStartAxis(startAxis, interactable) {
|
||
|
if (!interactable) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
const thisAxis = interactable.options[ActionName.Drag].startAxis;
|
||
|
return startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis;
|
||
|
}
|
||
|
|
||
|
export default {
|
||
|
id: 'auto-start/dragAxis',
|
||
|
listeners: {
|
||
|
'autoStart:before-start': beforeStart
|
||
|
}
|
||
|
};
|
||
|
//# sourceMappingURL=dragAxis.js.map
|