FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
box_helper.cpp
Go to the documentation of this file.
1// Copyright 2021 Arthur Sonzogni. 全著作権所有。
2// このソースコードの使用は、LICENSE ファイルにある MIT ライセンスによって管理されています。
4
5#include <algorithm> // for max
6#include <cstdint>
7#include <vector> // for vector
8
10
11namespace {
12
13int SafeRatio(int value, int numerator, int denominator) {
14 return static_cast<int64_t>(value) * static_cast<int64_t>(numerator) /
15 std::max(static_cast<int64_t>(denominator), static_cast<int64_t>(1));
16}
17
18// 許容されるサイズが要求されたサイズよりも大きい場合に呼び出されます。これは、
19// 余分なスペースを柔軟な要素に相対的な比率で分配します。
20void ComputeGrow(std::vector<Element>* elements,
21 int extra_space,
22 int flex_grow_sum) {
23 for (Element& element : *elements) {
24 const int added_space =
25 SafeRatio(extra_space, element.flex_grow, flex_grow_sum);
26 extra_space -= added_space;
27 flex_grow_sum -= element.flex_grow;
28 element.size = element.min_size + added_space;
29 }
30}
31
32// 許容されるサイズが要求されたサイズよりも小さい場合に呼び出され、
33// 縮小可能な要素が(負の)余分なスペースを吸収できます。これは、
34// その余分なスペースをそれらに分配します。
35void ComputeShrinkEasy(std::vector<Element>* elements,
36 int extra_space,
37 int flex_shrink_sum) {
38 for (Element& element : *elements) {
39 const int added_space = SafeRatio(
40 extra_space, element.min_size * element.flex_shrink, flex_shrink_sum);
41 extra_space -= added_space;
42 flex_shrink_sum -= element.flex_shrink * element.min_size;
43 element.size = element.min_size + added_space;
44 }
45}
46
47// 許容されるサイズが要求されたサイズよりも小さく、
48// 縮小可能な要素が(負の)余分なスペースを吸収できない場合に呼び出されます。これは、
49// 縮小可能な要素にゼロを割り当て、残りの(負の)
50// 余分なスペースを他の縮小不可能な要素に分配します。
51void ComputeShrinkHard(std::vector<Element>* elements,
52 int extra_space,
53 int size) {
54 for (Element& element : *elements) {
55 if (element.flex_shrink != 0) {
56 element.size = 0;
57 continue;
58 }
59
60 const int added_space = SafeRatio(extra_space, element.min_size, size);
61
62 extra_space -= added_space;
63 size -= element.min_size;
64
65 element.size = element.min_size + added_space;
66 }
67}
68
69} // namespace
70
71void Compute(std::vector<Element>* elements, int target_size) {
72 int size = 0;
73 int flex_grow_sum = 0;
74 int flex_shrink_sum = 0;
75 int flex_shrink_size = 0;
76
77 for (auto& element : *elements) {
78 flex_grow_sum += element.flex_grow;
79 flex_shrink_sum += element.min_size * element.flex_shrink;
80 if (element.flex_shrink != 0) {
81 flex_shrink_size += element.min_size;
82 }
83 size += element.min_size;
84 }
85
86 const int extra_space = target_size - size;
87 if (extra_space >= 0) {
88 ComputeGrow(elements, extra_space, flex_grow_sum);
89 } else if (flex_shrink_size + extra_space >= 0) {
90 ComputeShrinkEasy(elements, extra_space, flex_shrink_sum);
91
92 } else {
93 ComputeShrinkHard(elements, extra_space + flex_shrink_size,
94 size - flex_shrink_size);
95 }
96}
97
98} // namespace ftxui::box_helper
void Compute(std::vector< Element > *elements, int target_size)
return size
Definition string.cpp:1516