diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-13 18:31:27 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-13 18:31:27 -0400 |
| commit | e17d9402663859f7fd1d83bdc5e6b7bf0489974e (patch) | |
| tree | 074abaf544e4f8ea7dbd53afcd4a1105d4e48546 /src/static-ui.cpp | |
| parent | a88391495ac5008e84e379c50d04381ffe1363cd (diff) | |
pke: refactor for tracking padding via lbrt
Diffstat (limited to 'src/static-ui.cpp')
| -rw-r--r-- | src/static-ui.cpp | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/src/static-ui.cpp b/src/static-ui.cpp index fff8ecc..7df5a34 100644 --- a/src/static-ui.cpp +++ b/src/static-ui.cpp @@ -106,12 +106,17 @@ void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_fl assert(box->min_height <= box->max_height); if (box->internal.parent != nullptr) { - parent_pos_and_offset.x = box->internal.parent->internal.px_corner_x + box->internal.parent->internal.px_offset_x; - parent_pos_and_offset.y = box->internal.parent->internal.px_corner_y + box->internal.parent->internal.px_offset_y; - parent_size_padded.x = box->internal.parent->internal.px_width; - parent_size_padded.y = box->internal.parent->internal.px_height; + parent_pos_and_offset.x = box->internal.parent->internal.px_corner.x + + box->internal.parent->internal.px_padding_l; + parent_pos_and_offset.y = box->internal.parent->internal.px_corner.y + + box->internal.parent->internal.px_padding_t; + parent_size_padded.x = box->internal.parent->internal.px_size.x; + parent_size_padded.y = box->internal.parent->internal.px_size.y; // built-in padding - parent_size_padded -= glm::vec2(built_in_offset * 2); + parent_size_padded.x -= box->internal.parent->internal.px_padding_l + + box->internal.parent->internal.px_padding_r; + parent_size_padded.y -= box->internal.parent->internal.px_padding_t + + box->internal.parent->internal.px_padding_b; px_size = parent_size_padded; } else { parent_pos_and_offset = glm::vec2(0); @@ -123,23 +128,16 @@ void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_fl px_min_size.y = box->min_height; px_max_size.x = box->max_width; px_max_size.y = box->max_height; - box->internal.px_corner_x = 0 + box->internal.px_corner.x = 0 + parent_pos_and_offset.x + box->pos_top_left_x; - box->internal.px_corner_y = 0 + box->internal.px_corner.y = 0 + parent_pos_and_offset.y + box->pos_top_left_y; if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_POSITION_TYPE_FLEX)) { assert(flex_params != nullptr); assert(box->internal.parent != nullptr); - // TODO - think through how to organize this. - // It's almost like the parent needs to set the widths/heights of the children - // In every other method, the child determines its size, - // in flex, the parent sums the weights and distributes the available size. - // Could pass a struct around with all the needed details: - // - width or height per weight unit, current used weight or current offset - // Parent should assert that all or none of the children are position type flex? if (box->internal.parent->flex_direction == 0) { px_size.x = flex_params->px_per_unit * box->flex_weight; } else { @@ -151,12 +149,12 @@ void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_fl } else { assert(box->pos_top_left_x < 1.0); assert(box->pos_top_left_y < 1.0); - box->internal.px_corner_x = parent_pos_and_offset.x; - box->internal.px_corner_y = parent_pos_and_offset.y; + box->internal.px_corner.x = parent_pos_and_offset.x; + box->internal.px_corner.y = parent_pos_and_offset.y; float px_left = px_size.x * box->pos_top_left_x; float px_top = px_size.y * box->pos_top_left_y; - box->internal.px_corner_x += px_left; - box->internal.px_corner_y += px_top; + box->internal.px_corner.x += px_left; + box->internal.px_corner.y += px_top; px_size.x -= px_left; px_size.y -= px_top; px_min_size.x = box->min_width * parent_size_padded.x; @@ -168,26 +166,33 @@ void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_fl px_size = glm::clamp(px_size, px_min_size, px_max_size); // built-in padding - box->internal.px_offset_x = built_in_offset; - box->internal.px_offset_y = built_in_offset; + box->internal.px_padding_l = built_in_offset; + box->internal.px_padding_b = built_in_offset; + box->internal.px_padding_r = built_in_offset; + box->internal.px_padding_t = built_in_offset; if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_CENTER_HORIZONTAL)) { if (parent_size_padded.x > px_size.x) { - box->internal.px_corner_x += (parent_size_padded.x - px_size.x) / 2.0; + box->internal.px_corner.x += (parent_size_padded.x - px_size.x) / 2.0; } } if (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_CENTER_VERTICAL)) { if (parent_size_padded.y > px_size.y) { - box->internal.px_corner_y += (parent_size_padded.y - px_size.y) / 2.0; + box->internal.px_corner.y += (parent_size_padded.y - px_size.y) / 2.0; } } - box->internal.px_width = px_size.x; - box->internal.px_height = px_size.y; + box->internal.px_size.x = px_size.x; + box->internal.px_size.y = px_size.y; if (box->internal.parent != nullptr) { - box->internal.parent->internal.px_offset_x += px_size.x; - box->internal.parent->internal.px_offset_y += px_size.y; + // 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 (PK_HAS_FLAG(box->flags, PKE_UI_BOX_FLAG_VISIBILITY_INVISIBLE)) { @@ -195,20 +200,20 @@ void pke_ui_calc_px(DynArray<pke_ui_box_instance_buffer_item> &buffer, pke_ui_fl } // update buffer - glm::vec3 scale = glm::vec3(box->internal.px_width / (float)Extent.width, box->internal.px_height / (float)Extent.height, 1.0); + glm::vec3 scale = glm::vec3(box->internal.px_size.x / (float)Extent.width, box->internal.px_size.y / (float)Extent.height, 1.0); glm::vec3 translate = glm::vec3(1); // ((val) - (width/2)) / (width/2) // place left line of box at edge of screen - translate.x = (box->internal.px_width / 2.0); + translate.x = (box->internal.px_size.x / 2.0); // box position - translate.x += box->internal.px_corner_x; + translate.x += box->internal.px_corner.x; translate.x -= ((float)Extent.width / 2.0); translate.x /= ((float)Extent.width / 2.0); // ((val) - (height/2)) / (height/2) // place top line of box at edge of screen - translate.y = (box->internal.px_height / 2.0); + translate.y = (box->internal.px_size.y / 2.0); // box position - translate.y += box->internal.px_corner_y; + translate.y += box->internal.px_corner.y; translate.y -= ((float)Extent.height / 2.0); translate.y /= ((float)Extent.height / 2.0); translate.z = 0; @@ -246,8 +251,8 @@ void pke_ui_recalc_sizes_recursive(DynArray<pke_ui_box_instance_buffer_item> &ar if (flex_count != 0) { flex_params.px_per_unit = box->flex_direction == 0 - ? box->internal.px_width / flex_params.unit_total - : box->internal.px_height / flex_params.unit_total; + ? box->internal.px_size.x / flex_params.unit_total + : box->internal.px_size.y / flex_params.unit_total; } for (pke_ui_box_count_T i = 0; i < box->internal.h_children; ++i) { |
