UNPKG

react-selectable

Version:

Allows individual or group selection of items using the mouse.

53 lines (49 loc) 1.84 kB
import getBoundsForNode from './getBoundsForNode'; /** * Given offsets, widths, and heights of two objects, determine if they collide (overlap). * @param {int} aTop The top position of the first object * @param {int} aLeft The left position of the first object * @param {int} bTop The top position of the second object * @param {int} bLeft The left position of the second object * @param {int} aWidth The width of the first object * @param {int} aHeight The height of the first object * @param {int} bWidth The width of the second object * @param {int} bHeight The height of the second object * @param {int} tolerance Amount of forgiveness an item will offer to the selectbox before registering a selection * @return {bool} */ const coordsCollide = (aTop, aLeft, bTop, bLeft, aWidth, aHeight, bWidth, bHeight, tolerance) => { return !( // 'a' bottom doesn't touch 'b' top ( (aTop + aHeight - tolerance) < bTop ) || // 'a' top doesn't touch 'b' bottom ( (aTop + tolerance) > (bTop + bHeight) ) || // 'a' right doesn't touch 'b' left ( (aLeft + aWidth - tolerance) < bLeft ) || // 'a' left doesn't touch 'b' right ( (aLeft + tolerance) > (bLeft + bWidth) ) ); }; /** * Given two objects containing "top", "left", "offsetWidth" and "offsetHeight" * properties, determine if they collide. * @param {Object|HTMLElement} a * @param {Object|HTMLElement} b * @param {int} tolerance * @return {bool} */ export default (a, b, tolerance = 0) => { const aObj = (a instanceof HTMLElement) ? getBoundsForNode(a) : a; const bObj = (b instanceof HTMLElement) ? getBoundsForNode(b) : b; return coordsCollide( aObj.top, aObj.left, bObj.top, bObj.left, aObj.offsetWidth, aObj.offsetHeight, bObj.offsetWidth, bObj.offsetHeight, tolerance ); };