diff --git a/demos/meters.cpp b/demos/meters.cpp index 7311b85..e23b6b9 100644 --- a/demos/meters.cpp +++ b/demos/meters.cpp @@ -15,13 +15,23 @@ struct TestMeters { void init() { $gui.position(0, 0, 1280, 720); - $gui.layout("[meter1][=meter2][meter3][meter4]"); + $gui.layout( + "[*%(300,100)meter1|_|_|*%(100,400)vert1|*%(100,400)vert2|*%(100,400)vert3]" + "[*%(300,100)meter2|_|_|_|_|_]" + "[*%(300,100)meter3|_|_|_|_|_]" + "[*%(300,100)meter4|_|_|_|_|_]"); for(auto& [name, cell] : $gui.cells()) { auto gui_id = $gui.entity(name); $gui.set(gui_id, {guecs::THEME.PADDING, {120, 25, 25, 255}}); - $gui.set(gui_id, {1.0f, guecs::THEME.DARK_LIGHT, guecs::THEME.PADDING}); + + if(name.starts_with("meter")) { + $gui.set(gui_id, {1.0f, guecs::THEME.DARK_LIGHT, guecs::THEME.PADDING}); + } else { + $gui.set(gui_id, {1.0f, guecs::THEME.DARK_LIGHT, guecs::THEME.PADDING, true}); + } + $gui.set(gui_id, {}); $gui.set(gui_id, {guecs::to_wstring(name)}); $gui.set(gui_id, { diff --git a/include/guecs/sfml/components.hpp b/include/guecs/sfml/components.hpp index 86f59f8..ad30a45 100644 --- a/include/guecs/sfml/components.hpp +++ b/include/guecs/sfml/components.hpp @@ -70,9 +70,12 @@ namespace guecs { float percent = 1.0f; sf::Color color = THEME.BG_COLOR_DARK; 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; diff --git a/src/guecs/sfml/components.cpp b/src/guecs/sfml/components.cpp index c437b36..07f188e 100644 --- a/src/guecs/sfml/components.cpp +++ b/src/guecs/sfml/components.cpp @@ -113,6 +113,8 @@ namespace guecs { } void Meter::init(lel::Cell& cell) { + $cell_x = cell.x; + $cell_y = cell.y; $cell_w = cell.w; $cell_h = cell.h; bar.init(cell); @@ -125,8 +127,15 @@ namespace guecs { void Meter::update_percent(float pct) { percent = pct; - float level = std::clamp(percent, 0.0f, 1.0f) * float($cell_w); - bar.shape->setSize({std::max(level, 0.0f) - padding * 2, float($cell_h) - padding * 2}); + 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}; + bar.shape->setSize(size); + bar.shape->setPosition({float($cell_x + padding), float($cell_y) + (float($cell_h) - size.y)}); + } else { + float level = std::clamp(percent, 0.0f, 1.0f) * float($cell_w); + bar.shape->setSize({std::max(level, 0.0f) - padding * 2, float($cell_h) - padding * 2}); + } } void Sound::play(bool hover) {