diff --git a/ChangeLog.md b/ChangeLog.md index a34d932a9..5cc4c9924 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -271,6 +271,7 @@ Nazara Development Kit: - Added BaseWidget::OnMouseWheelMoved - Added Entity::OnEntity[Disabled|Enabled] signals - Added BaseWidget::SetParent +- BaseWidget::Show will no longer show entities disabled by the widget # 0.4: diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index 77f97bd1f..ec69cb813 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -26,8 +26,6 @@ namespace Ndk friend Canvas; public: - struct Padding; - BaseWidget(BaseWidget* parent); BaseWidget(const BaseWidget&) = delete; BaseWidget(BaseWidget&&) = delete; @@ -138,6 +136,10 @@ namespace Ndk struct WidgetEntity { EntityOwner handle; + bool isEnabled = true; + + NazaraSlot(Ndk::Entity, OnEntityDisabled, onDisabledSlot); + NazaraSlot(Ndk::Entity, OnEntityEnabled, onEnabledSlot); }; static constexpr std::size_t InvalidCanvasIndex = std::numeric_limits::max(); diff --git a/SDK/src/NDK/BaseWidget.cpp b/SDK/src/NDK/BaseWidget.cpp index 80978ffaf..ed3b8265c 100644 --- a/SDK/src/NDK/BaseWidget.cpp +++ b/SDK/src/NDK/BaseWidget.cpp @@ -178,14 +178,20 @@ namespace Ndk UnregisterFromCanvas(); for (WidgetEntity& entity : m_entities) - entity.handle->Enable(show); + { + if (entity.isEnabled) + { + entity.handle->Enable(show); //< This will override isEnabled + entity.isEnabled = true; + } + } for (const auto& widgetPtr : m_children) widgetPtr->Show(show); } } - const Ndk::EntityHandle& BaseWidget::CreateEntity() + const EntityHandle& BaseWidget::CreateEntity() { const EntityHandle& newEntity = m_world->CreateEntity(); newEntity->Enable(m_visible); @@ -193,6 +199,21 @@ namespace Ndk m_entities.emplace_back(); WidgetEntity& widgetEntity = m_entities.back(); widgetEntity.handle = newEntity; + widgetEntity.onDisabledSlot.Connect(newEntity->OnEntityDisabled, [this](Entity* entity) + { + auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); + NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); + + it->isEnabled = false; + }); + + widgetEntity.onEnabledSlot.Connect(newEntity->OnEntityEnabled, [this](Entity* entity) + { + auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; }); + NazaraAssert(it != m_entities.end(), "Entity does not belong to this widget"); + + it->isEnabled = true; + }); return newEntity; }