Sdk/Widgets: Make the canvas aware of itself as a widget
This commit is contained in:
parent
c1dfc5c4b8
commit
36bcdcdb8c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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];
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue