From 4d0c1c66b338d26988663ebb17ec511e8dfa0f6b Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 5 Jan 2024 11:39:19 +0900 Subject: [PATCH] [ui] Refresh hierarchy pointers With the change to hierarchies being components, any pointers to the hierarchy component are not stable and must be refreshed after the possibility of adding or removing a hierarchy. --- libs/ui/text.c | 7 +++++++ libs/ui/view.c | 14 +++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/libs/ui/text.c b/libs/ui/text.c index 538533ec1..44635aaee 100644 --- a/libs/ui/text.c +++ b/libs/ui/text.c @@ -274,8 +274,13 @@ Text_PassageView (text_system_t textsys, view_t parent, } } ecs_system_t viewsys = { reg, textsys.view_base }; + if (Ent_HasComponent (h->ent[0], viewsys.base + view_href, viewsys.reg)) { + Ent_RemoveComponent (h->ent[0], viewsys.base + view_href, viewsys.reg); + h = Ent_GetComponent (passage->hierarchy, ecs_hierarchy, reg); + } view_t passage_view = View_AddToEntity (h->ent[0], viewsys, parent, false); + h = Ent_GetComponent (passage->hierarchy, ecs_hierarchy, reg); glyphref_t passage_ref = {}; glyphobj_t *glyphs = malloc (glyph_count * sizeof (glyphobj_t)); glyphnode_t *g = glyph_nodes; @@ -285,11 +290,13 @@ Text_PassageView (text_system_t textsys, view_t parent, uint32_t paragraph = h->childIndex[0] + i; view_t paraview = View_AddToEntity (h->ent[paragraph], viewsys, passage_view, false); + h = Ent_GetComponent (passage->hierarchy, ecs_hierarchy, reg); glyphref_t pararef = { .start = passage_ref.count }; for (uint32_t j = 0; j < h->childCount[paragraph]; j++, g = g->next) { uint32_t to = h->childIndex[paragraph] + j; view_t textview = View_AddToEntity (h->ent[to], viewsys, paraview, false); + h = Ent_GetComponent (passage->hierarchy, ecs_hierarchy, reg); configure_textview (textview, glyphs, g, passage_ref.count, c_glyphs); View_SetGravity (textview, grav_flow); diff --git a/libs/ui/view.c b/libs/ui/view.c index bfce0937d..aadd0bbbe 100644 --- a/libs/ui/view.c +++ b/libs/ui/view.c @@ -147,18 +147,18 @@ view_t View_AddToEntity (uint32_t ent, ecs_system_t viewsys, view_t parent, bool own) { uint32_t href_comp = viewsys.base + view_href; - hierref_t *ref = Ent_AddComponent (ent, href_comp, viewsys.reg); + hierref_t ref = {}; if (parent.reg && parent.id != nullent) { hierref_t pref = View_GetRef (parent); - *ref = Hierarchy_InsertHierarchy (pref, nullhref, viewsys.reg); + ref = Hierarchy_InsertHierarchy (pref, nullhref, viewsys.reg); } else { - ref->id = Hierarchy_New (viewsys.reg, href_comp, &view_type, 1); - ref->index = 0; + ref.id = Hierarchy_New (viewsys.reg, href_comp, &view_type, 1); } - hierarchy_t *h = Ent_GetComponent (ref->id, ecs_hierarchy, viewsys.reg); - h->ent[ref->index] = ent; - h->own[ref->index] = own; + Ent_SetComponent (ent, href_comp, viewsys.reg, &ref); + hierarchy_t *h = Ent_GetComponent (ref.id, ecs_hierarchy, viewsys.reg); + h->ent[ref.index] = ent; + h->own[ref.index] = own; return (view_t) { .reg = viewsys.reg, .id = ent, .comp = href_comp }; }