From 2dbfac27c6740d086cd35aedf7684928dc669049 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 20 Apr 2026 16:02:13 -0400 Subject: [PATCH] Better design that has a render/update cycle for components. --- demos/meters.cpp | 15 ++++++++++++--- include/guecs/sfml/components.hpp | 6 +++--- include/guecs/ui.hpp | 1 + src/guecs/sfml/components.cpp | 21 +++++++++++---------- src/guecs/ui.cpp | 16 +++++++++++----- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/demos/meters.cpp b/demos/meters.cpp index e23b6b9..10195ff 100644 --- a/demos/meters.cpp +++ b/demos/meters.cpp @@ -37,7 +37,15 @@ struct TestMeters { $gui.set(gui_id, { [&, gui_id, name](auto) { auto& meter = $gui.get(gui_id); - meter.update_percent(1.0f); + auto& bg = $gui.get(gui_id); + meter.percent = 1.0f; + if(meter.color.r == 255) { + meter.color = guecs::THEME.DARK_LIGHT; + bg.color = {120, 25, 25, 255}; + } else { + meter.color = {255, 0, 0, 255}; + bg.color = {0,255,0,255}; + } } }); } @@ -54,6 +62,7 @@ struct TestMeters { } void update() { + $gui.update(); } }; @@ -94,9 +103,9 @@ int main() { gui.$gui.query([](auto ent, auto& meter) { if(meter.percent <= 0.0f) { - meter.update_percent(1.0f); + meter.percent = 1.0f; } else { - meter.update_percent(meter.percent - (0.01f * float(ent))); + meter.percent -= 0.01f * float(ent); } }); diff --git a/include/guecs/sfml/components.hpp b/include/guecs/sfml/components.hpp index ad30a45..d681ebc 100644 --- a/include/guecs/sfml/components.hpp +++ b/include/guecs/sfml/components.hpp @@ -61,6 +61,7 @@ namespace guecs { void init(lel::Cell& cell); void render(sf::RenderTarget& window, sf::Shader *shader_ptr); + void update(); }; // BUG: meter needs a backing rectangle of one color for the full bar, then @@ -72,17 +73,16 @@ namespace guecs { int padding = THEME.PADDING; bool vertical = false; Rectangle bar{padding, color}; + // this is set automatically if a Rectangle is configured for the cell - Rectangle backing_rect{padding, color}; size_t $cell_x = 0; size_t $cell_y = 0; size_t $cell_w = 0; size_t $cell_h = 0; - void init(lel::Cell& cell, guecs::Rectangle &bg); void init(lel::Cell& cell); void render(sf::RenderTarget& window, sf::Shader *shader_ptr); - void update_percent(float pct); + void update(); }; struct Effect { diff --git a/include/guecs/ui.hpp b/include/guecs/ui.hpp index 164e2ba..b797bc1 100644 --- a/include/guecs/ui.hpp +++ b/include/guecs/ui.hpp @@ -82,6 +82,7 @@ namespace guecs { void init(); void render(sf::RenderTarget& window); + void update(); bool mouse(float x, float y, Modifiers mods); void click_on(const std::string& name, Modifiers mods=NO_MODS); void click_on(Entity slot_id, Modifiers mods=NO_MODS); diff --git a/src/guecs/sfml/components.cpp b/src/guecs/sfml/components.cpp index 07f188e..2144a96 100644 --- a/src/guecs/sfml/components.cpp +++ b/src/guecs/sfml/components.cpp @@ -96,10 +96,7 @@ namespace guecs { void Rectangle::init(lel::Cell& cell) { sf::Vector2f size{float(cell.w) - padding * 2, float(cell.h) - padding * 2}; if(shape == nullptr) shape = make_shared(size); - shape->setFillColor(color); - shape->setOutlineColor(border_color); - shape->setOutlineThickness(border_px); - + update(); sfml_center_helper(shape, cell, padding); } @@ -107,9 +104,10 @@ namespace guecs { window.draw(*shape, shader_ptr); } - void Meter::init(lel::Cell& cell, Rectangle& bg) { - backing_rect = bg; - init(cell); + void Rectangle::update() { + shape->setFillColor(color); + shape->setOutlineColor(border_color); + shape->setOutlineThickness(border_px); } void Meter::init(lel::Cell& cell) { @@ -118,15 +116,18 @@ namespace guecs { $cell_w = cell.w; $cell_h = cell.h; bar.init(cell); - update_percent(percent); + update(); } void Meter::render(sf::RenderTarget& window, sf::Shader *shader_ptr) { bar.render(window, shader_ptr); } - void Meter::update_percent(float pct) { - percent = pct; + void Meter::update() { + bar.color = color; + bar.padding = padding; + bar.update(); + if(vertical) { float level = std::clamp(percent, 0.0f, 1.0f) * float($cell_h); sf::Vector2f size{float($cell_w) - padding * 2, std::max(level, 0.0f) - padding}; diff --git a/src/guecs/ui.cpp b/src/guecs/ui.cpp index 84215f2..87fa4c7 100644 --- a/src/guecs/ui.cpp +++ b/src/guecs/ui.cpp @@ -80,11 +80,7 @@ namespace guecs { }); query([this](auto ent, auto &cell, auto& meter) { - if(auto bg = get_if(ent)) { - meter.init(cell, *bg); - } else { - meter.init(cell); - } + meter.init(cell); }); query([this](auto, auto& cell, auto& text) { @@ -119,6 +115,16 @@ namespace guecs { } } + void UI::update() { + query([&](auto ent, auto& rect) { + rect.update(); + }); + + query([&](auto ent, auto &meter) { + meter.update(); + }); + } + // BUG: either render detects that the things are initialized or there's // another validator function I can call in debug modes to confirm they are void UI::render(sf::RenderTarget& window) {