summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-09-22 11:33:48 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-09-22 11:34:51 -0400
commitaaf6c699b86450a5fdd03f329724b275dcb27b34 (patch)
treeb1fa2171d8f15df61e9ede40e066e76ac710671f /src
parent08751c3863d95f0ef1f53f7d5326adfeb49bfbd6 (diff)
pke: multiple ui box flex size and position
Diffstat (limited to 'src')
-rw-r--r--src/static-ui.cpp22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/static-ui.cpp b/src/static-ui.cpp
index c8200b0..7145422 100644
--- a/src/static-ui.cpp
+++ b/src/static-ui.cpp
@@ -236,6 +236,7 @@ void pke_ui_update_state(pke_ui_box &box) {
struct pke_ui_flex_params {
float px_per_unit;
float unit_total;
+ float used_units;
};
void 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) {
@@ -295,9 +296,14 @@ void pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<
assert(box->internal.parent != nullptr);
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;
} 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;
}
+ flex_params->used_units += box->flex_weight;
} else if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_STATIC)) {
px_size.x -= box->pos_top_left.x;
px_size.y -= box->pos_top_left.y;
@@ -340,15 +346,6 @@ void pke_ui_calc_px(pk_arr_t<pke_ui_box_instance_buffer_item> &buffer, pk_arr_t<
box->internal.px_size.x = px_size.x;
box->internal.px_size.y = px_size.y;
- if (box->internal.parent != nullptr) {
- // TODO change this based on the parent's 'direction'
- // 2025-03-13 JCB
- // optional: auto-wrapping boxes possible if we keep track of two sizes:
- // - remaining in active row/column
- // - unused space
- // box->internal.parent->internal.px_padding_l += px_size.x;
- box->internal.parent->internal.px_padding_t += px_size.y;
- }
if (box->type_data != nullptr) {
// type-specific changes
@@ -416,6 +413,9 @@ void pke_ui_recalc_sizes_recursive(pk_arr_t<pke_ui_box_instance_buffer_item> &ar
PKE_UI_BOX_FLAG_T flags_masked;
uint8_t flex_count = 0;
pke_ui_flex_params flex_params{};
+ flex_params.px_per_unit = 0;
+ flex_params.unit_total = 0;
+ flex_params.used_units = 0;
if (box->isMarkedForRemoval == true) return;
@@ -439,8 +439,8 @@ void pke_ui_recalc_sizes_recursive(pk_arr_t<pke_ui_box_instance_buffer_item> &ar
if (flex_count != 0) {
flex_params.px_per_unit =
box->flex_direction == 0
- ? box->internal.px_size.x / flex_params.unit_total
- : box->internal.px_size.y / flex_params.unit_total;
+ ? (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;
}
for (pke_ui_box_count_T i = 0; i < box->internal.h_children; ++i) {