Widgets: Improve theme

- move simple styles classes ton their own file
- add button hovered texture
- add button hovered/pressed texture
- add label style
This commit is contained in:
Jérôme Leclercq
2021-11-30 12:42:05 +01:00
parent b20897a2fb
commit 461a06ab8c
10 changed files with 343 additions and 134 deletions

View File

@@ -14,8 +14,6 @@
namespace Nz
{
class DefaultDefaultButtonWidgetStyle;
class NAZARA_WIDGETS_API DefaultWidgetTheme : public WidgetTheme
{
public:
@@ -25,43 +23,17 @@ namespace Nz
~DefaultWidgetTheme() = default;
std::unique_ptr<ButtonWidgetStyle> CreateStyle(ButtonWidget* buttonWidget) const override;
std::unique_ptr<LabelWidgetStyle> CreateStyle(LabelWidget* buttonWidget) const override;
DefaultWidgetTheme& operator=(const DefaultWidgetTheme&) = delete;
DefaultWidgetTheme& operator=(DefaultWidgetTheme&&) = default;
private:
std::shared_ptr<Material> m_buttonMaterial;
std::shared_ptr<Material> m_hoveredButtonMaterial;
std::shared_ptr<Material> m_pressedHoveredMaterial;
std::shared_ptr<Material> m_pressedButtonMaterial;
};
class NAZARA_WIDGETS_API DefaultButtonWidgetStyle : public ButtonWidgetStyle
{
public:
DefaultButtonWidgetStyle(ButtonWidget* buttonWidget, std::shared_ptr<Material> defaultMaterial, std::shared_ptr<Material> pressedMaterial);
DefaultButtonWidgetStyle(const DefaultButtonWidgetStyle&) = delete;
DefaultButtonWidgetStyle(DefaultButtonWidgetStyle&&) = default;
~DefaultButtonWidgetStyle() = default;
void Layout(const Vector2f& size) override;
void OnHoverBegin() override;
void OnHoverEnd() override;
void OnPress() override;
void OnRelease() override;
void UpdateText(const AbstractTextDrawer& drawer) override;
DefaultButtonWidgetStyle& operator=(const DefaultButtonWidgetStyle&) = delete;
DefaultButtonWidgetStyle& operator=(DefaultButtonWidgetStyle&&) = default;
private:
std::shared_ptr<Material> m_defaultMaterial;
std::shared_ptr<Material> m_pressedMaterial;
std::shared_ptr<SlicedSprite> m_sprite;
std::shared_ptr<TextSprite> m_textSprite;
entt::entity m_textEntity;
entt::entity m_gradientEntity;
};
}
#include <Nazara/Widgets/DefaultWidgetTheme.inl>

View File

@@ -9,6 +9,7 @@
#include <Nazara/Graphics/TextSprite.hpp>
#include <Nazara/Widgets/BaseWidget.hpp>
#include <Nazara/Widgets/WidgetTheme.hpp>
namespace Nz
{
@@ -23,14 +24,16 @@ namespace Nz
LabelWidget(LabelWidget&&) = default;
~LabelWidget() = default;
inline void UpdateText(const AbstractTextDrawer& drawer, float scale = 1.f);
void UpdateText(const AbstractTextDrawer& drawer, float scale = 1.f);
LabelWidget& operator=(const LabelWidget&) = delete;
LabelWidget& operator=(LabelWidget&&) = default;
private:
entt::entity m_entity;
std::shared_ptr<TextSprite> m_textSprite;
void OnMouseEnter() override;
void OnMouseExit() override;
std::unique_ptr<LabelWidgetStyle> m_style;
};
}

View File

@@ -7,14 +7,6 @@
namespace Nz
{
inline void LabelWidget::UpdateText(const AbstractTextDrawer& drawer, float scale)
{
m_textSprite->Update(drawer, scale);
Nz::Vector2f size = Nz::Vector2f(m_textSprite->GetAABB().GetLengths());
SetMinimumSize(size);
SetPreferredSize(size);
}
}
#include <Nazara/Widgets/DebugOff.hpp>

View File

@@ -0,0 +1,84 @@
// Copyright (C) 2021 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Widgets module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_WIDGETS_SIMPLEWIDGETSTYLES_HPP
#define NAZARA_WIDGETS_SIMPLEWIDGETSTYLES_HPP
#include <Nazara/Graphics/SlicedSprite.hpp>
#include <Nazara/Graphics/TextSprite.hpp>
#include <Nazara/Widgets/WidgetTheme.hpp>
#include <entt/entt.hpp>
namespace Nz
{
class NAZARA_WIDGETS_API SimpleButtonWidgetStyle : public ButtonWidgetStyle
{
public:
SimpleButtonWidgetStyle(ButtonWidget* buttonWidget, std::shared_ptr<Material> material, std::shared_ptr<Material> hoveredMaterial = {}, std::shared_ptr<Material> pressedMaterial = {}, std::shared_ptr<Material> pressedHoveredMaterial = {});
SimpleButtonWidgetStyle(const SimpleButtonWidgetStyle&) = delete;
SimpleButtonWidgetStyle(SimpleButtonWidgetStyle&&) = default;
~SimpleButtonWidgetStyle() = default;
void Layout(const Vector2f& size) override;
void OnHoverBegin() override;
void OnHoverEnd() override;
void OnPress() override;
void OnRelease() override;
void UpdateText(const AbstractTextDrawer& drawer) override;
SimpleButtonWidgetStyle& operator=(const SimpleButtonWidgetStyle&) = delete;
SimpleButtonWidgetStyle& operator=(SimpleButtonWidgetStyle&&) = default;
protected:
virtual void UpdateMaterial(bool hovered, bool pressed);
private:
std::shared_ptr<Material> m_hoveredMaterial;
std::shared_ptr<Material> m_material;
std::shared_ptr<Material> m_pressedMaterial;
std::shared_ptr<Material> m_pressedHoveredMaterial;
std::shared_ptr<SlicedSprite> m_sprite;
std::shared_ptr<TextSprite> m_textSprite;
entt::entity m_spriteEntity;
entt::entity m_textEntity;
bool m_isHovered;
bool m_isPressed;
};
class NAZARA_WIDGETS_API SimpleLabelWidgetStyle : public LabelWidgetStyle
{
public:
SimpleLabelWidgetStyle(LabelWidget* labelWidget, std::shared_ptr<Material> material, std::shared_ptr<Material> hoveredMaterial = {});
SimpleLabelWidgetStyle(const SimpleLabelWidgetStyle&) = delete;
SimpleLabelWidgetStyle(SimpleLabelWidgetStyle&&) = default;
~SimpleLabelWidgetStyle() = default;
void Layout(const Vector2f& size) override;
void OnHoverBegin() override;
void OnHoverEnd() override;
void UpdateText(const AbstractTextDrawer& drawer) override;
SimpleLabelWidgetStyle& operator=(const SimpleLabelWidgetStyle&) = delete;
SimpleLabelWidgetStyle& operator=(SimpleLabelWidgetStyle&&) = default;
protected:
virtual void UpdateMaterial(bool hovered);
private:
std::shared_ptr<Material> m_hoveredMaterial;
std::shared_ptr<Material> m_material;
std::shared_ptr<TextSprite> m_textSprite;
entt::entity m_entity;
};
}
#include <Nazara/Widgets/DefaultWidgetTheme.inl>
#endif // NAZARA_WIDGETS_SIMPLEWIDGETSTYLES_HPP

View File

@@ -0,0 +1,13 @@
// Copyright (C) 2021 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Widgets module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Widgets/SimpleWidgetStyles.hpp>
#include <Nazara/Widgets/WidgetTheme.hpp>
#include <Nazara/Widgets/Debug.hpp>
namespace Nz
{
}
#include <Nazara/Widgets/DebugOff.hpp>

View File

@@ -17,6 +17,8 @@ namespace Nz
class AbstractTextDrawer;
class ButtonWidget;
class ButtonWidgetStyle;
class LabelWidget;
class LabelWidgetStyle;
class NAZARA_WIDGETS_API WidgetTheme
{
@@ -27,6 +29,7 @@ namespace Nz
virtual ~WidgetTheme();
virtual std::unique_ptr<ButtonWidgetStyle> CreateStyle(ButtonWidget* buttonWidget) const = 0;
virtual std::unique_ptr<LabelWidgetStyle> CreateStyle(LabelWidget* buttonWidget) const = 0;
WidgetTheme& operator=(const WidgetTheme&) = delete;
WidgetTheme& operator=(WidgetTheme&&) = default;
@@ -43,6 +46,7 @@ namespace Nz
virtual ~BaseWidgetStyle();
inline entt::entity CreateEntity();
entt::entity CreateGraphicsEntity();
inline void DestroyEntity(entt::entity entity);
inline entt::registry& GetRegistry();
@@ -75,7 +79,25 @@ namespace Nz
ButtonWidgetStyle& operator=(const ButtonWidgetStyle&) = delete;
ButtonWidgetStyle& operator=(ButtonWidgetStyle&&) = default;
};
class NAZARA_WIDGETS_API LabelWidgetStyle : public BaseWidgetStyle
{
public:
using BaseWidgetStyle::BaseWidgetStyle;
LabelWidgetStyle(const LabelWidgetStyle&) = delete;
LabelWidgetStyle(LabelWidgetStyle&&) = default;
~LabelWidgetStyle() = default;
virtual void Layout(const Vector2f& size) = 0;
virtual void OnHoverBegin();
virtual void OnHoverEnd();
virtual void UpdateText(const AbstractTextDrawer& drawer) = 0;
LabelWidgetStyle& operator=(const LabelWidgetStyle&) = delete;
LabelWidgetStyle& operator=(LabelWidgetStyle&&) = default;
};
}