This commit is contained in:
SirLynix
2022-07-16 14:11:03 +02:00
committed by Jérôme Leclercq
parent 481702c109
commit 05c78da22a
58 changed files with 2306 additions and 41 deletions

View File

@@ -8,7 +8,10 @@
#include <Nazara/Widgets/ButtonWidget.hpp>
#include <Nazara/Widgets/Canvas.hpp>
#include <Nazara/Widgets/CheckboxWidget.hpp>
#include <Nazara/Widgets/ImageButtonWidget.hpp>
#include <Nazara/Widgets/LabelWidget.hpp>
#include <Nazara/Widgets/ScrollbarButtonWidget.hpp>
#include <Nazara/Widgets/ScrollbarWidget.hpp>
#include <Nazara/Widgets/Widgets.hpp>
#include <Nazara/Widgets/Debug.hpp>
@@ -56,26 +59,26 @@ namespace Nz
void SimpleButtonWidgetStyle::OnHoverBegin()
{
UpdateMaterial(true, m_isPressed);
m_isHovered = true;
UpdateMaterial(m_isHovered, m_isPressed);
}
void SimpleButtonWidgetStyle::OnHoverEnd()
{
UpdateMaterial(false, m_isPressed);
m_isHovered = false;
UpdateMaterial(m_isHovered, m_isPressed);
}
void SimpleButtonWidgetStyle::OnPress()
{
UpdateMaterial(m_isHovered, true);
m_isPressed = true;
UpdateMaterial(m_isHovered, m_isPressed);
}
void SimpleButtonWidgetStyle::OnRelease()
{
UpdateMaterial(m_isHovered, false);
m_isPressed = false;
UpdateMaterial(m_isHovered, m_isPressed);
}
void SimpleButtonWidgetStyle::UpdateRenderLayer(int baseRenderLayer)
@@ -194,6 +197,140 @@ namespace Nz
}
SimpleImageButtonWidgetStyle::SimpleImageButtonWidgetStyle(ImageButtonWidget* imageButtonWidget, StyleConfig config) :
ImageButtonWidgetStyle(imageButtonWidget, 1),
m_isHovered(false),
m_isPressed(false)
{
auto& registry = GetRegistry();
UInt32 renderMask = GetRenderMask();
SlicedSprite::Corner hoveredCorner;
hoveredCorner.size = Vector2f(config.hoveredCornerSize, config.hoveredCornerSize);
hoveredCorner.textureCoords = Vector2f(config.hoveredCornerTexCoords, config.hoveredCornerTexCoords);
m_hoveredSprite = std::make_shared<SlicedSprite>(config.hoveredMaterial);
m_hoveredSprite->SetCorners(hoveredCorner, hoveredCorner);
float imageCornerSize = imageButtonWidget->GetCornerSize();
float imageCornerTexCoords = imageButtonWidget->GetCornerTexCoords();
SlicedSprite::Corner corner;
corner.size = Vector2f(imageCornerSize, imageCornerSize);
corner.textureCoords = Vector2f(imageCornerTexCoords, imageCornerTexCoords);
m_sprite = std::make_shared<SlicedSprite>(imageButtonWidget->GetMaterial());
m_sprite->SetCorners(corner, corner);
m_sprite->SetTextureCoords(imageButtonWidget->GetTextureCoords());
m_entity = CreateGraphicsEntity();
GraphicsComponent& gfxComponent = registry.get<GraphicsComponent>(m_entity);
gfxComponent.AttachRenderable(m_sprite, renderMask);
}
void SimpleImageButtonWidgetStyle::Layout(const Vector2f& size)
{
m_hoveredSprite->SetSize(size);
m_sprite->SetSize(size);
}
void SimpleImageButtonWidgetStyle::OnHoverBegin()
{
Update(true, m_isPressed);
m_isHovered = true;
}
void SimpleImageButtonWidgetStyle::OnHoverEnd()
{
Update(false, m_isPressed);
m_isHovered = false;
}
void SimpleImageButtonWidgetStyle::OnPress()
{
Update(m_isHovered, true);
m_isPressed = true;
}
void SimpleImageButtonWidgetStyle::OnRelease()
{
Update(m_isHovered, false);
m_isPressed = false;
}
void SimpleImageButtonWidgetStyle::OnUpdate()
{
ImageButtonWidget* owner = GetOwnerWidget<ImageButtonWidget>();
// If a hovering material was added while we're being hovered, we need to detach the hovering sprite
if (owner->GetHoveredMaterial())
{
GraphicsComponent& gfxComponent = GetRegistry().get<GraphicsComponent>(m_entity);
gfxComponent.DetachRenderable(m_hoveredSprite);
}
m_sprite->SetTextureCoords(owner->GetTextureCoords());
Update(m_isHovered, m_isPressed);
}
void SimpleImageButtonWidgetStyle::UpdateRenderLayer(int baseRenderLayer)
{
m_sprite->UpdateRenderLayer(baseRenderLayer);
m_hoveredSprite->UpdateRenderLayer(baseRenderLayer + 1);
}
void SimpleImageButtonWidgetStyle::Update(bool hovered, bool pressed)
{
ImageButtonWidget* owner = GetOwnerWidget<ImageButtonWidget>();
if (pressed)
{
if (const auto& pressedMaterial = owner->GetPressedMaterial())
{
m_sprite->SetColor(owner->GetColor());
m_sprite->SetMaterial(pressedMaterial);
}
else
{
m_sprite->SetColor(owner->GetColor() * Nz::Color::FromRGB8(120, 0, 0));
m_sprite->SetMaterial(owner->GetMaterial());
}
}
else
{
m_sprite->SetColor(owner->GetColor());
m_sprite->SetMaterial(owner->GetMaterial());
}
if (hovered)
{
if (const auto& hoveredMaterial = owner->GetHoveredMaterial())
{
if (!pressed)
m_sprite->SetMaterial(hoveredMaterial);
}
else
{
if (!pressed)
m_sprite->SetMaterial(owner->GetMaterial());
GraphicsComponent& gfxComponent = GetRegistry().get<GraphicsComponent>(m_entity);
gfxComponent.AttachRenderable(m_hoveredSprite, GetRenderMask());
}
}
else
{
if (!pressed)
m_sprite->SetMaterial(owner->GetMaterial());
GraphicsComponent& gfxComponent = GetRegistry().get<GraphicsComponent>(m_entity);
gfxComponent.DetachRenderable(m_hoveredSprite);
}
}
SimpleLabelWidgetStyle::SimpleLabelWidgetStyle(LabelWidget* labelWidget, std::shared_ptr<Material> material, std::shared_ptr<Material> hoveredMaterial) :
LabelWidgetStyle(labelWidget, 1),
m_hoveredMaterial(std::move(hoveredMaterial)),
@@ -245,4 +382,123 @@ namespace Nz
{
m_textSprite->Update(drawer);
}
SimpleScrollAreaWidgetStyle::SimpleScrollAreaWidgetStyle(ScrollAreaWidget* scrollAreaWidget) :
ScrollAreaWidgetStyle((BaseWidget*) scrollAreaWidget, 0)
{
}
void SimpleScrollAreaWidgetStyle::Layout(const Vector2f& size)
{
}
void SimpleScrollAreaWidgetStyle::UpdateRenderLayer(int baseRenderLayer)
{
}
SimpleScrollbarWidgetStyle::SimpleScrollbarWidgetStyle(ScrollbarWidget* scrollBarWidget, StyleConfig config) :
ScrollbarWidgetStyle(scrollBarWidget, 1),
m_config(std::move(config))
{
auto& registry = GetRegistry();
UInt32 renderMask = GetRenderMask();
m_backgroundScrollbarSprite = std::make_shared<Sprite>((scrollBarWidget->GetOrientation() == ScrollbarOrientation::Horizontal) ? m_config.backgroundHorizontalMaterial : m_config.backgroundVerticalMaterial);
m_backgroundScrollbarSpriteEntity = CreateGraphicsEntity();
registry.get<GraphicsComponent>(m_backgroundScrollbarSpriteEntity).AttachRenderable(m_backgroundScrollbarSprite, renderMask);
m_scrollbarSpriteEntity = CreateGraphicsEntity();
registry.get<GraphicsComponent>(m_scrollbarSpriteEntity).AttachRenderable(m_scrollbarSprite, renderMask);
}
void SimpleScrollbarWidgetStyle::Layout(const Vector2f& size)
{
float totalSize;
if (GetOwnerWidget<ScrollbarWidget>()->GetOrientation() == ScrollbarOrientation::Horizontal)
totalSize = size.x;
else
totalSize = size.y;
m_backgroundScrollbarSprite->SetSize(size);
}
void SimpleScrollbarWidgetStyle::UpdateRenderLayer(int baseRenderLayer)
{
m_backgroundScrollbarSprite->UpdateRenderLayer(baseRenderLayer);
}
SimpleScrollbarButtonWidgetStyle::SimpleScrollbarButtonWidgetStyle(ScrollbarButtonWidget* scrollbarButtonWidget, StyleConfig config) :
ScrollbarButtonWidgetStyle(scrollbarButtonWidget, 1),
m_hoveredMaterial(std::move(config.hoveredMaterial)),
m_material(std::move(config.material)),
m_pressedMaterial(std::move(config.grabbedMaterial)),
m_pressedHoveredMaterial(std::move(config.grabbedHoveredMaterial)),
m_isHovered(false),
m_isPressed(false)
{
assert(m_material);
auto& registry = GetRegistry();
UInt32 renderMask = GetRenderMask();
SlicedSprite::Corner corner;
corner.size.Set(config.cornerSize);
corner.textureCoords.Set(config.cornerTexCoords);
m_sprite = std::make_shared<SlicedSprite>(m_material);
m_sprite->SetCorners(corner, corner);
m_entity = CreateGraphicsEntity();
registry.get<GraphicsComponent>(m_entity).AttachRenderable(m_sprite, renderMask);
}
void SimpleScrollbarButtonWidgetStyle::Layout(const Vector2f& size)
{
m_sprite->SetSize(size);
}
void SimpleScrollbarButtonWidgetStyle::OnHoverBegin()
{
Update(true, m_isPressed);
m_isHovered = true;
}
void SimpleScrollbarButtonWidgetStyle::OnHoverEnd()
{
Update(false, m_isPressed);
m_isHovered = false;
}
void SimpleScrollbarButtonWidgetStyle::OnGrab()
{
Update(m_isHovered, true);
m_isPressed = true;
}
void SimpleScrollbarButtonWidgetStyle::OnRelease()
{
Update(m_isHovered, false);
m_isPressed = false;
}
void SimpleScrollbarButtonWidgetStyle::UpdateRenderLayer(int baseRenderLayer)
{
m_sprite->UpdateRenderLayer(baseRenderLayer);
}
void SimpleScrollbarButtonWidgetStyle::Update(bool hovered, bool pressed)
{
if (pressed && hovered && m_pressedHoveredMaterial)
m_sprite->SetMaterial(m_pressedHoveredMaterial);
else if (pressed && m_pressedMaterial)
m_sprite->SetMaterial(m_pressedMaterial);
else if (hovered && m_hoveredMaterial)
m_sprite->SetMaterial(m_hoveredMaterial);
else
m_sprite->SetMaterial(m_material);
}
}