24int Integrate(std::vector<int>& elements) {
26 for (
auto& i : elements) {
27 const int old_accu = accu;
34class GridBox :
public Node {
36 explicit GridBox(std::vector<Elements> lines) :
lines_(std::move(lines)) {
38 for (
const auto& line :
lines_) {
43 for (
auto& line :
lines_) {
44 while (line.size() <
size_t(
x_size)) {
45 line.push_back(filler());
50 void ComputeRequirement()
override {
51 requirement_ = Requirement{};
52 for (
auto& line :
lines_) {
53 for (
auto& cell : line) {
54 cell->ComputeRequirement();
59 std::vector<int> size_x(
x_size, 0);
60 std::vector<int> size_y(
y_size, 0);
61 for (
int x = 0; x <
x_size; ++x) {
62 for (
int y = 0; y <
y_size; ++y) {
63 size_x[x] = std::max(size_x[x],
lines_[y][x]->requirement().min_x);
64 size_y[y] = std::max(size_y[y],
lines_[y][x]->requirement().min_y);
68 requirement_.min_x = Integrate(size_x);
69 requirement_.min_y = Integrate(size_y);
72 for (
int x = 0; x <
x_size; ++x) {
73 for (
int y = 0; y <
y_size; ++y) {
74 if (requirement_.focused.enabled ||
75 !
lines_[y][x]->requirement().focused.enabled) {
78 requirement_.focused =
lines_[y][x]->requirement().focused;
79 requirement_.focused.box.Shift(size_x[x], size_y[y]);
84 void SetBox(Box box)
override {
87 box_helper::Element init;
89 init.flex_grow = 1024;
90 init.flex_shrink = 1024;
91 std::vector<box_helper::Element> elements_x(
x_size, init);
92 std::vector<box_helper::Element> elements_y(
y_size, init);
94 for (
int y = 0; y <
y_size; ++y) {
95 for (
int x = 0; x <
x_size; ++x) {
96 const auto& cell =
lines_[y][x];
97 const auto& requirement = cell->requirement();
98 auto& e_x = elements_x[x];
99 auto& e_y = elements_y[y];
100 e_x.min_size = std::max(e_x.min_size, requirement.min_x);
101 e_y.min_size = std::max(e_y.min_size, requirement.min_y);
102 e_x.flex_grow = std::min(e_x.flex_grow, requirement.flex_grow_x);
103 e_y.flex_grow = std::min(e_y.flex_grow, requirement.flex_grow_y);
104 e_x.flex_shrink = std::min(e_x.flex_shrink, requirement.flex_shrink_x);
105 e_y.flex_shrink = std::min(e_y.flex_shrink, requirement.flex_shrink_y);
109 const int target_size_x = box.x_max - box.x_min + 1;
110 const int target_size_y = box.y_max - box.y_min + 1;
111 box_helper::Compute(&elements_x, target_size_x);
112 box_helper::Compute(&elements_y, target_size_y);
116 for (
int iy = 0; iy <
y_size; ++iy) {
118 y += elements_y[iy].size;
123 for (
int ix = 0; ix <
x_size; ++ix) {
125 x += elements_x[ix].size;
127 lines_[iy][ix]->SetBox(box_x);
132 void Render(Screen& screen)
override {
133 for (
auto& line :
lines_) {
134 for (
auto& cell : line) {
135 cell->Render(screen);
173 return std::make_shared<GridBox>(std::move(lines));
std::shared_ptr< Node > Element
Element gridbox(std::vector< Elements > lines)
要素のグリッドを表示するコンテナ。
std::vector< Elements > lines_