@@ -134,43 +134,47 @@ namespace ECS::Util
134
134
auto & panelComp = registry->emplace <ECS::Components::UI::Panel>(entity);
135
135
panelComp.layer = layer;
136
136
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
-
143
137
// Set this texts specific template data
144
138
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
+ }
146
150
147
151
// Event Input Info
148
152
auto & eventInputInfo = registry->emplace <ECS::Components::UI::EventInputInfo>(entity);
149
153
150
- if (!panelTemplate .onClickTemplate .empty ())
154
+ if (!panelTemplateComp .onClickTemplate .empty ())
151
155
{
152
- SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplate .onClickTemplate , eventInputInfo.onClickTemplateHash );
156
+ SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplateComp .onClickTemplate , eventInputInfo.onClickTemplateHash );
153
157
}
154
- if (!panelTemplate .onHoverTemplate .empty ())
158
+ if (!panelTemplateComp .onHoverTemplate .empty ())
155
159
{
156
- SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplate .onHoverTemplate , eventInputInfo.onHoverTemplateHash );
160
+ SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplateComp .onHoverTemplate , eventInputInfo.onHoverTemplateHash );
157
161
}
158
- if (!panelTemplate .onUninteractableTemplate .empty ())
162
+ if (!panelTemplateComp .onUninteractableTemplate .empty ())
159
163
{
160
- SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplate .onUninteractableTemplate , eventInputInfo.onUninteractableTemplateHash );
164
+ SetTemplateEventHash (uiSingleton.templateHashToPanelTemplateIndex , templateName, panelTemplateComp .onUninteractableTemplate , eventInputInfo.onUninteractableTemplateHash );
161
165
}
162
166
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 ;
166
170
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 ;
170
174
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 ;
174
178
175
179
return entity;
176
180
}
@@ -207,9 +211,10 @@ namespace ECS::Util
207
211
208
212
// Text
209
213
auto & textComp = registry->emplace <ECS::Components::UI::Text>(entity);
210
- textComp.text = text;
214
+ textComp.rawText = text;
211
215
textComp.layer = layer;
212
- ReplaceTextNewLines (textComp.text );
216
+ ReplaceTextNewLines (textComp.rawText );
217
+ textComp.text = textComp.rawText ;
213
218
214
219
u32 templateNameHash = StringUtils::fnv1a_32 (templateName, strlen (templateName));
215
220
u32 templateIndex = uiSingleton.templateHashToTextTemplateIndex [templateNameHash];
@@ -221,7 +226,7 @@ namespace ECS::Util
221
226
222
227
if (textTemplate.setFlags .wrapWidth )
223
228
{
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 );
225
230
}
226
231
227
232
vec2 textSize = font->CalculateTextSize (textComp.text .c_str (), textTemplate.size , textTemplate.borderSize );
@@ -267,11 +272,14 @@ namespace ECS::Util
267
272
entt::entity entity = registry->create ();
268
273
269
274
// Transform
275
+ auto & parentTransformComp = registry->get <ECS::Components::Transform2D>(parent);
276
+ const vec2& parentSize = parentTransformComp.GetSize ();
270
277
auto & transformComp = registry->emplace <ECS::Components::Transform2D>(entity);
271
278
272
279
transform2DSystem.ParentEntityTo (parent, entity);
273
280
transform2DSystem.SetLayer (entity, layer);
274
281
transform2DSystem.SetLocalPosition (entity, pos);
282
+ transform2DSystem.SetSize (entity, parentSize);
275
283
276
284
// Widget
277
285
auto & widgetComp = registry->emplace <ECS::Components::UI::Widget>(entity);
@@ -357,23 +365,23 @@ namespace ECS::Util
357
365
358
366
ECS::Components::UI::Text& textComponent = registry->get <ECS::Components::UI::Text>(entity);
359
367
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 ();
364
369
365
370
textComponent.text = newText;
366
371
ReplaceTextNewLines (textComponent.text );
367
372
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) ;
369
374
370
375
Renderer::Font* font = Renderer::Font::GetFont (renderer, textTemplate.font );
371
376
372
377
if (textTemplate.setFlags .wrapWidth )
373
378
{
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 );
375
380
}
376
381
382
+ textComponent.sizeChanged |= oldLength != textComponent.text .size ();
383
+ textComponent.hasGrown |= oldLength < textComponent.text .size ();
384
+
377
385
vec2 textSize = font->CalculateTextSize (textComponent.text , textTemplate.size , textTemplate.borderSize );
378
386
transform2DSystem.SetSize (entity, textSize);
379
387
@@ -421,9 +429,15 @@ namespace ECS::Util
421
429
auto & panel = registry->get <ECS::Components::UI::Panel>(entity);
422
430
auto & panelTemplateComp = registry->get <ECS::Components::UI::PanelTemplate>(entity);
423
431
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
+ }
427
441
428
442
if (panelTemplateComp.setFlags .texCoords )
429
443
{
@@ -622,6 +636,9 @@ namespace ECS::Util
622
636
{
623
637
char c = text[i];
624
638
639
+ if (!font->IsValidGlyph (c))
640
+ continue ;
641
+
625
642
if (c == ' ' || c == ' \n ' )
626
643
{
627
644
size_t wordLength = i - wordStart;
0 commit comments