summaryrefslogtreecommitdiff
path: root/src/static-ui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/static-ui.cpp')
-rw-r--r--src/static-ui.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/static-ui.cpp b/src/static-ui.cpp
index 2682de1..72bd298 100644
--- a/src/static-ui.cpp
+++ b/src/static-ui.cpp
@@ -256,9 +256,10 @@ struct pke_ui_flex_params {
float used_units;
};
-bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<std::pair<pke_ui_box*,pke_ui_box_instance_buffer_item>> &tmp_txtr_buffer, pke_ui_flex_params *flex_params, pke_ui_box *box) {
+bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<std::pair<pke_ui_box*,pke_ui_box_instance_buffer_item>> &tmp_txtr_buffer, pke_ui_flex_params *flex_params, pke_ui_box *box, uint8_t child_index) {
assert(box != nullptr);
pke_ui_box_count_T i;
+ float flex_padding;
glm::vec2 px_size;
glm::vec2 px_min_size;
glm::vec2 px_max_size;
@@ -333,14 +334,17 @@ bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<
if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_FLEX)) {
assert(flex_params != nullptr);
assert(box->internal.parent != nullptr);
+ flex_padding = box->internal.parent->flex_padding * float(child_index + 1);
if (box->internal.parent->flex_direction == 0) {
px_size.x = flex_params->px_per_unit * box->flex_weight;
px_size.y = parent_size_padded.y;
box->internal.px_corner.x += flex_params->used_units * flex_params->px_per_unit;
+ box->internal.px_corner.x += flex_padding;
} else {
px_size.x = parent_size_padded.x;
px_size.y = flex_params->px_per_unit * box->flex_weight;
box->internal.px_corner.y += flex_params->used_units * flex_params->px_per_unit;
+ box->internal.px_corner.y += flex_padding;
}
flex_params->used_units += box->flex_weight;
} else if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC)) {
@@ -482,6 +486,7 @@ bool pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<
void pke_ui_recalc_sizes_recursive(pk_arr_t<pke_ui_box_instance_buffer_item> &arr, pk_arr_t<std::pair<pke_ui_box*,pke_ui_box_instance_buffer_item>> &tmp_txtr_buffer, pke_ui_box *box) {
PKE_UI_BOX_FLAG_T flags_masked;
uint8_t flex_count = 0;
+ float available_size = 0;
pke_ui_flex_params flex_params{};
flex_params.px_per_unit = 0;
flex_params.unit_total = 0;
@@ -507,14 +512,17 @@ void pke_ui_recalc_sizes_recursive(pk_arr_t<pke_ui_box_instance_buffer_item> &ar
return;
}
if (flex_count != 0) {
- flex_params.px_per_unit =
+ assert(box->flex_padding == box->flex_padding); // NaN
+ available_size =
box->flex_direction == 0
- ? (box->internal.px_size.x - box->internal.px_padding_l - box->internal.px_padding_r) / flex_params.unit_total
- : (box->internal.px_size.y - box->internal.px_padding_t - box->internal.px_padding_b) / flex_params.unit_total;
+ ? (box->internal.px_size.x - box->internal.px_padding_l - box->internal.px_padding_r)
+ : (box->internal.px_size.y - box->internal.px_padding_t - box->internal.px_padding_b);
+ available_size -= (float)(flex_count+1) * (box->flex_padding);
+ flex_params.px_per_unit = available_size / flex_params.unit_total;
}
for (pke_ui_box_count_T i = 0; i < box->internal.h_children; ++i) {
- if (!pke_ui_calc_px(arr, tmp_txtr_buffer, &flex_params, box->internal.children[i])) {
+ if (!pke_ui_calc_px(arr, tmp_txtr_buffer, &flex_params, box->internal.children[i], i)) {
i -= 1;
continue;
}
@@ -670,7 +678,7 @@ void pke_ui_tick(double delta) {
continue;
}
// root boxes marked for removal were already skipped
- pke_ui_calc_px(arr, tmp_txtr_arr, nullptr, box);
+ pke_ui_calc_px(arr, tmp_txtr_arr, nullptr, box, 0);
pke_ui_recalc_sizes_recursive(arr, tmp_txtr_arr, box);
}