summaryrefslogtreecommitdiff
path: root/src/serialization-static-ui.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-08-19 13:51:40 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-08-19 14:33:08 -0400
commit154436ab88925540f86f43c0ac885c080949aa9b (patch)
tree43a22f26286428f0d165fc1ff801cd0cb87092c6 /src/serialization-static-ui.cpp
parentebcae77b137a759c453b89a774ece5a755078a38 (diff)
pke: ui box type button image
Diffstat (limited to 'src/serialization-static-ui.cpp')
-rw-r--r--src/serialization-static-ui.cpp108
1 files changed, 107 insertions, 1 deletions
diff --git a/src/serialization-static-ui.cpp b/src/serialization-static-ui.cpp
index 9ed86a0..1fa7cfd 100644
--- a/src/serialization-static-ui.cpp
+++ b/src/serialization-static-ui.cpp
@@ -1,11 +1,61 @@
#include "serialization-static-ui.hpp"
+#include "asset-manager.hpp"
#include "compile-time-assert.hpp"
#include "ecs.hpp"
#include "font.hpp"
#include "pk.h"
+#include "serialization.hpp"
#include "static-ui.hpp"
+pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_type_data::pke_ui_box_type_data_button_image *data) {
+ char *s;
+ pke_kve kve{};
+ pke_kve_container kvec{};
+
+ kvec.srlztn_handle = h->handle_head;
+ kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_UI_BOX_TYPE_DATA);
+ kvec.bkt = h->bkt;
+ kvec.arr.bkt = h->bkt;
+ kvec.children.bkt = h->bkt;
+ kvec.child_handles.bkt = h->bkt;
+ h->handle_head.itemIndex++;
+
+ compt_a<64==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_image)>();
+ {
+ kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_DEFAULT;
+ s = pk_new_arr<char>(AssetKeyLength, h->bkt);
+ memcpy(s, data->img_key_default, AssetKeyLength);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+ {
+ kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_HOVERED;
+ s = pk_new_arr<char>(AssetKeyLength, h->bkt);
+ memcpy(s, data->img_key_hovered, AssetKeyLength);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+ {
+ kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_PRESSED;
+ s = pk_new_arr<char>(AssetKeyLength, h->bkt);
+ memcpy(s, data->img_key_pressed, AssetKeyLength);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+ // 2025-08-19 TODO JCB
+ // pressed callback
+
+ pk_arr_append_t(&h->kvp_containers, kvec);
+ kvec.arr.data = nullptr;
+ kvec.children.data = nullptr;
+ kvec.child_handles.data = nullptr;
+ return kvec.srlztn_handle;
+}
+
pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_type_data::pke_ui_box_type_data_text *data) {
char *s;
pke_kve kve{};
@@ -29,6 +79,8 @@ pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_t
kve.end = SRLZTN_KVE_END;
pk_arr_append_t(&kvec.arr, kve);
}
+ // 2025-08-19 TODO JCB
+ // pressed callback
pk_arr_append_t(&h->kvp_containers, kvec);
kvec.arr.data = nullptr;
@@ -56,6 +108,49 @@ void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_conta
data->font_render_handle = fr->fr_handle;
}
+void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_container *kvec, pke_ui_box_type_data::pke_ui_box_type_data_button_image *data) {
+ (void)h;
+ uint32_t u;
+ pke_kve *kve;
+ assert(kvec != nullptr);
+ assert(data != nullptr);
+ assert(kvec->arr.next == 3);
+
+ data->gr_binds_bkt_arr_handle = pk_bkt_arr_handle_MAX;
+ data->pke_event_handle = PkeEventMgrHandle_MAX;
+ data->ev_id = {};
+
+ compt_a<64==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_image)>();
+ for (u = 0; u < kvec->arr.next; ++u) {
+ kve = &kvec->arr[u];
+ if (strstr(SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_DEFAULT, kve->key)) {
+ // TODO there's gotta be a more elegant solution to this
+ if (strlen(kve->val) < AssetKeyLength) {
+ sprintf(data->img_key_default, "%s", kve->val);
+ } else {
+ memcpy(data->img_key_default, kve->val, AssetKeyLength);
+ }
+ continue;
+ }
+ if (strstr(SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_HOVERED, kve->key)) {
+ if (strlen(kve->val) < AssetKeyLength) {
+ sprintf(data->img_key_hovered, "%s", kve->val);
+ } else {
+ memcpy(data->img_key_hovered, kve->val, AssetKeyLength);
+ }
+ continue;
+ }
+ if (strstr(SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_PRESSED, kve->key)) {
+ if (strlen(kve->val) < AssetKeyLength) {
+ sprintf(data->img_key_pressed, "%s", kve->val);
+ } else {
+ memcpy(data->img_key_pressed, kve->val, AssetKeyLength);
+ }
+ continue;
+ }
+ }
+}
+
pk_handle pke_serialize_ui_box(srlztn_serialize_helper *h, pke_ui_box *box) {
char *s;
int len;
@@ -67,6 +162,9 @@ pk_handle pke_serialize_ui_box(srlztn_serialize_helper *h, pke_ui_box *box) {
if (box->type == PKE_UI_BOX_TYPE_TEXT) {
pk_arr_append_t(&kvec.child_handles, pke_serialize_ui_box_internal(h, &box->type_data->text));
}
+ if (box->type == PKE_UI_BOX_TYPE_BUTTON_IMAGE) {
+ pk_arr_append_t(&kvec.child_handles, pke_serialize_ui_box_internal(h, &box->type_data->button_image));
+ }
kvec.srlztn_handle = h->handle_head;
kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_UI_BOX);
@@ -325,6 +423,7 @@ void pke_deserialize_ui_box(srlztn_deserialize_helper *h, pke_kve_container *kve
case PKE_UI_BOX_TYPE_STANDARD:
case PKE_UI_BOX_TYPE_TEXT:
case PKE_UI_BOX_TYPE_INPUT_TEXT:
+ case PKE_UI_BOX_TYPE_BUTTON_IMAGE:
break;
default:
fprintf(stderr, "[pke_deserialize_ui_box] Parsed unknown ui box data type from: '%s'\n", kve->val);
@@ -372,6 +471,9 @@ void pke_deserialize_ui_box(srlztn_deserialize_helper *h, pke_kve_container *kve
case PKE_UI_BOX_TYPE_TEXT:
pke_deserialize_ui_box_internal(h, kvec->children[0], &bx.type_data->text);
break;
+ case PKE_UI_BOX_TYPE_BUTTON_IMAGE:
+ pke_deserialize_ui_box_internal(h, kvec->children[0], &bx.type_data->button_image);
+ break;
default:
break;
}
@@ -394,11 +496,15 @@ void pke_deserialize_ui_box(srlztn_deserialize_helper *h, pke_kve_container *kve
// TODO consider type-specific clone functions
if (box->type_data != nullptr && bx.type_data != nullptr) {
- *box->type_data = *box->type_data;
+ *box->type_data = *bx.type_data;
pk_delete<pke_ui_box_type_data>(bx.type_data);
bx.type_data = nullptr;
}
+ if (box->type == PKE_UI_BOX_TYPE_BUTTON_IMAGE) {
+ pke_ui_box_update_textures(box);
+ }
+
srlztn_ecs_mapping map{};
map.serialized_uuid = bx.uuid;
map.created_entity = box;