summaryrefslogtreecommitdiff
path: root/src/static-ui.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-03-13 18:31:27 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-03-13 18:31:27 -0400
commite17d9402663859f7fd1d83bdc5e6b7bf0489974e (patch)
tree074abaf544e4f8ea7dbd53afcd4a1105d4e48546 /src/static-ui.cpp
parenta88391495ac5008e84e379c50d04381ffe1363cd (diff)
pke: refactor for tracking padding via lbrt
Diffstat (limited to 'src/static-ui.cpp')
-rw-r--r--src/static-ui.cpp71
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) {