From 964d32b34ebb905e1ce91a5a086bfb9259649a93 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Tue, 16 Jan 2024 14:13:06 +0100 Subject: [PATCH] Widgets: Add ProgressBarWidget --- examples/WidgetDemo/main.cpp | 17 +++-- include/Nazara/Widgets.hpp | 1 + include/Nazara/Widgets/DefaultWidgetTheme.hpp | 2 + include/Nazara/Widgets/ProgressBarWidget.hpp | 43 +++++++++++++ include/Nazara/Widgets/ProgressBarWidget.inl | 23 +++++++ include/Nazara/Widgets/SimpleWidgetStyles.hpp | 38 +++++++++++ include/Nazara/Widgets/WidgetTheme.hpp | 17 +++++ src/Nazara/Widgets/DefaultWidgetTheme.cpp | 24 ++++++- src/Nazara/Widgets/ProgressBarWidget.cpp | 30 +++++++++ .../DefaultTheme/ProgressBarBackground.png | Bin 0 -> 5079 bytes src/Nazara/Widgets/SimpleWidgetStyles.cpp | 60 ++++++++++++++++++ 11 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 include/Nazara/Widgets/ProgressBarWidget.hpp create mode 100644 include/Nazara/Widgets/ProgressBarWidget.inl create mode 100644 src/Nazara/Widgets/ProgressBarWidget.cpp create mode 100644 src/Nazara/Widgets/Resources/DefaultTheme/ProgressBarBackground.png diff --git a/examples/WidgetDemo/main.cpp b/examples/WidgetDemo/main.cpp index 8df31e688..9707ab5cf 100644 --- a/examples/WidgetDemo/main.cpp +++ b/examples/WidgetDemo/main.cpp @@ -47,10 +47,6 @@ int main(int argc, char* argv[]) buttonWidget->SetPosition(200.f, 400.f); buttonWidget->UpdateText(Nz::SimpleTextDrawer::Draw("Press me senpai", 72)); buttonWidget->Resize(buttonWidget->GetPreferredSize()); - buttonWidget->OnButtonTrigger.Connect([&](const Nz::ButtonWidget*) - { - labelWidget->UpdateText(Nz::SimpleTextDrawer::Draw("You clicked the button " + std::to_string(++clickCount) + " times", 72)); - }); Nz::TextureSamplerInfo samplerInfo; samplerInfo.anisotropyLevel = 8; @@ -101,6 +97,19 @@ int main(int argc, char* argv[]) builder << Nz::Color::Blue() << "Rich " << Nz::TextStyle::Bold << "text" << Nz::TextStyle_Regular << builder.CharacterSize(36) << Nz::Color::Black() << "\nAnd a even " << builder.CharacterSize(48) << Nz::Color::Red() << "bigger" << builder.CharacterSize(24) << Nz::Color::Black() << " text"; textAreaWidget2->Resize(Nz::Vector2f(500.f, textAreaWidget2->GetPreferredHeight())); + Nz::ProgressBarWidget* progressBarWidget = canvas2D.Add(); + progressBarWidget->SetPosition(200.f, 600.f); + progressBarWidget->Resize({ 512.f, 64.f }); + + buttonWidget->OnButtonTrigger.Connect([&](const Nz::ButtonWidget*) + { + labelWidget->UpdateText(Nz::SimpleTextDrawer::Draw("You clicked the button " + std::to_string(++clickCount) + " times", 72)); + if (progressBarWidget->GetFraction() >= 1.f) + progressBarWidget->SetFraction(0.f); + else + progressBarWidget->SetFraction(progressBarWidget->GetFraction() + 0.1001f); //< ensures ten clicks go over 1 + }); + entt::handle viewer2D = world.CreateEntity(); { viewer2D.emplace(); diff --git a/include/Nazara/Widgets.hpp b/include/Nazara/Widgets.hpp index 304a13232..ca7783802 100644 --- a/include/Nazara/Widgets.hpp +++ b/include/Nazara/Widgets.hpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include diff --git a/include/Nazara/Widgets/DefaultWidgetTheme.hpp b/include/Nazara/Widgets/DefaultWidgetTheme.hpp index a46bf1fd4..b1eed5d2c 100644 --- a/include/Nazara/Widgets/DefaultWidgetTheme.hpp +++ b/include/Nazara/Widgets/DefaultWidgetTheme.hpp @@ -26,6 +26,7 @@ namespace Nz std::unique_ptr CreateStyle(CheckboxWidget* checkboxWidget) const override; std::unique_ptr CreateStyle(ImageButtonWidget* imageButtonWidget) const override; std::unique_ptr CreateStyle(LabelWidget* labelWidget) const override; + std::unique_ptr CreateStyle(ProgressBarWidget* progressBarWidget) const override; std::unique_ptr CreateStyle(ScrollAreaWidget* scrollAreaWidget) const override; std::unique_ptr CreateStyle(ScrollbarWidget* scrollbarWidget) const override; std::unique_ptr CreateStyle(ScrollbarButtonWidget* scrollbarButtonWidget) const override; @@ -43,6 +44,7 @@ namespace Nz std::shared_ptr m_checkboxCheckMaterial; std::shared_ptr m_checkboxTristateMaterial; std::shared_ptr m_hoveredMaterial; + std::shared_ptr m_progressBarMaterial; std::shared_ptr m_scrollbarBackgroundHorizontalMaterial; std::shared_ptr m_scrollbarBackgroundVerticalMaterial; std::shared_ptr m_scrollbarButtonMaterial; diff --git a/include/Nazara/Widgets/ProgressBarWidget.hpp b/include/Nazara/Widgets/ProgressBarWidget.hpp new file mode 100644 index 000000000..66c27db26 --- /dev/null +++ b/include/Nazara/Widgets/ProgressBarWidget.hpp @@ -0,0 +1,43 @@ +// 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 + +#pragma once + +#ifndef NAZARA_WIDGETS_PROGRESSBARWIDGET_HPP +#define NAZARA_WIDGETS_PROGRESSBARWIDGET_HPP + +#include +#include +#include + +namespace Nz +{ + class NAZARA_WIDGETS_API ProgressBarWidget : public BaseWidget + { + public: + ProgressBarWidget(BaseWidget* parent); + ProgressBarWidget(const ProgressBarWidget&) = delete; + ProgressBarWidget(ProgressBarWidget&&) = delete; + ~ProgressBarWidget() = default; + + inline float GetFraction() const; + + void Layout() override; + + void OnRenderLayerUpdated(int baseRenderLayer) override; + + inline void SetFraction(float fraction); + + ProgressBarWidget& operator=(const ProgressBarWidget&) = delete; + ProgressBarWidget& operator=(ProgressBarWidget&&) = delete; + + private: + std::unique_ptr m_style; + float m_fraction; + }; +} + +#include + +#endif // NAZARA_WIDGETS_PROGRESSBARWIDGET_HPP diff --git a/include/Nazara/Widgets/ProgressBarWidget.inl b/include/Nazara/Widgets/ProgressBarWidget.inl new file mode 100644 index 000000000..bb8562fa7 --- /dev/null +++ b/include/Nazara/Widgets/ProgressBarWidget.inl @@ -0,0 +1,23 @@ +// 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 +#include +#include + +namespace Nz +{ + inline float ProgressBarWidget::GetFraction() const + { + return m_fraction; + } + + inline void ProgressBarWidget::SetFraction(float fraction) + { + m_fraction = std::clamp(fraction, 0.f, 1.f); + Layout(); + } +} + +#include diff --git a/include/Nazara/Widgets/SimpleWidgetStyles.hpp b/include/Nazara/Widgets/SimpleWidgetStyles.hpp index 974a70a2f..f5e383ee3 100644 --- a/include/Nazara/Widgets/SimpleWidgetStyles.hpp +++ b/include/Nazara/Widgets/SimpleWidgetStyles.hpp @@ -179,6 +179,44 @@ namespace Nz std::shared_ptr m_textSprite; entt::entity m_entity; }; + + class NAZARA_WIDGETS_API SimpleProgressBarWidgetStyle : public ProgressBarWidgetStyle + { + public: + struct StyleConfig; + + SimpleProgressBarWidgetStyle(ProgressBarWidget* progressBarWidget, StyleConfig styleConfig); + SimpleProgressBarWidgetStyle(const SimpleProgressBarWidgetStyle&) = delete; + SimpleProgressBarWidgetStyle(SimpleProgressBarWidgetStyle&&) = default; + ~SimpleProgressBarWidgetStyle() = default; + + void Layout(const Vector2f& size) override; + + void UpdateRenderLayer(int baseRenderLayer) override; + + SimpleProgressBarWidgetStyle& operator=(const SimpleProgressBarWidgetStyle&) = delete; + SimpleProgressBarWidgetStyle& operator=(SimpleProgressBarWidgetStyle&&) = default; + + struct StyleConfig + { + std::shared_ptr backgroundMaterial; + Color progressBarBeginColor; + Color progressBarEndColor; + float backgroundCornerSize; + float backgroundCornerTexCoords; + float barOffset; + }; + + private: + std::shared_ptr m_backgroundMaterial; + std::shared_ptr m_backgroundSprite; + std::shared_ptr m_progressBarSprite; + entt::entity m_backgroundEntity; + entt::entity m_barEntity; + Color m_progressBarBeginColor; + Color m_progressBarEndColor; + float m_barOffset; + }; class NAZARA_WIDGETS_API SimpleScrollAreaWidgetStyle : public ScrollAreaWidgetStyle { diff --git a/include/Nazara/Widgets/WidgetTheme.hpp b/include/Nazara/Widgets/WidgetTheme.hpp index 6c1873003..f30e1bfb3 100644 --- a/include/Nazara/Widgets/WidgetTheme.hpp +++ b/include/Nazara/Widgets/WidgetTheme.hpp @@ -24,6 +24,8 @@ namespace Nz class ImageButtonWidgetStyle; class LabelWidget; class LabelWidgetStyle; + class ProgressBarWidget; + class ProgressBarWidgetStyle; class ScrollAreaWidget; class ScrollAreaWidgetStyle; class ScrollbarWidget; @@ -45,6 +47,7 @@ namespace Nz virtual std::unique_ptr CreateStyle(CheckboxWidget* checkboxWidget) const = 0; virtual std::unique_ptr CreateStyle(ImageButtonWidget* imageButtonWidget) const = 0; virtual std::unique_ptr CreateStyle(LabelWidget* labelWidget) const = 0; + virtual std::unique_ptr CreateStyle(ProgressBarWidget* labelWidget) const = 0; virtual std::unique_ptr CreateStyle(ScrollAreaWidget* scrollareaWidget) const = 0; virtual std::unique_ptr CreateStyle(ScrollbarWidget* scrollbarWidget) const = 0; virtual std::unique_ptr CreateStyle(ScrollbarButtonWidget* scrollbarButtonWidget) const = 0; @@ -183,6 +186,20 @@ namespace Nz LabelWidgetStyle& operator=(const LabelWidgetStyle&) = delete; LabelWidgetStyle& operator=(LabelWidgetStyle&&) = default; }; + + class NAZARA_WIDGETS_API ProgressBarWidgetStyle : public BaseWidgetStyle + { + public: + using BaseWidgetStyle::BaseWidgetStyle; + ProgressBarWidgetStyle(const ProgressBarWidgetStyle&) = delete; + ProgressBarWidgetStyle(ProgressBarWidgetStyle&&) = default; + ~ProgressBarWidgetStyle() = default; + + virtual void Layout(const Vector2f& size) = 0; + + ProgressBarWidgetStyle& operator=(const ProgressBarWidgetStyle&) = delete; + ProgressBarWidgetStyle& operator=(ProgressBarWidgetStyle&&) = default; + }; class NAZARA_WIDGETS_API ScrollAreaWidgetStyle : public BaseWidgetStyle { diff --git a/src/Nazara/Widgets/DefaultWidgetTheme.cpp b/src/Nazara/Widgets/DefaultWidgetTheme.cpp index 943d7c759..be4eb7b45 100644 --- a/src/Nazara/Widgets/DefaultWidgetTheme.cpp +++ b/src/Nazara/Widgets/DefaultWidgetTheme.cpp @@ -14,7 +14,7 @@ namespace Nz namespace { const UInt8 s_defaultThemeButtonImage[] = { - #include + #include }; const UInt8 s_defaultThemeButtonHoveredImage[] = { @@ -49,6 +49,10 @@ namespace Nz #include }; + const UInt8 s_defaultThemeProgressBarBackgroundImage[] = { + #include + }; + const UInt8 s_defaultThemeScrollbarHorizontalBackgroundImage[] = { #include }; @@ -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(labelWidget, Widgets::Instance()->GetTransparentMaterial()); } + std::unique_ptr 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(progressBarWidget, styleConfig); + } + std::unique_ptr DefaultWidgetTheme::CreateStyle(ScrollAreaWidget* scrollAreaWidget) const { return std::make_unique(scrollAreaWidget); diff --git a/src/Nazara/Widgets/ProgressBarWidget.cpp b/src/Nazara/Widgets/ProgressBarWidget.cpp new file mode 100644 index 000000000..a94ddf230 --- /dev/null +++ b/src/Nazara/Widgets/ProgressBarWidget.cpp @@ -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 +#include + +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); + } +} diff --git a/src/Nazara/Widgets/Resources/DefaultTheme/ProgressBarBackground.png b/src/Nazara/Widgets/Resources/DefaultTheme/ProgressBarBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..226610aff0a12c1a3c8e466c28f98029fe4f0f22 GIT binary patch literal 5079 zcmeHLX;>5I77l`-EFvzTQYDR`sLe7-$Roa0RKYY`gXP9hmUP7Vpjf?X1YlW=r4{tnd~(G&U4R+p;!0& zt!YQy(w{67nOAja&N`h9{H-@EGk~LXyK}2~N}XMzV6Mp=3v>Y7f!v7M)DV{)I?=7! zVcUcaEcTE~#*<^a{8mOx@cMBk)nw6T6B zJ*p>@rJYuVCMG=pimsdsndcvr4gROm`pWF<%yGY#oSf5h?MXsg_KcyJ6^Qy+0Vuxe z7b)i5TE6f_O(OtaU0 zUW3G}f3dV^-*~sa-{T&BQT6>kG*r&mv$$eQ=is5zUdL;a{hL}>Zik{Kq*K;EBh}bi z?mpeDCFMF#%FOT?>oNUO7KEj}IRCW5yT7k--}#vbucbKxUZNRsp^{>-c_6RX+d4J{+Map*PAS6 z)u%aRuL0sMt7nHBL(aWbnadLWO||P-e>&`6P)W*j=w{FQdW}cP(dP|wbzAt0Z5LJB zd+n_}TXDYe`#z7`%A|_=Nc*8l3Ct5EH+_nZ_PCu_W#!9j?*Nld-z^(^a$3eK=HU6S z+`3F<&mg~Zx9h@ce?A39+fVI{IFKhw3VU@cc5#x)WUKt=;`)-cw{5``-+a3phpv>~ z1v-qejG5(UFDEXq2_?_UC@1P1Qb`xvwzom04%XzGw7PEW8~UZA3+)KwpvQ_3FpheD zZI4gOO#Y;7_gdMiwqS14^4+qeftL}&rOoi_0LL7t9JEnQyeN+p+*#F0Uf^T?i2rD} zhn-_ecX{t)`#Y62V=h|GIC#c2K0W+=$xp4-#W96vE}!|>tI2tVPerl1y|Z}d{Nnh4 zSJm#JQNEhJ&5Yde#g_43r7!caaS9)I`ACL@;&I2udMLeX`!{}b!fd|&$ii8)q5FB& zP{)A$LhEmNd!~Fvx=%mx5*UN^j(J+7NOicL_|oLzBIB^g%PWo;{cB%d*q+FqaXoFO zv?F`6D$PFcBdrT4hkdqnA8_i{oPIHVRj}!_(y`@NTFYD-;{PD!#fF~ap04_sk#(Rq zVY^OuqT&9HoVq_#NLa6?u-s*X0PoY&P`n?9i$4`WDg_OMRT6}zSE%uRO(MB2(yKuz z4#CJ0M20Gblm`{3C}b2CQo>xs46#~-#G*dQ8YDQ`KLkpSgZMCIk(;@zUVsBA5DX;i z6>_CkpchgMxB~p15Ys7Sg9;WWq=btD$s&~oA+u?08iVSkM-!P8H*>P929^qfJeQ0> z;7>wIEQYBCbh=Kbqv=>Ql}1Jf_pR9u6qO;Tc@o~qQ&CLo3}JP|FVLDd+l zQj!TwP@+n}gcJ%sPJSJqLM;}*fmdorSit$9>p?XgpfTtQ1%0%I7V}EPK}G`lTMKOn z{t3S3o-dj;Nc>Fp~Hd}BdSAVU>u zgB4EpJDM0OeM{Cmu@NJNbVdh)o4>(*NBec|24!4JEEagGpadd3Ur!;0@GpQ>5DE(n zw;Tj^;lco$%HzQtDqG4!s34aqrE*w&K9|7(m=Meu1?8*MVxSU22q+w!hT=F71OpNd z08u4;P(o!(*a!~Bf7v<3emI zo5yvbN&o%XGA2&zDWF_7RB;4)lTd=8h#<*^wo7tULyP(-7}Ymq<&7&O)} zGBGg%JRO``kf>A~z+i!ABM@m25L0PFR4TcULWDpjEDZ%tb{(D;A5@ELBoQ?~QuV<| z{P5H8B9NnoAu`!exB?IwcA^Cn5!m1ew;LXUVnL-0!B_Z5Nxhb%e=}W7gv)1gIS3Wt za$zc)%fe@z&tg!yTnPk#01Pvw!)d%h*Q%tL4%8qXGCWf}8@z-J*^r$_$ej0XG`d)X zV2Z(HQyBmi;Di7S0l*iqxfJ?HvUFlizs}Z`{$G5!8Wct~0o-m_hBp_ySJB@zs}a5k z3je`lWFG!O4>AFAvBMwj{9*BwNO?|^jp z%go@j6@K`Okg3Ga+mqBme6FVY>v73=wNHeWM6#GnoJORq>}j~r4D%Ixne`Y=96yg4i{a3|lz_ChJfvmP~Br!q!Z%!ViL^S^9ndx$GClXH ymErk+zFgwpT7L6h-(ljPIpVkiumAl~`yeUis)gIV<3m3YGG8x$&m)Ut*8T;F<((`5 literal 0 HcmV?d00001 diff --git a/src/Nazara/Widgets/SimpleWidgetStyles.cpp b/src/Nazara/Widgets/SimpleWidgetStyles.cpp index 5dfdaa33c..760506047 100644 --- a/src/Nazara/Widgets/SimpleWidgetStyles.cpp +++ b/src/Nazara/Widgets/SimpleWidgetStyles.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -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 material, std::shared_ptr 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(m_backgroundMaterial); + m_backgroundSprite->SetCorners(backgroundCorner, backgroundCorner); + + m_backgroundEntity = CreateGraphicsEntity(); + registry.get(m_backgroundEntity).AttachRenderable(m_backgroundSprite, renderMask); + + m_progressBarSprite = std::make_shared(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(m_barEntity).AttachRenderable(m_progressBarSprite, renderMask); + registry.get(m_barEntity).SetPosition(m_barOffset, m_barOffset); + } + + void SimpleProgressBarWidgetStyle::Layout(const Vector2f& size) + { + float fraction = GetOwnerWidget()->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),