From 8ee7b6f11802a8a9e7853b000b6f75b218789234 Mon Sep 17 00:00:00 2001
From: Leon Styhre <leon@leonstyhre.com>
Date: Sun, 11 Aug 2024 15:03:04 +0200
Subject: [PATCH] Changed SliderComponent to use TextComponent instead of using
 Font facilities directly

---
 es-core/src/components/SliderComponent.cpp | 54 ++++++++--------------
 es-core/src/components/SliderComponent.h   |  9 ++--
 2 files changed, 23 insertions(+), 40 deletions(-)

diff --git a/es-core/src/components/SliderComponent.cpp b/es-core/src/components/SliderComponent.cpp
index e7d7dfe29..57f5b3828 100644
--- a/es-core/src/components/SliderComponent.cpp
+++ b/es-core/src/components/SliderComponent.cpp
@@ -9,7 +9,6 @@
 #include "components/SliderComponent.h"
 
 #include "Window.h"
-#include "resources/Font.h"
 #include "utils/LocalizationUtil.h"
 
 #define MOVE_REPEAT_DELAY 500
@@ -19,18 +18,22 @@ SliderComponent::SliderComponent(float min, float max, float increment, const st
     : mRenderer {Renderer::getInstance()}
     , mMin {min}
     , mMax {max}
+    , mValue {0.0f}
     , mSingleIncrement {increment}
     , mMoveRate {0.0f}
+    , mBarLength {0.0f}
     , mBarHeight {0.0f}
     , mBarPosY {0.0f}
     , mSuffix {suffix}
 {
     assert((min - max) != 0.0f);
 
+    mSliderText = std::make_unique<TextComponent>("", Font::get(FONT_SIZE_SMALL, FONT_PATH_LIGHT),
+                                                  mMenuColorPrimary);
     setSize(mWindow->peekGui()->getSize().x * 0.26f,
             Font::get(FONT_SIZE_MEDIUM)->getLetterHeight());
 
-    // Some sane default value.
+    // Some reasonable default value.
     mValue = (max + min) / 2.0f;
 
     mKnob.setResize(0.0f, std::round(mSize.y * 0.7f));
@@ -91,26 +94,11 @@ void SliderComponent::update(int deltaTime)
 void SliderComponent::render(const glm::mat4& parentTrans)
 {
     glm::mat4 trans {parentTrans * getTransform()};
+    mSliderText->render(trans);
     mRenderer->setMatrix(trans);
 
-    if (Settings::getInstance()->getBool("DebugText")) {
-        mRenderer->drawRect(
-            mSize.x - mTextCache->metrics.size.x, (mSize.y - mTextCache->metrics.size.y) / 2.0f,
-            mTextCache->metrics.size.x, mTextCache->metrics.size.y, 0x0000FF33, 0x0000FF33);
-        mRenderer->drawRect(mSize.x - mTextCache->metrics.size.x, 0.0f, mTextCache->metrics.size.x,
-                            mSize.y, 0x00000033, 0x00000033);
-    }
-
-    const float width {
-        mSize.x - mKnob.getSize().x -
-        (mTextCache ? mTextCache->metrics.size.x + (4.0f * mRenderer->getScreenWidthModifier()) :
-                      0.0f)};
-
-    if (mTextCache)
-        mFont->renderTextCache(mTextCache.get());
-
     mRenderer->drawRect(
-        mKnob.getSize().x / 2.0f, mBarPosY, width, mBarHeight,
+        mKnob.getSize().x / 2.0f, mBarPosY, mBarLength, mBarHeight,
         (mMenuColorPrimary & 0xFFFFFF00) | static_cast<unsigned int>(mOpacity * 255.0f),
         (mMenuColorPrimary & 0xFFFFFF00) | static_cast<unsigned int>(mOpacity * 255.0f));
 
@@ -135,14 +123,15 @@ void SliderComponent::setValue(float value)
 
 void SliderComponent::onSizeChanged()
 {
-    mFont = Font::get(mSize.y, FONT_PATH_LIGHT);
+    mSliderText->setFont(Font::get(mSize.y, FONT_PATH_LIGHT));
     onValueChanged();
 }
 
 void SliderComponent::onValueChanged()
 {
-    // Update suffix textcache.
-    if (mFont) {
+    glm::vec2 textSize {0.0f, 0.0f};
+
+    {
         std::stringstream ss;
         ss << std::fixed;
         ss.precision(0);
@@ -156,12 +145,10 @@ void SliderComponent::onValueChanged()
         ss.precision(0);
         ss << mMax;
         ss << mSuffix;
-        const std::string max {ss.str()};
 
-        glm::vec2 textSize {mFont->sizeText(max)};
-        mTextCache = std::shared_ptr<TextCache>(mFont->buildTextCache(
-            val, mSize.x - textSize.x, (mSize.y - textSize.y) / 2.0f, mMenuColorPrimary));
-        mTextCache->metrics.size.x = textSize.x; // Fudge the width.
+        mSliderText->setText(val);
+        textSize = mSliderText->getFont()->sizeText(ss.str());
+        mSliderText->setPosition(mSize.x - textSize.x, (mSize.y - textSize.y) / 2.0f);
     }
 
     mKnob.setResize(0.0f, std::round(mSize.y * 0.7f));
@@ -181,12 +168,9 @@ void SliderComponent::onValueChanged()
         setSize(getSize().x, getSize().y - 1.0f);
     }
 
-    float barLength {
-        mSize.x - mKnob.getSize().x -
-        (mTextCache ? mTextCache->metrics.size.x + (4.0f * mRenderer->getScreenWidthModifier()) :
-                      0.0f)};
+    mBarLength =
+        mSize.x - mKnob.getSize().x - (textSize.x + (4.0f * mRenderer->getScreenWidthModifier()));
 
-    // Likewise for the bar.
     if (static_cast<int>(mSize.y) % 2 != static_cast<int>(mBarHeight) % 2) {
         if (mBarHeight > 1.0f && mSize.y / mBarHeight < 5.0f)
             --mBarHeight;
@@ -194,12 +178,12 @@ void SliderComponent::onValueChanged()
             ++mBarHeight;
     }
 
-    const float val {(mValue - mMin) / (mMax - mMin)};
+    const float posX {(mValue - mMin) / (mMax - mMin)};
     // For smooth outer boundaries.
-    // const float val {glm::smoothstep(mMin, mMax, mValue)};
+    // const float posX {glm::smoothstep(mMin, mMax, mValue)};
 
     const float posY {(mSize.y - mKnob.getSize().y) / 2.0f};
-    mKnob.setPosition(val * barLength + mKnob.getSize().x / 2.0f, posY);
+    mKnob.setPosition(posX * mBarLength + mKnob.getSize().x / 2.0f, posY);
 
     mKnobDisabled.setResize(mKnob.getSize());
     mKnobDisabled.setPosition(mKnob.getPosition());
diff --git a/es-core/src/components/SliderComponent.h b/es-core/src/components/SliderComponent.h
index f931db186..cc8a95135 100644
--- a/es-core/src/components/SliderComponent.h
+++ b/es-core/src/components/SliderComponent.h
@@ -11,9 +11,8 @@
 
 #include "GuiComponent.h"
 #include "components/ImageComponent.h"
-#include "resources/Font.h"
+#include "components/TextComponent.h"
 
-// Slider to set value in a predefined range.
 class SliderComponent : public GuiComponent
 {
 public:
@@ -40,7 +39,7 @@ public:
     void setOpacity(float opacity) override
     {
         mOpacity = opacity;
-        mTextCache->setOpacity(opacity);
+        mSliderText->setOpacity(opacity);
     }
 
     std::vector<HelpPrompt> getHelpPrompts() override;
@@ -53,6 +52,7 @@ private:
     float mValue;
     float mSingleIncrement;
     float mMoveRate;
+    float mBarLength;
     float mBarHeight;
     float mBarPosY;
     int mMoveAccumulator;
@@ -61,8 +61,7 @@ private:
     ImageComponent mKnobDisabled;
 
     std::string mSuffix;
-    std::shared_ptr<Font> mFont;
-    std::shared_ptr<TextCache> mTextCache;
+    std::unique_ptr<TextComponent> mSliderText;
     std::function<void()> mChangedValueCallback;
 };