feat(ui): add label and image support to slider

- Add `set_text()`, `set_track_image()`, `set_thumb_image()` methods.
- Include label rendering and auto-scaling based on slider dimensions.
- Replace static `THUMB_WIDTH` with dynamic thumb sizing.
- Add slider thumb and track texture assets.
This commit is contained in:
2026-07-15 11:35:05 +08:00
parent 8706723d53
commit e1818cccfb
4 changed files with 78 additions and 19 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

View File

@@ -1,6 +1,7 @@
#pragma once
#include "Cubed/ui/image.hpp"
#include "Cubed/ui/label.hpp"
#include "Cubed/ui/widget.hpp"
namespace Cubed {
@@ -10,34 +11,29 @@ public:
Slider& set_slider(float* value, const float& min, const float& max);
Image& get_track();
Image& get_thumb();
float width() const override;
float height() const override;
Slider& set_scale(float scale);
Slider& set_width(float width);
Slider& set_height(float h);
Slider& set_text(const std::string& text);
Slider& set_track_image(const std::string& path,
TextureManager& texture_manager);
Slider& set_thumb_image(const std::string& path,
TextureManager& texture_manager);
bool handle_mouse_move_event(const MouseMoveEvent& e) override;
bool handle_mouse_button_event(const MouseButtonEvent& e) override;
private:
static constexpr float THUMB_WIDTH = 5.0f;
void init_track();
void init_thumb();
void update_value(float mouse_x);
void on_update(float) override;
void on_render(Renderer& renderer) override;
static constexpr float PADDING = 5.0f;
static constexpr float DEFAULT_SCALE = 3.0f;
std::unique_ptr<Image> m_track;
std::unique_ptr<Image> m_thumb;
float m_scale = 1.0f;
std::unique_ptr<Label> m_label;
float m_scale = DEFAULT_SCALE;
float m_width = NORMAL_SLIDER_WIDTH;
float m_height = NORMAL_SLIDER_HEIGHT;
float m_xpos = 0.0f;
@@ -46,5 +42,15 @@ private:
float* m_value = nullptr;
float m_min = 0;
float m_max = 0;
std::string m_text;
void init_track();
void init_thumb();
void update_value(float mouse_x);
void on_update(float) override;
void on_render(Renderer& renderer) override;
void update_text_scale();
};
} // namespace Cubed

View File

@@ -9,6 +9,10 @@ namespace Cubed {
Slider::Slider(Widget* parent) : Widget(parent) {
init_thumb();
init_track();
m_label = std::make_unique<Label>(this);
m_label->set_anchor(Anchor::CENTER);
void update_text_scale();
}
Slider& Slider::set_slider(float* value, const float& min, const float& max) {
@@ -18,9 +22,6 @@ Slider& Slider::set_slider(float* value, const float& min, const float& max) {
return *this;
}
Image& Slider::get_track() { return *m_track; }
Image& Slider::get_thumb() { return *m_thumb; }
void Slider::init_track() {
m_track = std::make_unique<Image>(this);
@@ -34,7 +35,7 @@ void Slider::init_thumb() {
m_thumb->set_height(height());
m_thumb->set_width(THUMB_WIDTH);
m_thumb->set_width(height() / 2.0f);
m_thumb->set_anchor(Anchor::TOP_LEFT);
@@ -48,6 +49,8 @@ Slider& Slider::set_scale(float scale) {
m_scale = scale;
m_track->set_width(width()).set_height(height());
m_thumb->set_height(height());
m_thumb->set_width(height() / 2.0f);
void update_text_scale();
return *this;
}
@@ -58,6 +61,7 @@ Slider& Slider::set_width(float width) {
return *this;
}
m_width = width;
void update_text_scale();
return *this;
}
@@ -65,6 +69,22 @@ Slider& Slider::set_height(float h) {
m_height = h;
ASSERT_MSG(m_thumb, "Thumb is nullptr !");
m_thumb->set_height(height());
m_thumb->set_width(height() / 2.0f);
void update_text_scale();
return *this;
}
Slider& Slider::set_text(const std::string& text) {
m_text = text;
return *this;
}
Slider& Slider::set_track_image(const std::string& path,
TextureManager& texture_manager) {
m_track->set_image(path, texture_manager);
return *this;
}
Slider& Slider::set_thumb_image(const std::string& path,
TextureManager& texture_manager) {
m_thumb->set_image(path, texture_manager);
return *this;
}
@@ -112,7 +132,7 @@ void Slider::update_value(float mouse_x) {
*m_value = m_min + t * (m_max - m_min);
}
void Slider::on_update(float) {
void Slider::on_update(float dt) {
if (!m_value || !m_thumb || !m_track) {
Logger::error("Please Set value and thumb and track");
ASSERT(false);
@@ -132,6 +152,18 @@ void Slider::on_update(float) {
float offset = t * (width() - m_thumb->width());
m_thumb->set_offset({offset, 0});
if (m_label && m_value) {
m_label->set_text(std::format("{}: {:.2f}", m_text, *m_value));
}
if (m_track) {
m_track->update(dt);
}
if (m_thumb) {
m_thumb->update(dt);
}
if (m_label) {
m_label->update(dt);
}
}
void Slider::on_render(Renderer& renderer) {
@@ -141,6 +173,27 @@ void Slider::on_render(Renderer& renderer) {
if (m_thumb) {
m_thumb->render(renderer);
}
if (m_label) {
m_label->render(renderer);
}
}
void Slider::update_text_scale() {
float text_w = m_label->real_width();
float text_h = m_label->real_height();
if (text_w <= 0.0f || text_h <= 0.0f)
return;
float available_w = std::max(0.0f, width() - 2.0f * PADDING * m_scale);
float available_h = std::max(0.0f, height() - 2.0f * PADDING * m_scale);
float scale_x = available_w / text_w;
float scale_y = available_h / text_h;
float scale = std::max(0.0f, std::min(scale_x, scale_y));
scale = std::clamp(scale, 0.01f, 100.0f);
m_label->set_scale(scale);
}
} // namespace Cubed