@@ -287,15 +287,34 @@ export function getVisibleItems(items, canvasTimeStart, canvasTimeEnd, keys) {
287287
288288const EPSILON = 0.001
289289
290- export function collision ( a , b , lineHeight , collisionPadding = EPSILON ) {
290+ export function simpleCollision ( a , b , lineHeight , collisionPadding = EPSILON ) {
291291 // 2d collisions detection - https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection
292292 var verticalMargin = 0
293293
294294 return (
295295 a . collisionLeft + collisionPadding < b . collisionLeft + b . collisionWidth &&
296296 a . collisionLeft + a . collisionWidth - collisionPadding > b . collisionLeft &&
297- a . top - verticalMargin + collisionPadding < b . top + b . height &&
298- a . top + a . height + verticalMargin - collisionPadding > b . top
297+ a . top - verticalMargin + collisionPadding < b . top + b . height &&
298+ a . top + a . height + verticalMargin - collisionPadding > b . top
299+ )
300+ }
301+
302+ export function collisionOrOrderMismatch ( a , b , lineHeight , collisionPadding = EPSILON ) {
303+ // 2d collisions detection - https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection
304+ var verticalMargin = 0
305+
306+ return (
307+ a . collisionLeft + collisionPadding < b . collisionLeft + b . collisionWidth &&
308+ a . collisionLeft + a . collisionWidth - collisionPadding > b . collisionLeft &&
309+ ( (
310+ a . top - verticalMargin + collisionPadding < b . top + b . height &&
311+ a . top + a . height + verticalMargin - collisionPadding > b . top
312+ )
313+ ||
314+ (
315+ a . top < b . top
316+ )
317+ )
299318 )
300319}
301320
@@ -309,7 +328,8 @@ export function groupStack(
309328 group ,
310329 groupHeight ,
311330 groupTop ,
312- itemIndex
331+ itemIndex ,
332+ collision
313333) {
314334 // calculate non-overlapping positions
315335 let curHeight = groupHeight
@@ -387,9 +407,12 @@ export function stackAll(itemsDimensions, groupOrders, lineHeight, stackItems) {
387407 // Is group being stacked?
388408 const isGroupStacked =
389409 group . stackItems !== undefined ? group . stackItems : stackItems
410+ const shouldStackEnforceOrder =
411+ group . shouldStackEnforceOrder !== undefined ? group . shouldStackEnforceOrder : false
390412 const { groupHeight, verticalMargin } = stackGroup (
391413 itemsDimensions ,
392414 isGroupStacked ,
415+ shouldStackEnforceOrder ,
393416 lineHeight ,
394417 groupTop
395418 )
@@ -411,15 +434,16 @@ export function stackAll(itemsDimensions, groupOrders, lineHeight, stackItems) {
411434}
412435
413436/**
414- *
415- * @param {* } itemsDimensions
416- * @param {* } isGroupStacked
417- * @param {* } lineHeight
418- * @param {* } groupTop
437+ *
438+ * @param {* } itemsDimensions
439+ * @param {* } isGroupStacked
440+ * @param {* } lineHeight
441+ * @param {* } groupTop
419442 */
420- export function stackGroup ( itemsDimensions , isGroupStacked , lineHeight , groupTop ) {
443+ export function stackGroup ( itemsDimensions , isGroupStacked , shouldStackEnforceOrder , lineHeight , groupTop ) {
421444 var groupHeight = 0
422445 var verticalMargin = 0
446+ const collision = shouldStackEnforceOrder ? collisionOrOrderMismatch : simpleCollision
423447 // Find positions for each item in group
424448 for ( let itemIndex = 0 ; itemIndex < itemsDimensions . length ; itemIndex ++ ) {
425449 let r = { }
@@ -430,7 +454,8 @@ export function stackGroup(itemsDimensions, isGroupStacked, lineHeight, groupTop
430454 itemsDimensions ,
431455 groupHeight ,
432456 groupTop ,
433- itemIndex
457+ itemIndex ,
458+ collision
434459 )
435460 } else {
436461 r = groupNoStack ( lineHeight , itemsDimensions [ itemIndex ] , groupHeight , groupTop )
0 commit comments