UPD: addChild() gibt typisierte Pointer zurück, keinen Index, closes #6

This commit is contained in:
sebastian 2026-04-17 08:34:25 +02:00
parent 203cf42c26
commit 697430cfd6
10 changed files with 30 additions and 38 deletions

View File

@ -8,11 +8,6 @@
#include "../../../platform/glfw/InputManager.h" #include "../../../platform/glfw/InputManager.h"
#include "GLFW/glfw3.h" #include "GLFW/glfw3.h"
size_t UiComponent::addChild(std::unique_ptr<UiComponent> child) {
child->parent = this;
children.emplace_back(std::move(child));
return children.size() - 1;
}
void UiComponent::setVisible(const bool v) { void UiComponent::setVisible(const bool v) {
this->visible = v; this->visible = v;

View File

@ -26,7 +26,13 @@ public:
UiComponent() :uiPositioner(*this) {}; UiComponent() :uiPositioner(*this) {};
UiComponent(const LayoutStyle& layout) : uiPositioner(*this, layout) {}; UiComponent(const LayoutStyle& layout) : uiPositioner(*this, layout) {};
virtual ~UiComponent() = default; virtual ~UiComponent() = default;
size_t addChild(std::unique_ptr<UiComponent> child); template<typename T>
T* addChild(std::unique_ptr<UiComponent> child) {
T* ptr = static_cast<T*>(child.get());
child->parent = this;
children.push_back(std::move(child));
return ptr; // NOLINT
}
void setVisible(bool visible); void setVisible(bool visible);
[[nodiscard]] bool isVisible() const; [[nodiscard]] bool isVisible() const;
void update(float delta); void update(float delta);

View File

@ -72,8 +72,8 @@ void UILayer::onAttach() {
uiContainer->getLayoutStyle().alignItems = AlignItems::Center; uiContainer->getLayoutStyle().alignItems = AlignItems::Center;
uiContainer->getLayoutStyle().justifyContent = JustifyContent::Center; uiContainer->getLayoutStyle().justifyContent = JustifyContent::Center;
inventoryContainerID = uiContainer->addChild(std::move(inventoryContainer)); this->inventoryContainer = uiContainer->addChild<UiInventoryContainer>(std::move(inventoryContainer)); // NOLINT
rootContainer->addChild(std::move(uiContainer)); rootContainer->addChild<UiContainer>(std::move(uiContainer));
LayoutStyle turnStyle; LayoutStyle turnStyle;
turnStyle.width = SizeValue(200.f, SizeUnit::Pixels); turnStyle.width = SizeValue(200.f, SizeUnit::Pixels);
@ -82,13 +82,10 @@ void UILayer::onAttach() {
turnStyle.margin.top = {10.f, SizeUnit::Pixels}; turnStyle.margin.top = {10.f, SizeUnit::Pixels};
auto turnLabel = std::make_unique<UiText>(*mediumFont, "Runde: 1", turnStyle, glm::vec3(1,1,1)); auto turnLabel = std::make_unique<UiText>(*mediumFont, "Runde: 1", turnStyle, glm::vec3(1,1,1));
turnTextID = rootContainer->addChild(std::move(turnLabel)); turnText = rootContainer->addChild<UiText>(std::move(turnLabel)); // NOLINT
EventBus::getInstance().subscribe<TurnChangedEvent>([this](const TurnChangedEvent& event) { EventBus::getInstance().subscribe<TurnChangedEvent>([this](const TurnChangedEvent& event) {
auto turnTextLabel = dynamic_cast<UiText*>(rootContainer->getChildAtIndex(turnTextID)); turnText->setText("Runde: " + std::to_string(event.newTurn));
if (turnTextLabel) {
turnTextLabel->setText("Runde: " + std::to_string(event.newTurn));
};
}); });
auto minimapStyle = LayoutStyle(); auto minimapStyle = LayoutStyle();
@ -99,7 +96,7 @@ void UILayer::onAttach() {
GLuint minimapTextureID = RenderTargets::instance().getMinimapTexture(); GLuint minimapTextureID = RenderTargets::instance().getMinimapTexture();
GLuint backgroundTextureID = AssetManager::getTexture("background")->getTextureID(); GLuint backgroundTextureID = AssetManager::getTexture("background")->getTextureID();
auto minimap = std::make_unique<UiImage>(minimapTextureID, backgroundTextureID, minimapStyle); auto minimap = std::make_unique<UiImage>(minimapTextureID, backgroundTextureID, minimapStyle);
rootContainer->addChild(std::move(minimap)); rootContainer->addChild<UiImage>(std::move(minimap));
LayoutStyle style; LayoutStyle style;
style.width = SizeValue(200, SizeUnit::Pixels); style.width = SizeValue(200, SizeUnit::Pixels);
@ -113,7 +110,7 @@ void UILayer::onAttach() {
std::cout << "Button clicked!" << std::endl; std::cout << "Button clicked!" << std::endl;
} }
}); });
rootContainer->addChild(std::move(uiButton)); rootContainer->addChild<UiButton>(std::move(uiButton));
auto buildingMenuContainer = std::make_unique<UiBuildingMenuContainer>(*smallFont); auto buildingMenuContainer = std::make_unique<UiBuildingMenuContainer>(*smallFont);
buildingMenuContainer->addBuildingMenuBtnCallback([](UiBuildingMenuButtonClickEvent e) { buildingMenuContainer->addBuildingMenuBtnCallback([](UiBuildingMenuButtonClickEvent e) {
@ -128,11 +125,11 @@ void UILayer::onAttach() {
buildingMenuContainerContainer->getLayoutStyle().flexDirection = FlexDirection::Row; buildingMenuContainerContainer->getLayoutStyle().flexDirection = FlexDirection::Row;
buildingMenuContainerContainer->getLayoutStyle().alignItems = AlignItems::Center; buildingMenuContainerContainer->getLayoutStyle().alignItems = AlignItems::Center;
buildingMenuContainerContainer->getLayoutStyle().justifyContent = JustifyContent::Center; buildingMenuContainerContainer->getLayoutStyle().justifyContent = JustifyContent::Center;
buildingMenuContainerContainer->addChild(std::move(buildingMenuContainer)); buildingMenuContainerContainer->addChild<UiBuildingMenuContainer>(std::move(buildingMenuContainer));
rootContainer->addChild(std::move(buildingMenuContainerContainer)); rootContainer->addChild<UiContainer>(std::move(buildingMenuContainerContainer));
Application::getInstance().stateManager->registerMouseUser(uiInputUser.get(), {StateRegistry::get().uiState}); Application::getInstance().stateManager->registerMouseUser(uiInputUser.get(), {StateRegistry::get().uiState});
} }
@ -141,7 +138,6 @@ void UILayer::onUpdate() {
Layer::onUpdate(); Layer::onUpdate();
//Update inventory texts //Update inventory texts
PlayerInventory playerInventory = gameMode->getPlayerInventory(gameMode->getCurrentPlayer()); PlayerInventory playerInventory = gameMode->getPlayerInventory(gameMode->getCurrentPlayer());
auto inventoryContainer = dynamic_cast<UiInventoryContainer*>(rootContainer->getChildAtIndex(inventoryContainerID));
if (inventoryContainer) { if (inventoryContainer) {
inventoryContainer->updateRessource(RessourceType::WOOD, playerInventory.getAmount(RessourceType::WOOD)); inventoryContainer->updateRessource(RessourceType::WOOD, playerInventory.getAmount(RessourceType::WOOD));
inventoryContainer->updateRessource(RessourceType::STONE, playerInventory.getAmount(RessourceType::STONE)); inventoryContainer->updateRessource(RessourceType::STONE, playerInventory.getAmount(RessourceType::STONE));

View File

@ -27,8 +27,8 @@ private:
std::unique_ptr<UiContainer> rootContainer; std::unique_ptr<UiContainer> rootContainer;
std::unique_ptr<UiInputUser> uiInputUser; std::unique_ptr<UiInputUser> uiInputUser;
size_t inventoryContainerID; UiInventoryContainer* inventoryContainer;
size_t turnTextID; UiText* turnText;
public: public:

View File

@ -28,7 +28,7 @@ public:
float marginLeft = (widgets.empty()) ? 0.0f : 10.0f; float marginLeft = (widgets.empty()) ? 0.0f : 10.0f;
auto widget = RessourceWidgetFactory::create(iconName, textureName, amount, font, marginLeft); auto widget = RessourceWidgetFactory::create(iconName, textureName, amount, font, marginLeft);
widgets.emplace(widgetID, widget.get()); widgets.emplace(widgetID, widget.get());
addChild(std::move(widget)); addChild<UiRessourceWidget>(std::move(widget));
} }
void updateRessource(RessourceType type, int newAmount) { void updateRessource(RessourceType type, int newAmount) {

View File

@ -9,14 +9,10 @@
UiRessourceWidget::UiRessourceWidget(GLuint iconTextureID, GLuint backgroundID, int amount, Font &font, const LayoutStyle &containerStyle, UiRessourceWidget::UiRessourceWidget(GLuint iconTextureID, GLuint backgroundID, int amount, Font &font, const LayoutStyle &containerStyle,
LayoutStyle &iconStyle, LayoutStyle &textStyle) : UiComponent(containerStyle) { LayoutStyle &iconStyle, LayoutStyle &textStyle) : UiComponent(containerStyle) {
auto icon = std::make_unique<UiImage>(iconTextureID, backgroundID, iconStyle); icon = addChild<UiImage>(std::make_unique<UiImage>(iconTextureID, backgroundID, iconStyle)); //NOLINT
auto text = std::make_unique<UiText>(font, std::to_string(amount), textStyle); text = addChild<UiText>(std::make_unique<UiText>(font, std::to_string(amount), textStyle)); //NOLINT
iconIndex = addChild(std::move(icon));
textIndex = addChild(std::move(text));
} }
void UiRessourceWidget::setAmount(int newAmount) { void UiRessourceWidget::setAmount(int newAmount) {
auto text = dynamic_cast<UiText*>(getChildAtIndex(textIndex));
if (text) text->setText(std::to_string(newAmount)); if (text) text->setText(std::to_string(newAmount));
} }

View File

@ -19,8 +19,8 @@ public:
void setAmount(int newAmount); void setAmount(int newAmount);
private: private:
size_t iconIndex; UiImage* icon;
size_t textIndex; UiText* text;
}; };

View File

@ -30,7 +30,7 @@ public:
getLayoutStyle().alignItems = AlignItems::Center; getLayoutStyle().alignItems = AlignItems::Center;
auto icon = std::make_unique<UiImage>(AssetManager::getTexture(iconName)->getTextureID(), iconStyle); auto icon = std::make_unique<UiImage>(AssetManager::getTexture(iconName)->getTextureID(), iconStyle);
iconImageID = addChild(std::move(icon)); iconImage = addChild<UiImage>(std::move(icon)); // NOLINT
LayoutStyle costContainerStyle; LayoutStyle costContainerStyle;
costContainerStyle.width = SizeValue(1.f, SizeUnit::Percent); costContainerStyle.width = SizeValue(1.f, SizeUnit::Percent);
@ -49,7 +49,7 @@ public:
else if (resourceTye == RessourceType::STONE) iconCostName = "stone_icon"; else if (resourceTye == RessourceType::STONE) iconCostName = "stone_icon";
auto costContainer = std::make_unique<UiBuildingMenuCostContainer>(iconCostName, costs, costContainerStyle, font); auto costContainer = std::make_unique<UiBuildingMenuCostContainer>(iconCostName, costs, costContainerStyle, font);
addChild(std::move(costContainer)); addChild<UiBuildingMenuCostContainer>(std::move(costContainer));
} }
@ -63,7 +63,7 @@ protected:
void onCollectRenderData(UiRenderBundle &uiRenderBundle) override; void onCollectRenderData(UiRenderBundle &uiRenderBundle) override;
private: private:
size_t iconImageID; UiImage* iconImage;
}; };

View File

@ -25,7 +25,7 @@ UiBuildingMenuContainer::UiBuildingMenuContainer(Font& font) {
UiBuildingMenuButtonClickEvent event = UiBuildingMenuButtonClickEvent(BuildingType::FOREST_HUT, e); UiBuildingMenuButtonClickEvent event = UiBuildingMenuButtonClickEvent(BuildingType::FOREST_HUT, e);
onBuildingMenuBtnClick(event); onBuildingMenuBtnClick(event);
}); });
addChild(std::move(forest_icon)); addChild<UiBuildingMenuButton>(std::move(forest_icon));
LayoutStyle buttonStyle2; LayoutStyle buttonStyle2;
@ -34,7 +34,7 @@ UiBuildingMenuContainer::UiBuildingMenuContainer(Font& font) {
UiBuildingMenuButtonClickEvent event = UiBuildingMenuButtonClickEvent(BuildingType::STONE_MASON, e); UiBuildingMenuButtonClickEvent event = UiBuildingMenuButtonClickEvent(BuildingType::STONE_MASON, e);
onBuildingMenuBtnClick(event); onBuildingMenuBtnClick(event);
}); });
addChild(std::move(stone_icon)); addChild<UiBuildingMenuButton>(std::move(stone_icon));
} }
void UiBuildingMenuContainer::addBuildingMenuBtnCallback(BuildingMenuBtnClickCallback callback) { void UiBuildingMenuContainer::addBuildingMenuBtnCallback(BuildingMenuBtnClickCallback callback) {

View File

@ -20,15 +20,14 @@ class UiBuildingMenuCostContainer: public UiComponent {
getLayoutStyle().flexDirection = FlexDirection::Row; getLayoutStyle().flexDirection = FlexDirection::Row;
getLayoutStyle().justifyContent = JustifyContent::SpaceBetween; getLayoutStyle().justifyContent = JustifyContent::SpaceBetween;
auto iconImage = std::make_unique<UiImage>(AssetManager::getTexture(resourceIconName)->getTextureID(), iconStyle); addChild<UiImage>(std::make_unique<UiImage>(AssetManager::getTexture(resourceIconName)->getTextureID(), iconStyle));
addChild(std::move(iconImage));
LayoutStyle textStyle; LayoutStyle textStyle;
textStyle.width = SizeValue(123, SizeUnit::Pixels); textStyle.width = SizeValue(123, SizeUnit::Pixels);
textStyle.height = SizeValue(30, SizeUnit::Pixels); textStyle.height = SizeValue(30, SizeUnit::Pixels);
auto costText = std::make_unique<UiText>(font, std::to_string(buildingCost), textStyle, glm::vec3(0.f)); addChild<UiText>(std::make_unique<UiText>(font, std::to_string(buildingCost), textStyle, glm::vec3(0.f)));
addChild(std::move(costText));
} }
}; };