@@ -134,43 +134,47 @@ namespace ECS::Util
134134 auto & panelComp = registry->emplace <ECS::Components::UI::Panel>(entity);
135135 panelComp.layer = layer;
136136
137- u32 templateNameHash = StringUtils::fnv1a_32 (templateName, strlen (templateName));
138- u32 templateIndex = uiSingleton.templateHashToPanelTemplateIndex [templateNameHash];
139- panelComp.templateIndex = templateIndex;
140-
141- const ECS::Components::UI::PanelTemplate& panelTemplate = uiSingleton.panelTemplates [templateIndex];
142-
143137 // Set this texts specific template data
144138 ECS::Components::UI::PanelTemplate& panelTemplateComp = registry->emplace <ECS::Components::UI::PanelTemplate>(entity);
145- panelTemplateComp = panelTemplate;
139+
140+ // Copy template if provided
141+ if (templateName != nullptr )
142+ {
143+ u32 templateNameHash = StringUtils::fnv1a_32 (templateName, strlen (templateName));
144+ u32 templateIndex = uiSingleton.templateHashToPanelTemplateIndex [templateNameHash];
145+
146+ const ECS::Components::UI::PanelTemplate& panelTemplate = uiSingleton.panelTemplates [templateIndex];
147+ panelTemplateComp = panelTemplate;
148+ panelComp.templateIndex = templateIndex;
149+ }
146150
147151 // Event Input Info
148152 auto & eventInputInfo = registry->emplace <ECS::Components::UI::EventInputInfo>(entity);
149153
150- if (!panelTemplate .onClickTemplate .empty ())
154+ if (!panelTemplateComp .onClickTemplate .empty ())
151155 {
152- SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplate .onClickTemplate , eventInputInfo.onClickTemplateHash );
156+ SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplateComp .onClickTemplate , eventInputInfo.onClickTemplateHash );
153157 }
154- if (!panelTemplate .onHoverTemplate .empty ())
158+ if (!panelTemplateComp .onHoverTemplate .empty ())
155159 {
156- SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplate .onHoverTemplate , eventInputInfo.onHoverTemplateHash );
160+ SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplateComp .onHoverTemplate , eventInputInfo.onHoverTemplateHash );
157161 }
158- if (!panelTemplate .onUninteractableTemplate .empty ())
162+ if (!panelTemplateComp .onUninteractableTemplate .empty ())
159163 {
160- SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplate .onUninteractableTemplate , eventInputInfo.onUninteractableTemplateHash );
164+ SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplateComp .onUninteractableTemplate , eventInputInfo.onUninteractableTemplateHash );
161165 }
162166
163- eventInputInfo.onMouseDownEvent = panelTemplate .onMouseDownEvent ;
164- eventInputInfo.onMouseUpEvent = panelTemplate .onMouseUpEvent ;
165- eventInputInfo.onMouseHeldEvent = panelTemplate .onMouseHeldEvent ;
167+ eventInputInfo.onMouseDownEvent = panelTemplateComp .onMouseDownEvent ;
168+ eventInputInfo.onMouseUpEvent = panelTemplateComp .onMouseUpEvent ;
169+ eventInputInfo.onMouseHeldEvent = panelTemplateComp .onMouseHeldEvent ;
166170
167- eventInputInfo.onHoverBeginEvent = panelTemplate .onHoverBeginEvent ;
168- eventInputInfo.onHoverEndEvent = panelTemplate .onHoverEndEvent ;
169- eventInputInfo.onHoverHeldEvent = panelTemplate .onHoverHeldEvent ;
171+ eventInputInfo.onHoverBeginEvent = panelTemplateComp .onHoverBeginEvent ;
172+ eventInputInfo.onHoverEndEvent = panelTemplateComp .onHoverEndEvent ;
173+ eventInputInfo.onHoverHeldEvent = panelTemplateComp .onHoverHeldEvent ;
170174
171- eventInputInfo.onFocusBeginEvent = panelTemplate .onFocusBeginEvent ;
172- eventInputInfo.onFocusEndEvent = panelTemplate .onFocusEndEvent ;
173- eventInputInfo.onFocusHeldEvent = panelTemplate .onFocusHeldEvent ;
175+ eventInputInfo.onFocusBeginEvent = panelTemplateComp .onFocusBeginEvent ;
176+ eventInputInfo.onFocusEndEvent = panelTemplateComp .onFocusEndEvent ;
177+ eventInputInfo.onFocusHeldEvent = panelTemplateComp .onFocusHeldEvent ;
174178
175179 return entity;
176180 }
@@ -207,9 +211,10 @@ namespace ECS::Util
207211
208212 // Text
209213 auto & textComp = registry->emplace <ECS::Components::UI::Text>(entity);
210- textComp.text = text;
214+ textComp.rawText = text;
211215 textComp.layer = layer;
212- ReplaceTextNewLines (textComp.text );
216+ ReplaceTextNewLines (textComp.rawText );
217+ textComp.text = textComp.rawText ;
213218
214219 u32 templateNameHash = StringUtils::fnv1a_32 (templateName, strlen (templateName));
215220 u32 templateIndex = uiSingleton.templateHashToTextTemplateIndex [templateNameHash];
@@ -221,7 +226,7 @@ namespace ECS::Util
221226
222227 if (textTemplate.setFlags .wrapWidth )
223228 {
224- textComp.text = GenWrapText (textComp.text , font, textTemplate.size , textTemplate.borderSize , textTemplate.wrapWidth );
229+ textComp.text = GenWrapText (textComp.rawText , font, textTemplate.size , textTemplate.borderSize , textTemplate.wrapWidth );
225230 }
226231
227232 vec2 textSize = font->CalculateTextSize (textComp.text .c_str (), textTemplate.size , textTemplate.borderSize );
@@ -267,11 +272,14 @@ namespace ECS::Util
267272 entt::entity entity = registry->create ();
268273
269274 // Transform
275+ auto & parentTransformComp = registry->get <ECS::Components::Transform2D>(parent);
276+ const vec2& parentSize = parentTransformComp.GetSize ();
270277 auto & transformComp = registry->emplace <ECS::Components::Transform2D>(entity);
271278
272279 transform2DSystem.ParentEntityTo (parent, entity);
273280 transform2DSystem.SetLayer (entity, layer);
274281 transform2DSystem.SetLocalPosition (entity, pos);
282+ transform2DSystem.SetSize (entity, parentSize);
275283
276284 // Widget
277285 auto & widgetComp = registry->emplace <ECS::Components::UI::Widget>(entity);
@@ -357,23 +365,23 @@ namespace ECS::Util
357365
358366 ECS::Components::UI::Text& textComponent = registry->get <ECS::Components::UI::Text>(entity);
359367
360- size_t newLength = newText.size ();
361-
362- textComponent.sizeChanged |= newLength != textComponent.text .size ();
363- textComponent.hasGrown |= newLength > textComponent.text .size ();
368+ size_t oldLength = textComponent.text .size ();
364369
365370 textComponent.text = newText;
366371 ReplaceTextNewLines (textComponent.text );
367372
368- const ECS::Components::UI::TextTemplate& textTemplate = uiSingleton. textTemplates [textComponent. templateIndex ] ;
373+ const ECS::Components::UI::TextTemplate& textTemplate = registry-> get <ECS::Components::UI::TextTemplate>(entity) ;
369374
370375 Renderer::Font* font = Renderer::Font::GetFont (renderer, textTemplate.font );
371376
372377 if (textTemplate.setFlags .wrapWidth )
373378 {
374- textComponent.text = GenWrapText (textComponent.text , font, textTemplate.size , textTemplate.borderSize , textTemplate.wrapWidth );
379+ textComponent.text = GenWrapText (textComponent.rawText , font, textTemplate.size , textTemplate.borderSize , textTemplate.wrapWidth );
375380 }
376381
382+ textComponent.sizeChanged |= oldLength != textComponent.text .size ();
383+ textComponent.hasGrown |= oldLength < textComponent.text .size ();
384+
377385 vec2 textSize = font->CalculateTextSize (textComponent.text , textTemplate.size , textTemplate.borderSize );
378386 transform2DSystem.SetSize (entity, textSize);
379387
@@ -421,9 +429,15 @@ namespace ECS::Util
421429 auto & panel = registry->get <ECS::Components::UI::Panel>(entity);
422430 auto & panelTemplateComp = registry->get <ECS::Components::UI::PanelTemplate>(entity);
423431
424- auto & panelTemplate = uiSingleton.panelTemplates [panel.templateIndex ];
425-
426- panelTemplateComp = panelTemplate;
432+ if (panel.templateIndex == -1 )
433+ {
434+ panelTemplateComp = ECS::Components::UI::PanelTemplate ();
435+ }
436+ else
437+ {
438+ auto & panelTemplate = uiSingleton.panelTemplates [panel.templateIndex ];
439+ panelTemplateComp = panelTemplate;
440+ }
427441
428442 if (panelTemplateComp.setFlags .texCoords )
429443 {
@@ -622,6 +636,9 @@ namespace ECS::Util
622636 {
623637 char c = text[i];
624638
639+ if (!font->IsValidGlyph (c))
640+ continue ;
641+
625642 if (c == ' ' || c == ' \n ' )
626643 {
627644 size_t wordLength = i - wordStart;
0 commit comments