15 QCheckBox visibility(&panel);
17 auto *edit =
new QLineEdit();
19 if(group->isChecked() || edit->isEnabled() || !visibility.isHidden())
21 throw std::runtime_error(
"Initial group state is incorrect");
23 group->setChecked(
true);
24 if(!visibility.isChecked() || !edit->isEnabled())
26 throw std::runtime_error(
"Group checkbox did not enable its controls");
28 visibility.setChecked(
false);
29 if(group->isChecked() || edit->isEnabled())
31 throw std::runtime_error(
"Programmatic visibility did not synchronize the group");
33 const auto *label = group->findChild<QLabel *>();
34 if(!label || label->buddy() != edit || edit->toolTip().isEmpty() || label->toolTip().isEmpty())
36 throw std::runtime_error(
"Missing field label or tooltip");
38 auto *panelLayout =
new QVBoxLayout(&panel);
39 panelLayout->addWidget(group);
41 nested->setCheckable(
true);
42 nested->setChecked(
false);
43 auto *nestedLayout =
new QVBoxLayout(nested);
44 auto *nestedEdit =
new QLineEdit(
"kept value");
45 nestedLayout->addWidget(nestedEdit);
47 auto *intentionallyHidden =
new QLabel(
"Hidden option", group);
49 intentionallyHidden->hide();
52 const int collapsedHeight = group->sizeHint().height();
55 throw std::runtime_error(
"Unchecked group contents are visible");
57 group->setChecked(
true);
59 if(!edit->isVisible() || group->sizeHint().height() <= collapsedHeight || nestedEdit->isVisible())
61 throw std::runtime_error(
"Expansion failed or expanded an unchecked nested group");
63 nested->setChecked(
true);
64 group->setChecked(
false);
66 if(edit->isVisible() || nestedEdit->isVisible() || group->sizeHint().height() != collapsedHeight)
68 throw std::runtime_error(
"Collapse did not reclaim space");
70 group->setChecked(
true);
72 if(!nestedEdit->isVisible() || nestedEdit->text() !=
"kept value" || !intentionallyHidden->isHidden())
74 throw std::runtime_error(
"Collapse lost nested state, values or intentional visibility");
77 for(
const auto *name : {
"Nodes",
"Segments",
"Loops",
"Inclusions",
"GlidePlanes",
"Quadrature",
"Chart",
78 "Fields",
"SurfaceMesh",
"SlipSystems"})
80 tabs.
addTab(
new QWidget(), name);
82 tabs.resize(340, 500);
85 auto buttons = tabs.findChildren<QPushButton *>();
86 const auto checkLayout = [&]()
89 for(
const auto *button : buttons)
91 rows.insert(button->y());
92 if(button->width() < button->sizeHint().width() ||
93 !button->parentWidget()->rect().contains(button->geometry()))
95 throw std::runtime_error(
"Actor tab label is clipped");
97 for(
const auto *other : buttons)
99 if(button != other && button->geometry().intersects(other->geometry()))
101 throw std::runtime_error(
"Actor tab buttons overlap");
107 const auto narrowRows = checkLayout();
110 throw std::runtime_error(
"Actor tabs did not wrap");
113 if(tabs.
currentIndex() != 8 || !buttons[8]->isChecked() || buttons[0]->isChecked())
115 throw std::runtime_error(
"Actor tab selection failed");
117 tabs.resize(1000, 500);
119 if(checkLayout() >= narrowRows || tabs.
currentIndex() != 8)
121 throw std::runtime_error(
"Resize lost selection or failed to reflow");
123 tabs.resize(240, 500);
126 std::cout <<
"PASS: actor tab wrapping, full labels, selection and resize\n";
129 catch(
const std::exception &error)
131 std::cerr << error.what() <<
'\n';