@@ -287,15 +287,34 @@ export function getVisibleItems(items, canvasTimeStart, canvasTimeEnd, keys) {
287
287
288
288
const EPSILON = 0.001
289
289
290
- export function collision ( a , b , lineHeight , collisionPadding = EPSILON ) {
290
+ export function simpleCollision ( a , b , lineHeight , collisionPadding = EPSILON ) {
291
291
// 2d collisions detection - https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection
292
292
var verticalMargin = 0
293
293
294
294
return (
295
295
a . collisionLeft + collisionPadding < b . collisionLeft + b . collisionWidth &&
296
296
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
+ )
299
318
)
300
319
}
301
320
@@ -309,7 +328,8 @@ export function groupStack(
309
328
group ,
310
329
groupHeight ,
311
330
groupTop ,
312
- itemIndex
331
+ itemIndex ,
332
+ collision
313
333
) {
314
334
// calculate non-overlapping positions
315
335
let curHeight = groupHeight
@@ -387,9 +407,12 @@ export function stackAll(itemsDimensions, groupOrders, lineHeight, stackItems) {
387
407
// Is group being stacked?
388
408
const isGroupStacked =
389
409
group . stackItems !== undefined ? group . stackItems : stackItems
410
+ const shouldStackEnforceOrder =
411
+ group . shouldStackEnforceOrder !== undefined ? group . shouldStackEnforceOrder : false
390
412
const { groupHeight, verticalMargin } = stackGroup (
391
413
itemsDimensions ,
392
414
isGroupStacked ,
415
+ shouldStackEnforceOrder ,
393
416
lineHeight ,
394
417
groupTop
395
418
)
@@ -411,15 +434,16 @@ export function stackAll(itemsDimensions, groupOrders, lineHeight, stackItems) {
411
434
}
412
435
413
436
/**
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
419
442
*/
420
- export function stackGroup ( itemsDimensions , isGroupStacked , lineHeight , groupTop ) {
443
+ export function stackGroup ( itemsDimensions , isGroupStacked , shouldStackEnforceOrder , lineHeight , groupTop ) {
421
444
var groupHeight = 0
422
445
var verticalMargin = 0
446
+ const collision = shouldStackEnforceOrder ? collisionOrOrderMismatch : simpleCollision
423
447
// Find positions for each item in group
424
448
for ( let itemIndex = 0 ; itemIndex < itemsDimensions . length ; itemIndex ++ ) {
425
449
let r = { }
@@ -430,7 +454,8 @@ export function stackGroup(itemsDimensions, isGroupStacked, lineHeight, groupTop
430
454
itemsDimensions ,
431
455
groupHeight ,
432
456
groupTop ,
433
- itemIndex
457
+ itemIndex ,
458
+ collision
434
459
)
435
460
} else {
436
461
r = groupNoStack ( lineHeight , itemsDimensions [ itemIndex ] , groupHeight , groupTop )
0 commit comments