Sdk/Widgets: Make the canvas aware of itself as a widget

This commit is contained in:
Lynix 2017-01-18 23:35:43 +01:00
parent c1dfc5c4b8
commit 36bcdcdb8c
5 changed files with 35 additions and 14 deletions

View File

@ -95,8 +95,10 @@ namespace Ndk
inline void DestroyChild(BaseWidget* widget); inline void DestroyChild(BaseWidget* widget);
void DestroyChildren(); void DestroyChildren();
void RegisterToCanvas();
inline void NotifyParentResized(const Nz::Vector2f& newSize); inline void NotifyParentResized(const Nz::Vector2f& newSize);
inline void UpdateCanvasIndex(std::size_t index); inline void UpdateCanvasIndex(std::size_t index);
void UnregisterFromCanvas();
std::size_t m_canvasIndex; std::size_t m_canvasIndex;
std::vector<EntityOwner> m_entities; std::vector<EntityOwner> m_entities;

View File

@ -33,8 +33,6 @@ namespace Ndk
Canvas& operator=(Canvas&&) = delete; Canvas& operator=(Canvas&&) = delete;
protected: protected:
void Layout() override;
void NotifyWidgetUpdate(std::size_t index); void NotifyWidgetUpdate(std::size_t index);
std::size_t RegisterWidget(BaseWidget* widget); std::size_t RegisterWidget(BaseWidget* widget);

View File

@ -12,6 +12,10 @@ namespace Ndk
m_world(std::move(world)) m_world(std::move(world))
{ {
m_canvas = this; m_canvas = this;
m_widgetParent = nullptr;
// Widgetception
m_canvasIndex = m_canvas->RegisterWidget(this);
m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, this, &Canvas::OnKeyPressed); m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, this, &Canvas::OnKeyPressed);
m_keyReleasedSlot.Connect(eventHandler.OnKeyReleased, this, &Canvas::OnKeyReleased); m_keyReleasedSlot.Connect(eventHandler.OnKeyReleased, this, &Canvas::OnKeyReleased);
@ -20,12 +24,17 @@ namespace Ndk
m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, this, &Canvas::OnMouseMoved); m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, this, &Canvas::OnMouseMoved);
m_mouseLeftSlot.Connect(eventHandler.OnMouseLeft, this, &Canvas::OnMouseLeft); m_mouseLeftSlot.Connect(eventHandler.OnMouseLeft, this, &Canvas::OnMouseLeft);
m_textEnteredSlot.Connect(eventHandler.OnTextEntered, this, &Canvas::OnTextEntered); m_textEnteredSlot.Connect(eventHandler.OnTextEntered, this, &Canvas::OnTextEntered);
SetPadding(0.f, 0.f, 0.f, 0.f);
} }
inline Canvas::~Canvas() inline Canvas::~Canvas()
{ {
// Destroy children explicitly because they signal us when getting destroyed, and that can't happend after our own destruction // Destroy children explicitly because they signal us when getting destroyed, and that can't happen after our own destruction
DestroyChildren(); DestroyChildren();
// Prevent our parent from trying to call us
m_canvasIndex = std::numeric_limits<std::size_t>::max();
} }
inline const WorldHandle& Canvas::GetWorld() const inline const WorldHandle& Canvas::GetWorld() const

View File

@ -21,13 +21,12 @@ namespace Ndk
m_widgetParent = parent; m_widgetParent = parent;
m_world = m_canvas->GetWorld(); m_world = m_canvas->GetWorld();
m_canvasIndex = m_canvas->RegisterWidget(this); RegisterToCanvas();
} }
BaseWidget::~BaseWidget() BaseWidget::~BaseWidget()
{ {
if (m_canvasIndex != std::numeric_limits<std::size_t>::max()) UnregisterFromCanvas();
m_canvas->UnregisterWidget(m_canvasIndex);
} }
void BaseWidget::Destroy() void BaseWidget::Destroy()
@ -88,6 +87,11 @@ namespace Ndk
{ {
m_visible = show; m_visible = show;
if (m_visible)
RegisterToCanvas();
else
UnregisterFromCanvas();
for (const EntityHandle& entity : m_entities) for (const EntityHandle& entity : m_entities)
entity->Enable(show); entity->Enable(show);
@ -182,4 +186,20 @@ namespace Ndk
{ {
m_children.clear(); m_children.clear();
} }
void BaseWidget::RegisterToCanvas()
{
NazaraAssert(m_canvasIndex == std::numeric_limits<std::size_t>::max(), "Widget is already registered to canvas");
m_canvasIndex = m_canvas->RegisterWidget(this);
}
void BaseWidget::UnregisterFromCanvas()
{
if (m_canvasIndex != std::numeric_limits<std::size_t>::max())
{
m_canvas->UnregisterWidget(m_canvasIndex);
m_canvasIndex = std::numeric_limits<std::size_t>::max();
}
}
} }

View File

@ -14,14 +14,6 @@ namespace Ndk
{ {
} }
void Canvas::Layout()
{
if (m_backgroundEntity)
{
m_backgroundSprite->SetSize(m_contentSize.x + m_padding.left + m_padding.right, m_contentSize.y + m_padding.top + m_padding.bottom);
}
}
void Canvas::NotifyWidgetUpdate(std::size_t index) void Canvas::NotifyWidgetUpdate(std::size_t index)
{ {
WidgetBox& entry = m_widgetBoxes[index]; WidgetBox& entry = m_widgetBoxes[index];