15 class GridBox :
public Node {
17 GridBox(std::vector<Elements> lines) :
Node(), lines_(std::move(lines)) {
18 y_size = lines_.size();
19 for (
const auto& line : lines_)
20 x_size = std::max(x_size, (
int)line.size());
21 for (
auto& line : lines_) {
22 while (line.size() < (
size_t)y_size) {
28 void ComputeRequirement()
override {
36 for(
auto& line : lines_) {
37 for(
auto& cell : line) {
38 cell->ComputeRequirement();
51 for (
int x = 0; x < x_size; ++x) {
53 for (
int y = 0; y < y_size; ++y)
54 min_x = std::max(min_x, lines_[y][x]->
requirement().min_x);
59 for (
int y = 0; y < y_size; ++y) {
61 for (
int x = 0; x < x_size; ++x)
62 min_y = std::max(min_y, lines_[y][x]->
requirement().min_y);
67 void SetBox(Box box)
override {
72 init.flex_grow = 1024;
73 init.flex_shrink = 1024;
74 std::vector<box_helper::Element> elements_x(x_size, init);
75 std::vector<box_helper::Element> elements_y(y_size, init);
77 for (
int y = 0; y < y_size; ++y) {
78 for (
int x = 0; x < x_size; ++x) {
79 const auto& cell = lines_[y][x];
81 auto& e_x = elements_x[x];
82 auto& e_y = elements_y[y];
92 int target_size_x = box.x_max - box.x_min + 1;
93 int target_size_y = box.y_max - box.y_min + 1;
99 for (
int iy = 0; iy < y_size; ++iy) {
101 y += elements_y[iy].size;
106 for (
int ix = 0; ix < x_size; ++ix) {
108 x += elements_x[ix].size;
110 lines_[iy][ix]->SetBox(box_x);
115 void Render(Screen& screen)
override {
116 for (
auto& line : lines_) {
117 for (
auto& cell : line)
118 cell->Render(screen);
124 std::vector<Elements> lines_;
154 return std::make_shared<GridBox>(std::move(lines));