FTXUI 6.1.9
C++ functional terminal UI.
载入中...
搜索中...
未找到
box_helper.cpp
浏览该文件的文档.
1// Copyright 2021 Arthur Sonzogni. 保留所有权利。
2// 本源代码的使用受可在 LICENSE 文件中找到的 MIT 许可协议的管辖。
4
5#include <algorithm> // 用于最大值
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// 当允许的大小大于请求的大小时调用。这会将多余的空间按相对比例分配给灵活元素。
19void ComputeGrow(std::vector<Element>* elements,
20 int extra_space,
21 int flex_grow_sum) {
22 for (Element& element : *elements) {
23 const int added_space =
24 SafeRatio(extra_space, element.flex_grow, flex_grow_sum);
25 extra_space -= added_space;
26 flex_grow_sum -= element.flex_grow;
27 element.size = element.min_size + added_space;
28 }
29}
30
31// 当允许的大小小于请求的大小时调用,并且可收缩元素可以吸收(负的)额外空间。这将额外空间分配给这些元素。
32void ComputeShrinkEasy(std::vector<Element>* elements,
33 int extra_space,
34 int flex_shrink_sum) {
35 for (Element& element : *elements) {
36 const int added_space = SafeRatio(
37 extra_space, element.min_size * element.flex_shrink, flex_shrink_sum);
38 extra_space -= added_space;
39 flex_shrink_sum -= element.flex_shrink * element.min_size;
40 element.size = element.min_size + added_space;
41 }
42}
43
44// 当允许的大小小于请求的大小时调用,并且可收缩元素不能吸收(负的)额外空间。这会将可收缩元素设置为零,并将剩余的(负的)额外空间分配给其他不可收缩元素。
45void ComputeShrinkHard(std::vector<Element>* elements,
46 int extra_space,
47 int size) {
48 for (Element& element : *elements) {
49 if (element.flex_shrink != 0) {
50 element.size = 0;
51 continue;
52 }
53
54 const int added_space = SafeRatio(extra_space, element.min_size, size);
55
56 extra_space -= added_space;
57 size -= element.min_size;
58
59 element.size = element.min_size + added_space;
60 }
61}
62
63} // namespace
64
65void Compute(std::vector<Element>* elements, int target_size) {
66 int size = 0;
67 int flex_grow_sum = 0;
68 int flex_shrink_sum = 0;
69 int flex_shrink_size = 0;
70
71 for (auto& element : *elements) {
72 flex_grow_sum += element.flex_grow;
73 flex_shrink_sum += element.min_size * element.flex_shrink;
74 if (element.flex_shrink != 0) {
75 flex_shrink_size += element.min_size;
76 }
77 size += element.min_size;
78 }
79
80 const int extra_space = target_size - size;
81 if (extra_space >= 0) {
82 ComputeGrow(elements, extra_space, flex_grow_sum);
83 } else if (flex_shrink_size + extra_space >= 0) {
84 ComputeShrinkEasy(elements, extra_space, flex_shrink_sum);
85
86 } else {
87 ComputeShrinkHard(elements, extra_space + flex_shrink_size,
88 size - flex_shrink_size);
89 }
90}
91
92} // namespace ftxui::box_helper
Decorator size(WidthOrHeight, Constraint, int value)
对元素大小应用约束。
void Compute(std::vector< Element > *elements, int target_size)