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 "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) {
this->visible = v;

View File

@ -26,7 +26,13 @@ public:
UiComponent() :uiPositioner(*this) {};
UiComponent(const LayoutStyle& layout) : uiPositioner(*this, layout) {};
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);
[[nodiscard]] bool isVisible() const;
void update(float delta);

View File

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

View File

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

View File

@ -28,7 +28,7 @@ public:
float marginLeft = (widgets.empty()) ? 0.0f : 10.0f;
auto widget = RessourceWidgetFactory::create(iconName, textureName, amount, font, marginLeft);
widgets.emplace(widgetID, widget.get());
addChild(std::move(widget));
addChild<UiRessourceWidget>(std::move(widget));
}
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,
LayoutStyle &iconStyle, LayoutStyle &textStyle) : UiComponent(containerStyle) {
auto icon = std::make_unique<UiImage>(iconTextureID, backgroundID, iconStyle);
auto text = std::make_unique<UiText>(font, std::to_string(amount), textStyle);
iconIndex = addChild(std::move(icon));
textIndex = addChild(std::move(text));
icon = addChild<UiImage>(std::make_unique<UiImage>(iconTextureID, backgroundID, iconStyle)); //NOLINT
text = addChild<UiText>(std::make_unique<UiText>(font, std::to_string(amount), textStyle)); //NOLINT
}
void UiRessourceWidget::setAmount(int newAmount) {
auto text = dynamic_cast<UiText*>(getChildAtIndex(textIndex));
if (text) text->setText(std::to_string(newAmount));
}

View File

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

View File

@ -30,7 +30,7 @@ public:
getLayoutStyle().alignItems = AlignItems::Center;
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;
costContainerStyle.width = SizeValue(1.f, SizeUnit::Percent);
@ -49,7 +49,7 @@ public:
else if (resourceTye == RessourceType::STONE) iconCostName = "stone_icon";
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;
private:
size_t iconImageID;
UiImage* iconImage;
};

View File

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

View File

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