Widgets: Add ProgressBarWidget

This commit is contained in:
SirLynix
2024-01-16 14:13:06 +01:00
parent c8776bc950
commit 964d32b34e
11 changed files with 249 additions and 6 deletions

View File

@@ -14,7 +14,7 @@ namespace Nz
namespace
{
const UInt8 s_defaultThemeButtonImage[] = {
#include <Nazara/Widgets/Resources/DefaultTheme/Button.png.h>
#include <Nazara/Widgets/Resources/DefaultTheme/Button_SMALL2.png.h>
};
const UInt8 s_defaultThemeButtonHoveredImage[] = {
@@ -49,6 +49,10 @@ namespace Nz
#include <Nazara/Widgets/Resources/DefaultTheme/Hovered.png.h>
};
const UInt8 s_defaultThemeProgressBarBackgroundImage[] = {
#include <Nazara/Widgets/Resources/DefaultTheme/ProgressBarBackground.png.h>
};
const UInt8 s_defaultThemeScrollbarHorizontalBackgroundImage[] = {
#include <Nazara/Widgets/Resources/DefaultTheme/ScrollbarBackgroundHorizontal.png.h>
};
@@ -146,6 +150,9 @@ namespace Nz
m_checkboxCheckMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(s_defaultThemeCheckboxCheckImage, sizeof(s_defaultThemeCheckboxCheckImage), texParams));
m_checkboxTristateMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(s_defaultThemeCheckboxTristateImage, sizeof(s_defaultThemeCheckboxTristateImage), texParams));
// ProgressBar materials
m_progressBarMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(s_defaultThemeProgressBarBackgroundImage, sizeof(s_defaultThemeProgressBarBackgroundImage), texParams));
// Scrollbar materials
m_scrollbarBackgroundHorizontalMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(s_defaultThemeScrollbarHorizontalBackgroundImage, sizeof(s_defaultThemeScrollbarHorizontalBackgroundImage), texParams));
m_scrollbarBackgroundVerticalMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(s_defaultThemeScrollbarVerticalBackgroundImage, sizeof(s_defaultThemeScrollbarVerticalBackgroundImage), texParams));
@@ -179,7 +186,7 @@ namespace Nz
{
SimpleButtonWidgetStyle::StyleConfig styleConfig;
styleConfig.cornerSize = 20.f;
styleConfig.cornerTexCoords = 20.f / 128.f;
styleConfig.cornerTexCoords = 20.f / 42.f;
styleConfig.hoveredMaterial = m_buttonHoveredMaterial;
styleConfig.material = m_buttonMaterial;
styleConfig.pressedHoveredMaterial = m_buttonPressedHoveredMaterial;
@@ -216,6 +223,19 @@ namespace Nz
return std::make_unique<SimpleLabelWidgetStyle>(labelWidget, Widgets::Instance()->GetTransparentMaterial());
}
std::unique_ptr<ProgressBarWidgetStyle> DefaultWidgetTheme::CreateStyle(ProgressBarWidget* progressBarWidget) const
{
SimpleProgressBarWidgetStyle::StyleConfig styleConfig;
styleConfig.backgroundCornerSize = 16.f;
styleConfig.backgroundCornerTexCoords = 16.f / 64.f;
styleConfig.backgroundMaterial = m_progressBarMaterial;
styleConfig.barOffset = 12.f;
styleConfig.progressBarBeginColor = Nz::Color::DarkGreen();
styleConfig.progressBarEndColor = Nz::Color::Green();
return std::make_unique<SimpleProgressBarWidgetStyle>(progressBarWidget, styleConfig);
}
std::unique_ptr<ScrollAreaWidgetStyle> DefaultWidgetTheme::CreateStyle(ScrollAreaWidget* scrollAreaWidget) const
{
return std::make_unique<SimpleScrollAreaWidgetStyle>(scrollAreaWidget);

View File

@@ -0,0 +1,30 @@
// Copyright (C) 2024 Jérôme "SirLynix" 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/ProgressBarWidget.hpp>
#include <Nazara/Widgets/Debug.hpp>
namespace Nz
{
ProgressBarWidget::ProgressBarWidget(BaseWidget* parent) :
BaseWidget(parent),
m_fraction(0.f)
{
m_style = GetTheme()->CreateStyle(this);
SetRenderLayerCount(m_style->GetRenderLayerCount());
Layout();
}
void ProgressBarWidget::Layout()
{
BaseWidget::Layout();
m_style->Layout(GetSize());
}
void ProgressBarWidget::OnRenderLayerUpdated(int baseRenderLayer)
{
m_style->UpdateRenderLayer(baseRenderLayer);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -10,6 +10,7 @@
#include <Nazara/Widgets/CheckboxWidget.hpp>
#include <Nazara/Widgets/ImageButtonWidget.hpp>
#include <Nazara/Widgets/LabelWidget.hpp>
#include <Nazara/Widgets/ProgressBarWidget.hpp>
#include <Nazara/Widgets/ScrollAreaWidget.hpp>
#include <Nazara/Widgets/ScrollbarButtonWidget.hpp>
#include <Nazara/Widgets/ScrollbarWidget.hpp>
@@ -105,6 +106,7 @@ namespace Nz
m_sprite->SetMaterial(m_material);
}
/************************************************************************/
SimpleCheckboxWidgetStyle::SimpleCheckboxWidgetStyle(CheckboxWidget* buttonWidget, StyleConfig config) :
CheckboxWidgetStyle(buttonWidget, 2),
@@ -197,6 +199,7 @@ namespace Nz
m_backgroundSprite->SetMaterial(m_material);
}
/************************************************************************/
SimpleImageButtonWidgetStyle::SimpleImageButtonWidgetStyle(ImageButtonWidget* imageButtonWidget, StyleConfig config) :
ImageButtonWidgetStyle(imageButtonWidget, 1),
@@ -337,6 +340,7 @@ namespace Nz
}
}
/************************************************************************/
SimpleLabelWidgetStyle::SimpleLabelWidgetStyle(LabelWidget* labelWidget, std::shared_ptr<MaterialInstance> material, std::shared_ptr<MaterialInstance> hoveredMaterial) :
LabelWidgetStyle(labelWidget, 1),
@@ -389,7 +393,62 @@ namespace Nz
{
m_textSprite->Update(drawer);
}
/************************************************************************/
SimpleProgressBarWidgetStyle::SimpleProgressBarWidgetStyle(ProgressBarWidget* progressBarWidget, StyleConfig config) :
ProgressBarWidgetStyle(progressBarWidget, 2),
m_backgroundMaterial(std::move(config.backgroundMaterial)),
m_progressBarBeginColor(config.progressBarBeginColor),
m_progressBarEndColor(config.progressBarEndColor),
m_barOffset(config.barOffset)
{
assert(m_backgroundMaterial);
auto& registry = GetRegistry();
UInt32 renderMask = GetRenderMask();
SlicedSprite::Corner backgroundCorner;
backgroundCorner.size = Vector2f(config.backgroundCornerSize, config.backgroundCornerSize);
backgroundCorner.textureCoords = Vector2f(config.backgroundCornerTexCoords, config.backgroundCornerTexCoords);
m_backgroundSprite = std::make_shared<SlicedSprite>(m_backgroundMaterial);
m_backgroundSprite->SetCorners(backgroundCorner, backgroundCorner);
m_backgroundEntity = CreateGraphicsEntity();
registry.get<GraphicsComponent>(m_backgroundEntity).AttachRenderable(m_backgroundSprite, renderMask);
m_progressBarSprite = std::make_shared<Sprite>(Widgets::Instance()->GetTransparentMaterial());
m_progressBarSprite->SetCornerColor(RectCorner::LeftBottom, m_progressBarBeginColor);
m_progressBarSprite->SetCornerColor(RectCorner::LeftTop, m_progressBarBeginColor);
m_progressBarSprite->SetCornerColor(RectCorner::RightBottom, m_progressBarEndColor);
m_progressBarSprite->SetCornerColor(RectCorner::RightTop, m_progressBarEndColor);
m_barEntity = CreateGraphicsEntity();
registry.get<GraphicsComponent>(m_barEntity).AttachRenderable(m_progressBarSprite, renderMask);
registry.get<NodeComponent>(m_barEntity).SetPosition(m_barOffset, m_barOffset);
}
void SimpleProgressBarWidgetStyle::Layout(const Vector2f& size)
{
float fraction = GetOwnerWidget<ProgressBarWidget>()->GetFraction();
float width = std::max(fraction * (size.x - m_barOffset * 2.f), 0.f);
Color endColor = Lerp(m_progressBarBeginColor, m_progressBarEndColor, fraction);
m_progressBarSprite->SetCornerColor(RectCorner::RightBottom, endColor);
m_progressBarSprite->SetCornerColor(RectCorner::RightTop, endColor);
m_backgroundSprite->SetSize(size);
m_progressBarSprite->SetSize({ width, size.y - m_barOffset * 2.f });
}
void SimpleProgressBarWidgetStyle::UpdateRenderLayer(int baseRenderLayer)
{
m_backgroundSprite->UpdateRenderLayer(baseRenderLayer);
m_progressBarSprite->UpdateRenderLayer(baseRenderLayer + 1);
}
/************************************************************************/
SimpleScrollAreaWidgetStyle::SimpleScrollAreaWidgetStyle(ScrollAreaWidget* scrollAreaWidget) :
ScrollAreaWidgetStyle(scrollAreaWidget, 0)
@@ -431,6 +490,7 @@ namespace Nz
m_backgroundScrollbarSprite->UpdateRenderLayer(baseRenderLayer);
}
/************************************************************************/
SimpleScrollbarButtonWidgetStyle::SimpleScrollbarButtonWidgetStyle(ScrollbarButtonWidget* scrollbarButtonWidget, StyleConfig config) :
ScrollbarButtonWidgetStyle(scrollbarButtonWidget, 1),