@@ -532,6 +532,8 @@ static void tst_layoutnode_horizontal_flow()
532
532
root->setActivationMode (LayoutNode::Explicit);
533
533
root->setLayoutType (LayoutEngine::Flow_Horizontal);
534
534
535
+ float inf = std::numeric_limits<float >::infinity ();
536
+
535
537
RectangleNode *r[4 ]; // sizes: 10, 20, 40, 80
536
538
for (int i=0 ; i<4 ; ++i) {
537
539
float s = std::pow (2 , (float )i) * 10 ;
@@ -549,25 +551,68 @@ static void tst_layoutnode_horizontal_flow()
549
551
check_equal (r[1 ]->geometry (), rect2d::fromXywh (13 , 2 , 20 , 20 ));
550
552
check_equal (r[2 ]->geometry (), rect2d::fromXywh (34 , 2 , 40 , 40 ));
551
553
check_equal (r[3 ]->geometry (), rect2d::fromXywh (75 , 2 , 80 , 80 ));
552
- apply_w_h_r_c_m_s (root, 76 , 0 , 0 , 0 , 2 , 1 ); // r[2] ends on 74, +2 margin
554
+ apply_w_h_r_c_m_s (root, 78 , 0 , 0 , 0 , 2 , 1 ); // r[2] ends on 74, +4 (2+2) margin
553
555
check_equal (r[0 ]->geometry (), rect2d::fromXywh ( 2 , 2 , 10 , 10 ));
554
556
check_equal (r[1 ]->geometry (), rect2d::fromXywh (13 , 2 , 20 , 20 ));
555
557
check_equal (r[2 ]->geometry (), rect2d::fromXywh (34 , 2 , 40 , 40 ));
556
558
check_equal (r[3 ]->geometry (), rect2d::fromXywh ( 2 , 43 , 80 , 80 ));
557
- apply_w_h_r_c_m_s (root, 75 , 0 , 0 , 0 , 2 , 1 ); // will not fit the margin, so r[2] wraps
559
+ apply_w_h_r_c_m_s (root, 77.99 , 0 , 0 , 0 , 2 , 1 ); // will not fit the, so r[2] wraps
560
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh ( 2 , 2 , 10 , 10 ));
561
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh (13 , 2 , 20 , 20 ));
562
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh ( 2 , 23 , 40 , 40 ));
563
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh ( 2 , 64 , 80 , 80 ));
564
+ apply_w_h_r_c_m_s (root, 4 , 0 , 0 , 0 , 2 , 1 ); // too narrow width, but we always have one per row
565
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh (2 , 2 , 10 , 10 ));
566
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh (2 , 13 , 20 , 20 ));
567
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh (2 , 34 , 40 , 40 ));
568
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh (2 , 75 , 80 , 80 ));
569
+ apply_w_h_r_c_m_s (root, 0 , 0 , 0 , 2 , 2 , 1 ); // will not fit the number of items, so r[2] wraps
558
570
check_equal (r[0 ]->geometry (), rect2d::fromXywh ( 2 , 2 , 10 , 10 ));
559
571
check_equal (r[1 ]->geometry (), rect2d::fromXywh (13 , 2 , 20 , 20 ));
560
572
check_equal (r[2 ]->geometry (), rect2d::fromXywh ( 2 , 23 , 40 , 40 ));
561
573
check_equal (r[3 ]->geometry (), rect2d::fromXywh (43 , 23 , 80 , 80 ));
562
- apply_w_h_r_c_m_s (root, 3 , 0 , 0 , 0 , 2 , 1 ); // too narrow width, but we always have one per row
574
+ apply_w_h_r_c_m_s (root, 0 , 0 , 0 , 1 , 2 , 1 ); // single-column, wrap all
563
575
check_equal (r[0 ]->geometry (), rect2d::fromXywh (2 , 2 , 10 , 10 ));
564
576
check_equal (r[1 ]->geometry (), rect2d::fromXywh (2 , 13 , 20 , 20 ));
565
577
check_equal (r[2 ]->geometry (), rect2d::fromXywh (2 , 34 , 40 , 40 ));
566
578
check_equal (r[3 ]->geometry (), rect2d::fromXywh (2 , 75 , 80 , 80 ));
567
579
568
-
569
- // test wrapping by width and columns..
570
-
580
+ // Horizontal, negative layout direction..
581
+ apply_w_h_r_c_m_s (root, -inf, 0 , 0 , 0 , 0 , 0 );
582
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh ( -10 , 0 , 10 , 10 ));
583
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh ( -30 , 0 , 20 , 20 ));
584
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh ( -70 , 0 , 40 , 40 ));
585
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh (-150 , 0 , 80 , 80 ));
586
+ apply_w_h_r_c_m_s (root, -inf, 0 , 0 , 0 , 2 , 1 );
587
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh ( -12 , 2 , 10 , 10 ));
588
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh ( -33 , 2 , 20 , 20 ));
589
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh ( -74 , 2 , 40 , 40 ));
590
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh (-155 , 2 , 80 , 80 ));
591
+ apply_w_h_r_c_m_s (root, -78 , 0 , 0 , 0 , 2 , 1 ); // r[2] ends on 74, +4 (2+2) margin
592
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh (-12 , 2 , 10 , 10 ));
593
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh (-33 , 2 , 20 , 20 ));
594
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh (-74 , 2 , 40 , 40 ));
595
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh (-82 , 43 , 80 , 80 ));
596
+ apply_w_h_r_c_m_s (root, -77.99 , 0 , 0 , 0 , 2 , 1 ); // will not fit the, so r[2] wraps
597
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh (-12 , 2 , 10 , 10 ));
598
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh (-33 , 2 , 20 , 20 ));
599
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh (-42 , 23 , 40 , 40 ));
600
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh (-82 , 64 , 80 , 80 ));
601
+ apply_w_h_r_c_m_s (root, -4 , 0 , 0 , 0 , 2 , 1 ); // too narrow width, but we always have one per row
602
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh (-12 , 2 , 10 , 10 ));
603
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh (-22 , 13 , 20 , 20 ));
604
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh (-42 , 34 , 40 , 40 ));
605
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh (-82 , 75 , 80 , 80 ));
606
+ apply_w_h_r_c_m_s (root, -inf, 0 , 0 , 2 , 2 , 1 ); // will not fit rows, so r[2] wraps
607
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh (-12 , 2 , 10 , 10 ));
608
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh (-33 , 2 , 20 , 20 ));
609
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh (-42 , 23 , 40 , 40 ));
610
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh (-123 , 23 , 80 , 80 ));
611
+ apply_w_h_r_c_m_s (root, -inf, 0 , 0 , 1 , 2 , 1 ); // single-column, wrap all
612
+ check_equal (r[0 ]->geometry (), rect2d::fromXywh (-12 , 2 , 10 , 10 ));
613
+ check_equal (r[1 ]->geometry (), rect2d::fromXywh (-22 , 13 , 20 , 20 ));
614
+ check_equal (r[2 ]->geometry (), rect2d::fromXywh (-42 , 34 , 40 , 40 ));
615
+ check_equal (r[3 ]->geometry (), rect2d::fromXywh (-82 , 75 , 80 , 80 ));
571
616
572
617
573
618
cout << __PRETTY_FUNCTION__ << " : ok" << endl;
0 commit comments