31 [[nodiscard]]
size_t nr_items()
const noexcept
40 tt_axiom(index < std::ssize(items));
41 tt_axiom(index + 1 < std::ssize(margins));
42 items[index].update(extent, resistance);
43 margins[index] =
std::max(margins[index], margin);
44 margins[index+1] =
std::max(margins[index+1], margin);
47 [[nodiscard]]
float minimum_size()
const noexcept
51 return acc + item.minimum_size();
58 set_items_to_minimum_size();
59 auto extra_size = total_size -
size();
62 auto nr_can_grow = number_of_items_that_can_grow(resistance);
63 while (extra_size >= 1.0f && nr_can_grow != 0) {
64 nr_can_grow = grow_items(nr_can_grow, resistance, extra_size);
68 calculate_offset_and_size();
74 [[nodiscard]]
float size() const noexcept
77 return margins.
back();
79 tt_axiom(items.
back().offset >= 0.0f);
80 return items.
back().offset + items.
back().size + margins.
back();
90 tt_axiom(first >= 0 && first < std::ssize(items));
91 tt_axiom(last > 0 && last <= std::ssize(items));
93 auto offset = items[first].offset;
94 auto size = (items[last - 1].offset + items[last - 1].
size) - offset;
95 return {offset,
size};
108 while (std::ssize(items) < new_size) {
112 while (std::ssize(margins) < new_size + 1) {
116 tt_axiom(margins.
size() == items.
size() + 1);
120 struct flow_layout_item {
121 constexpr flow_layout_item() noexcept : _minimum_size(0.0f), _resistance(1), offset(-1.0f), size(-1.0f) {}
123 constexpr flow_layout_item(flow_layout_item
const &rhs)
noexcept =
default;
124 constexpr flow_layout_item(flow_layout_item &&rhs)
noexcept =
default;
125 constexpr flow_layout_item &operator=(flow_layout_item
const &rhs)
noexcept =
default;
126 constexpr flow_layout_item &operator=(flow_layout_item &&rhs)
noexcept =
default;
128 constexpr void update(
float minimum_size, ranged_int<3> resistance)
noexcept
130 _minimum_size =
std::max(_minimum_size, minimum_size);
131 switch (
static_cast<int>(resistance)) {
133 _resistance = _resistance == 2 ? 2 : 0;
145 [[nodiscard]]
float minimum_size() const noexcept {
146 return _minimum_size;
149 [[nodiscard]]
float maximum_size() const noexcept {
153 [[nodiscard]] ranged_int<3> resistance() const noexcept
163 ranged_int<3> _resistance;
173 void set_items_to_minimum_size() noexcept
175 for (
auto &&item : items) {
178 calculate_offset_and_size();
181 [[nodiscard]] ssize_t number_of_items_that_can_grow(ranged_int<3> resistance)
const noexcept
183 auto nr_non_max = ssize_t{0};
185 for (
auto &&item : items) {
186 if (item.resistance() == resistance && item.size < item.maximum_size()) {
193 [[nodiscard]] ssize_t grow_items(ssize_t nr_non_max, ranged_int<3> resistance,
float &extra_size)
noexcept
195 ttlet extra_size_per_item =
std::ceil(extra_size / nr_non_max);
198 for (
auto &&item : items) {
199 if (item.resistance() == resistance) {
200 auto old_size = item.size;
202 ttlet extra_size_this_item =
std::min(extra_size, extra_size_per_item);
204 item.size =
std::ceil(item.size + extra_size_this_item);
205 extra_size -= item.size - old_size;
207 if (item.size < item.maximum_size()) {
215 void calculate_offset_and_size() noexcept
218 for (ssize_t i = 0; i != std::ssize(items); ++i) {
219 offset += margins[i];
221 offset += items[i].
size;
void reserve(ssize_t new_size) noexcept
Grow layout to include upto new_size of items.
Definition flow_layout.hpp:106
float size() const noexcept
Calculate the size of the combined items in the layout.
Definition flow_layout.hpp:74
void set_size(float total_size) noexcept
Update the layout of all items based on the total size.
Definition flow_layout.hpp:57