Cogs.Core
FontSelectorComponent.cpp
1#include "FontSelectorComponent.h"
2
3#include "Context.h"
4#include "Types.h"
5#include "EntityStore.h"
6
7#include "Components/Core/TextComponent.h"
8
9#include "Resources/FontManager.h"
10
11#include "Scene/SceneTraversal.h"
12
13using namespace Cogs::Reflection;
14
15void Cogs::Core::FontSelectorComponent::registerType()
16{
17 static constexpr EnumeratorDef enums [] = {
18 { "ApplyToChildren", FontSelectorFlags::ApplyToChildren },
19 { "SelfOnly", FontSelectorFlags::SelfOnly },
20 };
21
22 TypeDatabase::createType<FontSelectorFlags>().setEnumerators(enums);
23
24 Field fields [] = {
28 };
29
30 Method methods [] = {
31 Method(Name("initialize"), &FontSelectorComponent::initialize),
32 Method(Name("update"), &FontSelectorComponent::update),
33 };
34
35 DynamicComponent::registerDerivedType<FontSelectorComponent>().setFields(fields).setMethods(methods);
36}
37
38void Cogs::Core::FontSelectorComponent::initialize(Context * context)
39{
40 this->context = context;
41}
42
43void Cogs::Core::FontSelectorComponent::update()
44{
45 if (!hasChanged()) return;
46
47 // We just load a new font here. The font manager will take care of sharing font resources for us.
48 fontHandle = context->fontManager->loadFont(fontName, fontSize, NoResourceId);
49
50 switch (flags) {
51 case Cogs::Core::FontSelectorFlags::ApplyToChildren:
52 {
53 recurseFontSelection(this, getContainer());
54 applyRecursiveFieldChange(getContainer(), &TextComponent::fontHandle, fontHandle, [](const Entity* entity) {
55 const FontSelectorComponent* fontSelectorComponent = entity->getComponent<FontSelectorComponent>();
56 return fontSelectorComponent == nullptr || fontSelectorComponent->flags == FontSelectorFlags::ApplyToChildren;
57 });
58 }
59 break;
60
61 case Cogs::Core::FontSelectorFlags::SelfOnly:
62 {
63 auto textComponent = getComponent<TextComponent>();
64
65 if (textComponent) {
66 textComponent->fontHandle = fontHandle;
67 textComponent->setChanged();
68 }
69
70 break;
71 }
72 }
73}
74
75void Cogs::Core::FontSelectorComponent::recurseFontSelection(const FontSelectorComponent* source, const Entity* parent)
76{
77 const SceneComponent* sceneComponent = parent->getComponent<SceneComponent>();
78 if (sceneComponent) {
79 for (auto& child : sceneComponent->children) {
80 FontSelectorComponent* fontSelectorComponent = child->getComponent<FontSelectorComponent>();
81 if (fontSelectorComponent) {
82 if (fontSelectorComponent->fontName != source->fontName) {
83 fontSelectorComponent->fontName = source->fontName;
84 fontSelectorComponent->setChanged();
85 }
86 if (fontSelectorComponent->fontSize != source->fontSize) {
87 fontSelectorComponent->fontSize = source->fontSize;
88 fontSelectorComponent->setChanged();
89 }
90
91 if (fontSelectorComponent->flags == FontSelectorFlags::ApplyToChildren) {
92 recurseFontSelection(source, child.get());
93 }
94 }
95 }
96 }
97}
FontHandle fontHandle
Handle to the font resource to use when rendering text.
Field definition describing a single data member of a data structure.
Definition: Field.h:68
Simple method definition.
Definition: Method.h:72
void applyRecursiveFieldChange(ComponentModel::Entity *entity, MemberType ComponentType::*member, MemberType value, Recurse recurse)
Contains reflection support.
Definition: Component.h:11
Atomic< uint32_t > flags
Resource flags.
Definition: ResourceBase.h:395
Represents an unique name.
Definition: Name.h:70