diff --git a/src/containers/stage.jsx b/src/containers/stage.jsx index 8e1ac9248396c3faa44f20b8eb50fe0e3066e888..3a61f5b174e82b897e2ad4294fc84ba8c9f0ee94 100644 --- a/src/containers/stage.jsx +++ b/src/containers/stage.jsx @@ -342,16 +342,24 @@ class Stage extends React.Component { } onStartDrag (x, y) { if (this.state.dragId) return; - const drawableId = this.renderer.pick(x, y); + + // Because pick queries are expensive, only perform them for drawables that are currently draggable. + let draggableTargets = this.props.vm.runtime.targets; + if (!this.props.useEditorDragStyle) { + draggableTargets = draggableTargets.filter( + target => Number.isFinite(target.drawableID) && target.draggable + ); + } + if (draggableTargets.length === 0) return; + + const draggableIDs = draggableTargets.map(target => target.drawableID); + const drawableId = this.renderer.pick(x, y, 1, 1, draggableIDs); if (drawableId === null) return; const targetId = this.props.vm.getTargetIdForDrawableId(drawableId); if (targetId === null) return; const target = this.props.vm.runtime.getTargetById(targetId); - // Do not start drag unless in editor drag mode or target is draggable - if (!(this.props.useEditorDragStyle || target.draggable)) return; - // Dragging always brings the target to the front target.goToFront();