Widgets: Add support for render layer (fixes rendering)

This commit is contained in:
Jérôme Leclercq
2021-12-01 18:58:48 +01:00
parent 653c9e0028
commit 8f897084d7
17 changed files with 135 additions and 16 deletions

View File

@@ -109,6 +109,7 @@ namespace Nz
void OnMouseButtonTriplePress(int x, int y, Mouse::Button button) override;
void OnMouseEnter() override;
void OnMouseMoved(int x, int y, int deltaX, int deltaY) override;
void OnRenderLayerUpdated(int baseRenderLayer) override;
void OnTextEntered(char32_t character, bool repeated) override;
virtual void PasteFromClipboard(const Vector2ui& targetPosition) = 0;

View File

@@ -114,6 +114,7 @@ namespace Nz
entt::entity CreateEntity();
void DestroyEntity(entt::entity entity);
inline int GetBaseRenderLayer() const;
inline entt::registry& GetRegistry();
inline const entt::registry& GetRegistry() const;
@@ -123,6 +124,7 @@ namespace Nz
virtual bool IsFocusable() const;
inline bool IsInside(float x, float y) const;
virtual void OnFocusLost();
virtual void OnFocusReceived();
virtual bool OnKeyPressed(const WindowEvent::KeyEvent& key);
@@ -135,11 +137,14 @@ namespace Nz
virtual void OnMouseButtonTriplePress(int x, int y, Mouse::Button button);
virtual void OnMouseWheelMoved(int x, int y, float delta);
virtual void OnMouseExit();
virtual void OnRenderLayerUpdated(int baseRenderLayer);
virtual void OnParentResized(const Vector2f& newSize);
virtual void OnTextEntered(char32_t character, bool repeated);
virtual void OnTextEdited(const std::array<char, 32>& characters, int length);
inline void SetBaseRenderLayer(int baseRenderLayer);
inline void SetPreferredSize(const Vector2f& preferredSize);
inline void SetRenderLayerCount(int renderLayerCount);
virtual void ShowChildren(bool show);
@@ -179,6 +184,8 @@ namespace Nz
Vector2f m_size;
BaseWidget* m_widgetParent;
bool m_visible;
int m_baseRenderLayer;
int m_renderLayerCount;
};
}

View File

@@ -23,12 +23,14 @@ namespace Nz
m_preferredSize(-1),
m_size(50.f, 50.f),
m_widgetParent(nullptr),
m_visible(true)
m_visible(true),
m_baseRenderLayer(0),
m_renderLayerCount(1)
{
}
template<typename T, typename... Args>
inline T* BaseWidget::Add(Args&&... args)
T* BaseWidget::Add(Args&&... args)
{
std::unique_ptr<T> widget = std::make_unique<T>(this, std::forward<Args>(args)...);
T* widgetPtr = widget.get();
@@ -39,8 +41,10 @@ namespace Nz
inline void BaseWidget::AddChild(std::unique_ptr<BaseWidget>&& widget)
{
widget->Show(m_visible);
widget->SetParent(this);
widget->SetBaseRenderLayer(m_baseRenderLayer + m_renderLayerCount);
widget->Show(widget->IsVisible() && m_visible);
m_children.emplace_back(std::move(widget));
}
@@ -264,11 +268,9 @@ namespace Nz
SetMinimumSize(minimumSize);
}
inline void BaseWidget::SetPreferredSize(const Vector2f& preferredSize)
inline int BaseWidget::GetBaseRenderLayer() const
{
m_preferredSize = preferredSize;
//Resize(m_preferredSize);
return m_baseRenderLayer + ((m_backgroundEntity.has_value()) ? 1 : 0);
}
inline entt::registry& BaseWidget::GetRegistry()
@@ -283,6 +285,38 @@ namespace Nz
return *m_registry;
}
inline void BaseWidget::SetBaseRenderLayer(int baseRenderLayer)
{
if (m_baseRenderLayer != baseRenderLayer)
{
m_baseRenderLayer = baseRenderLayer;
if (m_backgroundSprite)
m_backgroundSprite->UpdateRenderLayer(m_baseRenderLayer);
OnRenderLayerUpdated(GetBaseRenderLayer());
for (const auto& widgetPtr : m_children)
widgetPtr->SetBaseRenderLayer(m_baseRenderLayer + m_renderLayerCount);
}
}
inline void BaseWidget::SetPreferredSize(const Vector2f& preferredSize)
{
m_preferredSize = preferredSize;
//Resize(m_preferredSize);
}
inline void BaseWidget::SetRenderLayerCount(int renderLayerCount)
{
if (m_renderLayerCount != renderLayerCount)
{
m_renderLayerCount = renderLayerCount;
for (const auto& widgetPtr : m_children)
widgetPtr->SetBaseRenderLayer(m_baseRenderLayer + m_renderLayerCount);
}
}
inline bool BaseWidget::IsRegisteredToCanvas() const
{
return m_canvas && m_canvasIndex != InvalidCanvasIndex;

View File

@@ -41,6 +41,8 @@ namespace Nz
void OnMouseButtonRelease(int x, int y, Mouse::Button button) override;
void OnMouseExit() override;
void OnRenderLayerUpdated(int baseRenderLayer) override;
std::unique_ptr<ButtonWidgetStyle> m_style;
};
}

View File

@@ -20,7 +20,7 @@ namespace Nz
friend BaseWidget;
public:
Canvas(entt::registry& registry, EventHandler& eventHandler, CursorControllerHandle cursorController, UInt32 renderMask);
Canvas(entt::registry& registry, EventHandler& eventHandler, CursorControllerHandle cursorController, UInt32 renderMask, int initialRenderLayer = 0);
Canvas(const Canvas&) = delete;
Canvas(Canvas&&) = delete;
inline ~Canvas();

View File

@@ -48,6 +48,8 @@ namespace Nz
void OnMouseButtonRelease(int x, int y, Mouse::Button button) override;
void OnMouseExit() override;
void OnRenderLayerUpdated(int baseRenderLayer) override;
std::unique_ptr<CheckboxWidgetStyle> m_style;
CheckboxState m_state;
bool m_isTristateEnabled;

View File

@@ -33,6 +33,8 @@ namespace Nz
void OnMouseEnter() override;
void OnMouseExit() override;
void OnRenderLayerUpdated(int baseRenderLayer) override;
std::unique_ptr<LabelWidgetStyle> m_style;
};
}

View File

@@ -31,6 +31,7 @@ namespace Nz
void OnPress() override;
void OnRelease() override;
void UpdateRenderLayer(int baseRenderLayer) override;
void UpdateText(const AbstractTextDrawer& drawer) override;
SimpleButtonWidgetStyle& operator=(const SimpleButtonWidgetStyle&) = delete;
@@ -78,6 +79,8 @@ namespace Nz
void OnHoverEnd() override;
void OnNewState(CheckboxState newState) override;
void UpdateRenderLayer(int baseRenderLayer) override;
SimpleCheckboxWidgetStyle& operator=(const SimpleCheckboxWidgetStyle&) = delete;
SimpleCheckboxWidgetStyle& operator=(SimpleCheckboxWidgetStyle&&) = default;
@@ -119,6 +122,7 @@ namespace Nz
void OnHoverBegin() override;
void OnHoverEnd() override;
void UpdateRenderLayer(int baseRenderLayer) override;
void UpdateText(const AbstractTextDrawer& drawer) override;
SimpleLabelWidgetStyle& operator=(const SimpleLabelWidgetStyle&) = delete;

View File

@@ -44,7 +44,7 @@ namespace Nz
class NAZARA_WIDGETS_API BaseWidgetStyle
{
public:
inline BaseWidgetStyle(BaseWidget* widget);
inline BaseWidgetStyle(BaseWidget* widget, int renderLayerCount);
BaseWidgetStyle(const BaseWidgetStyle&) = delete;
BaseWidgetStyle(BaseWidgetStyle&&) = default;
virtual ~BaseWidgetStyle();
@@ -56,12 +56,16 @@ namespace Nz
inline entt::registry& GetRegistry();
inline const entt::registry& GetRegistry() const;
UInt32 GetRenderMask() const;
inline int GetRenderLayerCount() const;
virtual void UpdateRenderLayer(int baseRenderLayer) = 0;
BaseWidgetStyle& operator=(const BaseWidgetStyle&) = delete;
BaseWidgetStyle& operator=(BaseWidgetStyle&&) = default;
private:
BaseWidget* m_widgetOwner;
int m_renderLayerCount;
};
class NAZARA_WIDGETS_API ButtonWidgetStyle : public BaseWidgetStyle

View File

@@ -3,13 +3,16 @@
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Widgets/WidgetTheme.hpp>
#include <cassert>
#include <Nazara/Widgets/Debug.hpp>
namespace Nz
{
inline BaseWidgetStyle::BaseWidgetStyle(BaseWidget* widget) :
m_widgetOwner(widget)
inline BaseWidgetStyle::BaseWidgetStyle(BaseWidget* widget, int renderLayerCount) :
m_widgetOwner(widget),
m_renderLayerCount(renderLayerCount)
{
assert(m_renderLayerCount >= 0);
}
inline entt::entity BaseWidgetStyle::CreateEntity()
@@ -31,6 +34,11 @@ namespace Nz
{
return m_widgetOwner->GetRegistry();
}
inline int BaseWidgetStyle::GetRenderLayerCount() const
{
return m_renderLayerCount;
}
}
#include <Nazara/Widgets/DebugOff.hpp>