Widgets: Fix manually hidden entities being incorrectly shown when widget itself is shown
This commit is contained in:
parent
e145501568
commit
1b7a89213d
|
|
@ -226,8 +226,8 @@ namespace Nz
|
||||||
m_cursorPositionBegin = NormalizeCursorPosition(fromPosition);
|
m_cursorPositionBegin = NormalizeCursorPosition(fromPosition);
|
||||||
m_cursorPositionEnd = NormalizeCursorPosition(toPosition);
|
m_cursorPositionEnd = NormalizeCursorPosition(toPosition);
|
||||||
|
|
||||||
RefreshCursorColor();
|
|
||||||
RefreshCursorSize();
|
RefreshCursorSize();
|
||||||
|
RefreshCursorColor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -251,8 +251,8 @@ namespace Nz
|
||||||
m_cursorPositionBegin = cursorPosition;
|
m_cursorPositionBegin = cursorPosition;
|
||||||
m_cursorPositionEnd = m_cursorPositionBegin;
|
m_cursorPositionEnd = m_cursorPositionBegin;
|
||||||
|
|
||||||
RefreshCursorColor();
|
|
||||||
RefreshCursorSize();
|
RefreshCursorSize();
|
||||||
|
RefreshCursorColor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
#define NAZARA_WIDGETS_BASEWIDGET_HPP
|
#define NAZARA_WIDGETS_BASEWIDGET_HPP
|
||||||
|
|
||||||
#include <Nazara/Graphics/Sprite.hpp>
|
#include <Nazara/Graphics/Sprite.hpp>
|
||||||
|
#include <Nazara/Graphics/Components/GraphicsComponent.hpp>
|
||||||
#include <Nazara/Platform/Mouse.hpp>
|
#include <Nazara/Platform/Mouse.hpp>
|
||||||
#include <Nazara/Platform/WindowEvent.hpp>
|
#include <Nazara/Platform/WindowEvent.hpp>
|
||||||
#include <Nazara/Utility/Node.hpp>
|
#include <Nazara/Utility/Node.hpp>
|
||||||
|
|
@ -116,6 +117,7 @@ namespace Nz
|
||||||
virtual void Layout();
|
virtual void Layout();
|
||||||
|
|
||||||
entt::entity CreateEntity();
|
entt::entity CreateEntity();
|
||||||
|
entt::entity CreateGraphicsEntity(Node* parent = nullptr);
|
||||||
void DestroyEntity(entt::entity entity);
|
void DestroyEntity(entt::entity entity);
|
||||||
|
|
||||||
inline int GetBaseRenderLayer() const;
|
inline int GetBaseRenderLayer() const;
|
||||||
|
|
@ -173,6 +175,9 @@ namespace Nz
|
||||||
struct WidgetEntity
|
struct WidgetEntity
|
||||||
{
|
{
|
||||||
entt::entity handle;
|
entt::entity handle;
|
||||||
|
bool wasVisible;
|
||||||
|
|
||||||
|
NazaraSlot(GraphicsComponent, OnVisibilityUpdate, onVisibilityUpdate);
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr std::size_t InvalidCanvasIndex = std::numeric_limits<std::size_t>::max();
|
static constexpr std::size_t InvalidCanvasIndex = std::numeric_limits<std::size_t>::max();
|
||||||
|
|
@ -193,6 +198,7 @@ namespace Nz
|
||||||
Vector2f m_preferredSize;
|
Vector2f m_preferredSize;
|
||||||
Vector2f m_size;
|
Vector2f m_size;
|
||||||
BaseWidget* m_parentWidget;
|
BaseWidget* m_parentWidget;
|
||||||
|
bool m_disableVisibilitySignal;
|
||||||
bool m_visible;
|
bool m_visible;
|
||||||
int m_baseRenderLayer;
|
int m_baseRenderLayer;
|
||||||
int m_renderLayerCount;
|
int m_renderLayerCount;
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ namespace Nz
|
||||||
m_preferredSize(-1),
|
m_preferredSize(-1),
|
||||||
m_size(50.f, 50.f),
|
m_size(50.f, 50.f),
|
||||||
m_parentWidget(nullptr),
|
m_parentWidget(nullptr),
|
||||||
|
m_disableVisibilitySignal(false),
|
||||||
m_visible(true),
|
m_visible(true),
|
||||||
m_baseRenderLayer(0),
|
m_baseRenderLayer(0),
|
||||||
m_renderLayerCount(1)
|
m_renderLayerCount(1)
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ namespace Nz
|
||||||
virtual ~BaseWidgetStyle();
|
virtual ~BaseWidgetStyle();
|
||||||
|
|
||||||
inline entt::entity CreateEntity();
|
inline entt::entity CreateEntity();
|
||||||
entt::entity CreateGraphicsEntity();
|
inline entt::entity CreateGraphicsEntity(Node* parent = nullptr);
|
||||||
inline void DestroyEntity(entt::entity entity);
|
inline void DestroyEntity(entt::entity entity);
|
||||||
|
|
||||||
template<typename T> T* GetOwnerWidget() const;
|
template<typename T> T* GetOwnerWidget() const;
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,11 @@ namespace Nz
|
||||||
return m_widgetOwner->CreateEntity();
|
return m_widgetOwner->CreateEntity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline entt::entity BaseWidgetStyle::CreateGraphicsEntity(Node* parent)
|
||||||
|
{
|
||||||
|
return m_widgetOwner->CreateGraphicsEntity(parent);
|
||||||
|
}
|
||||||
|
|
||||||
inline void BaseWidgetStyle::DestroyEntity(entt::entity entity)
|
inline void BaseWidgetStyle::DestroyEntity(entt::entity entity)
|
||||||
{
|
{
|
||||||
m_widgetOwner->DestroyEntity(entity);
|
m_widgetOwner->DestroyEntity(entity);
|
||||||
|
|
|
||||||
|
|
@ -36,13 +36,12 @@ namespace Nz
|
||||||
|
|
||||||
auto& registry = GetRegistry();
|
auto& registry = GetRegistry();
|
||||||
|
|
||||||
m_textEntity = CreateEntity();
|
m_textEntity = CreateGraphicsEntity();
|
||||||
|
|
||||||
auto& gfxComponent = registry.emplace<GraphicsComponent>(m_textEntity, IsVisible());
|
auto& gfxComponent = registry.get<GraphicsComponent>(m_textEntity);
|
||||||
gfxComponent.AttachRenderable(m_textSprite, GetCanvas()->GetRenderMask());
|
gfxComponent.AttachRenderable(m_textSprite, GetCanvas()->GetRenderMask());
|
||||||
|
|
||||||
auto& textNode = GetRegistry().emplace<NodeComponent>(m_textEntity);
|
auto& textNode = registry.get<NodeComponent>(m_textEntity);
|
||||||
textNode.SetParent(this);
|
|
||||||
textNode.SetPosition(s_textAreaPaddingWidth, GetHeight() - s_textAreaPaddingHeight);
|
textNode.SetPosition(s_textAreaPaddingWidth, GetHeight() - s_textAreaPaddingHeight);
|
||||||
|
|
||||||
SetCursor(SystemCursor::Text);
|
SetCursor(SystemCursor::Text);
|
||||||
|
|
@ -59,8 +58,8 @@ namespace Nz
|
||||||
m_cursorPositionBegin = Vector2ui::Zero();
|
m_cursorPositionBegin = Vector2ui::Zero();
|
||||||
m_cursorPositionEnd = Vector2ui::Zero();
|
m_cursorPositionEnd = Vector2ui::Zero();
|
||||||
|
|
||||||
RefreshCursorColor();
|
|
||||||
RefreshCursorSize();
|
RefreshCursorSize();
|
||||||
|
RefreshCursorColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractTextAreaWidget::EnableLineWrap(bool enable)
|
void AbstractTextAreaWidget::EnableLineWrap(bool enable)
|
||||||
|
|
@ -598,23 +597,16 @@ namespace Nz
|
||||||
std::size_t oldSpriteCount = m_cursors.size();
|
std::size_t oldSpriteCount = m_cursors.size();
|
||||||
if (m_cursors.size() < selectionLineCount)
|
if (m_cursors.size() < selectionLineCount)
|
||||||
{
|
{
|
||||||
Color cursorColor = GetCursorColor();
|
|
||||||
Recti scissorBox = GetScissorBox();
|
|
||||||
bool isVisible = IsVisible() && HasFocus();
|
|
||||||
|
|
||||||
m_cursors.resize(selectionLineCount);
|
m_cursors.resize(selectionLineCount);
|
||||||
for (std::size_t i = oldSpriteCount; i < m_cursors.size(); ++i)
|
for (std::size_t i = oldSpriteCount; i < m_cursors.size(); ++i)
|
||||||
{
|
{
|
||||||
m_cursors[i].sprite = std::make_shared<Sprite>(Widgets::Instance()->GetTransparentMaterial());
|
m_cursors[i].sprite = std::make_shared<Sprite>(Widgets::Instance()->GetTransparentMaterial());
|
||||||
m_cursors[i].sprite->SetColor(cursorColor);
|
|
||||||
m_cursors[i].sprite->UpdateRenderLayer(GetBaseRenderLayer() + 1);
|
m_cursors[i].sprite->UpdateRenderLayer(GetBaseRenderLayer() + 1);
|
||||||
|
|
||||||
m_cursors[i].entity = CreateEntity();
|
m_cursors[i].entity = CreateGraphicsEntity(&textNode);
|
||||||
registry.emplace<NodeComponent>(m_cursors[i].entity).SetParent(textNode);
|
|
||||||
|
|
||||||
auto& cursorGfx = registry.emplace<GraphicsComponent>(m_cursors[i].entity, isVisible);
|
auto& cursorGfx = registry.get<GraphicsComponent>(m_cursors[i].entity);
|
||||||
cursorGfx.AttachRenderable(m_cursors[i].sprite, GetCanvas()->GetRenderMask());
|
cursorGfx.AttachRenderable(m_cursors[i].sprite, GetCanvas()->GetRenderMask());
|
||||||
cursorGfx.UpdateScissorBox(scissorBox);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_cursors.size() > selectionLineCount)
|
else if (m_cursors.size() > selectionLineCount)
|
||||||
|
|
|
||||||
|
|
@ -95,9 +95,8 @@ namespace Nz
|
||||||
m_backgroundSprite->UpdateRenderLayer(m_baseRenderLayer);
|
m_backgroundSprite->UpdateRenderLayer(m_baseRenderLayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
entt::entity backgroundEntity = CreateEntity();
|
entt::entity backgroundEntity = CreateGraphicsEntity();
|
||||||
m_registry->emplace<GraphicsComponent>(backgroundEntity).AttachRenderable(m_backgroundSprite, GetCanvas()->GetRenderMask());
|
m_registry->get<GraphicsComponent>(backgroundEntity).AttachRenderable(m_backgroundSprite, GetCanvas()->GetRenderMask());
|
||||||
m_registry->emplace<NodeComponent>(backgroundEntity).SetParent(this);
|
|
||||||
|
|
||||||
m_backgroundEntity = backgroundEntity;
|
m_backgroundEntity = backgroundEntity;
|
||||||
|
|
||||||
|
|
@ -204,13 +203,20 @@ namespace Nz
|
||||||
else
|
else
|
||||||
UnregisterFromCanvas();
|
UnregisterFromCanvas();
|
||||||
|
|
||||||
|
m_disableVisibilitySignal = true;
|
||||||
|
|
||||||
auto& registry = GetRegistry();
|
auto& registry = GetRegistry();
|
||||||
for (WidgetEntity& entity : m_entities)
|
for (WidgetEntity& widgetEntity : m_entities)
|
||||||
{
|
{
|
||||||
if (GraphicsComponent* gfx = registry.try_get<GraphicsComponent>(entity.handle))
|
if (GraphicsComponent* gfx = registry.try_get<GraphicsComponent>(widgetEntity.handle))
|
||||||
gfx->Show(show);
|
{
|
||||||
|
if ((show && widgetEntity.wasVisible) || !show)
|
||||||
|
gfx->Show(show);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_disableVisibilitySignal = false;
|
||||||
|
|
||||||
ShowChildren(show);
|
ShowChildren(show);
|
||||||
|
|
||||||
if (m_parentWidget)
|
if (m_parentWidget)
|
||||||
|
|
@ -225,10 +231,38 @@ namespace Nz
|
||||||
m_entities.emplace_back();
|
m_entities.emplace_back();
|
||||||
WidgetEntity& newWidgetEntity = m_entities.back();
|
WidgetEntity& newWidgetEntity = m_entities.back();
|
||||||
newWidgetEntity.handle = newEntity;
|
newWidgetEntity.handle = newEntity;
|
||||||
|
newWidgetEntity.wasVisible = true;
|
||||||
|
|
||||||
return newEntity;
|
return newEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entt::entity BaseWidget::CreateGraphicsEntity(Node* parent)
|
||||||
|
{
|
||||||
|
entt::entity entity = CreateEntity();
|
||||||
|
|
||||||
|
auto& gfxComponent = m_registry->emplace<GraphicsComponent>(entity, IsVisible());
|
||||||
|
gfxComponent.UpdateScissorBox(GetScissorBox());
|
||||||
|
|
||||||
|
m_registry->emplace<NodeComponent>(entity).SetParent((parent) ? parent : this);
|
||||||
|
|
||||||
|
WidgetEntity& newWidgetEntity = m_entities.back();
|
||||||
|
newWidgetEntity.onVisibilityUpdate.Connect(gfxComponent.OnVisibilityUpdate, [this, entity](GraphicsComponent* /*graphicsComponent*/, bool newVisibilityState)
|
||||||
|
{
|
||||||
|
if (m_disableVisibilitySignal)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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->wasVisible = newVisibilityState;
|
||||||
|
});
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
void BaseWidget::DestroyEntity(entt::entity entity)
|
void BaseWidget::DestroyEntity(entt::entity entity)
|
||||||
{
|
{
|
||||||
auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; });
|
auto it = std::find_if(m_entities.begin(), m_entities.end(), [&](const WidgetEntity& widgetEntity) { return widgetEntity.handle == entity; });
|
||||||
|
|
|
||||||
|
|
@ -18,13 +18,10 @@ namespace Nz
|
||||||
|
|
||||||
auto& registry = GetRegistry();
|
auto& registry = GetRegistry();
|
||||||
|
|
||||||
m_entity = CreateEntity();
|
m_entity = CreateGraphicsEntity();
|
||||||
|
|
||||||
auto& gfxComponent = registry.emplace<GraphicsComponent>(m_entity, IsVisible());
|
auto& gfxComponent = registry.get<GraphicsComponent>(m_entity);
|
||||||
gfxComponent.AttachRenderable(m_sprite, GetCanvas()->GetRenderMask());
|
gfxComponent.AttachRenderable(m_sprite, GetCanvas()->GetRenderMask());
|
||||||
|
|
||||||
auto& nodeComponent = registry.emplace<NodeComponent>(m_entity);
|
|
||||||
nodeComponent.SetParent(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImageWidget::Layout()
|
void ImageWidget::Layout()
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,7 @@
|
||||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
#include <Nazara/Widgets/LabelWidget.hpp>
|
#include <Nazara/Widgets/LabelWidget.hpp>
|
||||||
#include <Nazara/Graphics/Components/GraphicsComponent.hpp>
|
|
||||||
#include <Nazara/Utility/AbstractTextDrawer.hpp>
|
#include <Nazara/Utility/AbstractTextDrawer.hpp>
|
||||||
#include <Nazara/Utility/Components/NodeComponent.hpp>
|
|
||||||
#include <Nazara/Widgets/Canvas.hpp>
|
|
||||||
#include <Nazara/Widgets/Widgets.hpp>
|
|
||||||
#include <Nazara/Widgets/Debug.hpp>
|
#include <Nazara/Widgets/Debug.hpp>
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,6 @@
|
||||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
#include <Nazara/Widgets/WidgetTheme.hpp>
|
#include <Nazara/Widgets/WidgetTheme.hpp>
|
||||||
#include <Nazara/Graphics/Components/GraphicsComponent.hpp>
|
|
||||||
#include <Nazara/Utility/Components/NodeComponent.hpp>
|
|
||||||
#include <Nazara/Widgets/Canvas.hpp>
|
#include <Nazara/Widgets/Canvas.hpp>
|
||||||
#include <Nazara/Widgets/Debug.hpp>
|
#include <Nazara/Widgets/Debug.hpp>
|
||||||
|
|
||||||
|
|
@ -14,17 +12,6 @@ namespace Nz
|
||||||
|
|
||||||
BaseWidgetStyle::~BaseWidgetStyle() = default;
|
BaseWidgetStyle::~BaseWidgetStyle() = default;
|
||||||
|
|
||||||
entt::entity BaseWidgetStyle::CreateGraphicsEntity()
|
|
||||||
{
|
|
||||||
auto& registry = GetRegistry();
|
|
||||||
|
|
||||||
entt::entity entity = CreateEntity();
|
|
||||||
registry.emplace<GraphicsComponent>(entity, m_widgetOwner->IsVisible());
|
|
||||||
registry.emplace<NodeComponent>(entity).SetParent(m_widgetOwner);
|
|
||||||
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt32 BaseWidgetStyle::GetRenderMask() const
|
UInt32 BaseWidgetStyle::GetRenderMask() const
|
||||||
{
|
{
|
||||||
return m_widgetOwner->GetCanvas()->GetRenderMask();
|
return m_widgetOwner->GetCanvas()->GetRenderMask();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue