Skip to content

Commit

Permalink
fix: passive tools stealing non-primary mousedowns (#80)
Browse files Browse the repository at this point in the history
  • Loading branch information
dannyrb authored Jan 29, 2021
1 parent 474dea2 commit a325a69
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@
import {
// getters,
state,
} from './../../store/index';
} from './../../store/index'

import { ToolModes } from './../../enums/index';
import { ToolModes } from './../../enums/index'

// // Util
import getToolsWithMoveableHandles from '../../store/getToolsWithMoveableHandles';
import getToolsWithDataForElement from '../../store/getToolsWithDataForElement';
import getMoveableAnnotationTools from '../../store/getMoveableAnnotationTools';
import getActiveToolForMouseEvent from '../shared/getActiveToolForMouseEvent';
import getToolsWithModesForMouseEvent from '../shared/getToolsWithModesForMouseEvent';
import getToolsWithMoveableHandles from '../../store/getToolsWithMoveableHandles'
import getToolsWithDataForElement from '../../store/getToolsWithDataForElement'
import getMoveableAnnotationTools from '../../store/getMoveableAnnotationTools'
import getActiveToolForMouseEvent from '../shared/getActiveToolForMouseEvent'
import getToolsWithModesForMouseEvent from '../shared/getToolsWithModesForMouseEvent'

const { Active, Passive } = ToolModes;
const { Active, Passive } = ToolModes

/**
* @function mouseDown - When the mouse is depressed we check which entities can process these events in the following manner:
Expand Down Expand Up @@ -41,75 +41,80 @@ const { Active, Passive } = ToolModes;
export default function mouseDown(evt) {
// If a tool has locked the current state it is dealing with an interaction within its own eventloop.
if (state.isToolLocked) {
return;
return
}

const activeTool = getActiveToolForMouseEvent(evt);
const activeTool = getActiveToolForMouseEvent(evt)

// Check for preMouseDownCallbacks
if (activeTool && typeof activeTool.preMouseDownCallback === 'function') {
const consumedEvent = activeTool.preMouseDownCallback(evt);
const consumedEvent = activeTool.preMouseDownCallback(evt)

if (consumedEvent) {
// If the tool claims it consumed the event, prevent further checks.
return;
return
}
}

const activeAndPassiveTools = getToolsWithModesForMouseEvent(evt, [
Active,
Passive,
]);

const eventData = evt.detail;
const { element } = eventData;
// Find all tools that might respond to this mouse down
const isPrimaryClick = evt.detail.event.buttons === 1
const activeToolsWithEventBinding = getToolsWithModesForMouseEvent(
evt,
[Active],
evt.detail.event.buttons
)
const passiveToolsIfEventWasPrimaryMouseButton = isPrimaryClick
? getToolsWithModesForMouseEvent(evt, [Passive])
: undefined
const applicableTools = [
...(activeToolsWithEventBinding || []),
...(passiveToolsIfEventWasPrimaryMouseButton || []),
]

const eventData = evt.detail
const { element } = eventData

// Annotation tool specific
const annotationTools = getToolsWithDataForElement(
element,
activeAndPassiveTools
);

const canvasCoords = eventData.currentPoints.canvas;

const annotationTools = getToolsWithDataForElement(element, applicableTools)
const canvasCoords = eventData.currentPoints.canvas
const annotationToolsWithMoveableHandles = getToolsWithMoveableHandles(
element,
annotationTools,
canvasCoords,
'mouse'
);
)

if (annotationToolsWithMoveableHandles.length > 0) {
// Choose first tool for now.
const { tool, toolData, handle } = annotationToolsWithMoveableHandles[0];
const { tool, toolData, handle } = annotationToolsWithMoveableHandles[0]

tool.handleSelectedCallback(evt, toolData, handle, 'mouse');
tool.handleSelectedCallback(evt, toolData, handle, 'mouse')

return;
return
}

const moveableAnnotationTools = getMoveableAnnotationTools(
element,
annotationTools,
canvasCoords,
'mouse'
);
)

if (moveableAnnotationTools.length > 0) {
// Choose first tool for now.
const { tool, toolData } = moveableAnnotationTools[0];
const { tool, toolData } = moveableAnnotationTools[0]

tool.toolSelectedCallback(evt, toolData, 'mouse');
tool.toolSelectedCallback(evt, toolData, 'mouse')

return;
return
}

if (activeTool && typeof activeTool.postMouseDownCallback === 'function') {
const consumedEvent = activeTool.postMouseDownCallback(evt);
const consumedEvent = activeTool.postMouseDownCallback(evt)

if (consumedEvent) {
// If the tool claims it consumed the event, prevent further checks.
return;
return
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ToolGroupManager } from './../../store/index';
import { ToolModes } from '../../enums';
import { ToolGroupManager } from './../../store/index'
import { ToolModes } from '../../enums'

type ModesFilter = Array<ToolModes>;
type ModesFilter = Array<ToolModes>

/**
* @function getToolsWithModesForMouseEvent Given the event and a filter of modes,
Expand All @@ -11,31 +11,37 @@ type ModesFilter = Array<ToolModes>;
*/
export default function getToolsWithModesForMouseEvent(
evt,
modesFilter: ModesFilter
modesFilter: ModesFilter,
evtButton?: any
) {
const { renderingEngineUID, sceneUID, viewportUID } = evt.detail;
const { renderingEngineUID, sceneUID, viewportUID } = evt.detail
const toolGroups = ToolGroupManager.getToolGroups(
renderingEngineUID,
sceneUID,
viewportUID
);
)

const enabledTools = [];
const enabledTools = []

for (let i = 0; i < toolGroups.length; i++) {
const toolGroup = toolGroups[i];
const toolGroupToolNames = Object.keys(toolGroup.tools);
const toolGroup = toolGroups[i]
const toolGroupToolNames = Object.keys(toolGroup.tools)

for (let j = 0; j < toolGroupToolNames.length; j++) {
const toolName = toolGroupToolNames[j];
const tool = toolGroup.tools[toolName];
const toolName = toolGroupToolNames[j]
const tool = toolGroup.tools[toolName]

if (modesFilter.includes(tool.mode)) {
const toolInstance = toolGroup._tools[toolName];
enabledTools.push(toolInstance);
if (
modesFilter.includes(tool.mode) &&
// Should not filter by event's button
// or should, and the tool binding includes the event's button
(!evtButton || tool.bindings.includes(evtButton))
) {
const toolInstance = toolGroup._tools[toolName]
enabledTools.push(toolInstance)
}
}
}

return enabledTools;
return enabledTools
}

0 comments on commit a325a69

Please sign in to comment.