diff --git a/demos/calc.cpp b/demos/calc.cpp index c8f69ab..c96ffea 100644 --- a/demos/calc.cpp +++ b/demos/calc.cpp @@ -141,12 +141,12 @@ struct CalculatorUI { $gui.layout( "[*%(400)stack |_|_|_]" "[*%(400)readout|_|_|_]" - "[push|pop|clear|eq]" - "[add |sub|mul |div]" - "[btn7|btn8|btn9]" - "[btn4|btn5|btn6]" - "[btn1|btn2|btn3]" - "[neg |btn0|del]"); + "[=push|=pop|=clear|=eq]" + "[=add |=sub|=mul |=div]" + "[=btn7|=btn8|=btn9]" + "[=btn4|=btn5|=btn6]" + "[=btn1|=btn2|=btn3]" + "[=neg |=btn0|=del]"); } void init() { @@ -161,12 +161,12 @@ struct CalculatorUI { $gui.set(id, {}); if(name == "readout") { - $gui.set(id, {L"", 40}); + $gui.set(id, {L"", 40}); } else if(name == "stack") { - $gui.set(id, {L"", 20}); + $gui.set(id, {L"", 20}); } else { $gui.set(id, {}); - $gui.set(id, { label }); + $gui.set(id, { label }); wchar_t op = label[0]; $gui.set(id, { [&, op](auto, auto) { handle_button(op); } diff --git a/demos/clicker_game.cpp b/demos/clicker_game.cpp index 7651ee1..7f41742 100644 --- a/demos/clicker_game.cpp +++ b/demos/clicker_game.cpp @@ -77,7 +77,7 @@ struct ClickerUI { "[_|_ |_|_|_]" "[_|_ |_|_|_]" "[_|_ |_|_|_]" - "[a1|a2|a3|a4|a5]"); + "[(30,30)a1|=(30,30)a2|a3|=a4|a5]"); } void init() { @@ -91,9 +91,9 @@ struct ClickerUI { for(auto& [name, cell] : $gui.cells()) { auto id = $gui.entity(name); if(name != "clicker") { - $gui.set(id, {}); + $gui.set(id, {0, {255, 0, 0, 255}}); $gui.set(id, {}); - $gui.set(id, { "clicker_treat_bone" }); + // $gui.set(id, { "clicker_treat_bone" }); $gui.set(id, { [&](auto, auto) { handle_button(Event::A_BUTTON); } }); diff --git a/include/guecs/sfml/components.hpp b/include/guecs/sfml/components.hpp index c7d989f..dc82033 100644 --- a/include/guecs/sfml/components.hpp +++ b/include/guecs/sfml/components.hpp @@ -10,7 +10,7 @@ namespace guecs { using std::shared_ptr, std::wstring, std::string; - struct Textual { + struct Text { std::wstring content; unsigned int size = THEME.TEXT_SIZE; sf::Color color = THEME.TEXT_COLOR; @@ -24,19 +24,6 @@ namespace guecs { void render(sf::RenderWindow& window, sf::Shader *shader_ptr); }; - struct Label : public Textual { - template - Label(Args... args) : Textual(args...) - { - centered = true; - size = THEME.LABEL_SIZE; - } - - Label() { - centered = true; - }; - }; - struct Sprite { string name; int padding = THEME.PADDING; @@ -49,20 +36,6 @@ namespace guecs { void render(sf::RenderWindow& window, sf::Shader *shader_ptr); }; - struct Icon : public Sprite { - template - Icon(Args... args) : Sprite(args...) - { - stretch = false; - is_icon = true; - } - - Icon() { - // BUG: why do I have to do this again? - stretch = false; - }; - }; - struct Rectangle { int padding = THEME.PADDING; sf::Color color = THEME.FILL_COLOR; diff --git a/src/guecs/lel.cpp b/src/guecs/lel.cpp index b363293..c8efccc 100644 --- a/src/guecs/lel.cpp +++ b/src/guecs/lel.cpp @@ -50,6 +50,7 @@ namespace lel { int cell_height = grid_h / rows; for(auto& row : grid) { + // BUG: see issue #16 size_t columns = row.size(); int cell_width = grid_w / columns; assert(cell_width > 0 && "invalid cell width calc"); diff --git a/src/guecs/sfml/components.cpp b/src/guecs/sfml/components.cpp index 06c2f0f..6dbb221 100644 --- a/src/guecs/sfml/components.cpp +++ b/src/guecs/sfml/components.cpp @@ -7,7 +7,28 @@ namespace guecs { using std::make_shared; - void Textual::init(lel::Cell &cell, shared_ptr font_ptr) { + template + void sfml_center_helper(T& obj, lel::Cell& cell, int padding) { + sf::Vector2f position{float(cell.x + padding), float(cell.y + padding)}; + + if(cell.center) { + auto bounds = obj->getLocalBounds(); + position = {float(cell.mid_x), float(cell.mid_y)}; + obj->setOrigin({bounds.size.x/2, bounds.size.y/2}); + } + + obj->setPosition(position); + } + + inline SpriteTexture load_texture(const string& name, bool is_icon) { + if(is_icon) { + return BACKEND->get_icon(name); + } else { + return BACKEND->get_sprite(name); + } + } + + void Text::init(lel::Cell &cell, shared_ptr font_ptr) { assert(font_ptr != nullptr && "you failed to initialize this WideText"); if(font == nullptr) font = font_ptr; if(text == nullptr) text = make_shared(*font, content, size); @@ -25,11 +46,11 @@ namespace guecs { text->setCharacterSize(size); } - void Textual::render(sf::RenderWindow& window, sf::Shader *shader_ptr) { + void Text::render(sf::RenderWindow& window, sf::Shader *shader_ptr) { window.draw(*text, shader_ptr); } - void Textual::update(const wstring& new_content) { + void Text::update(const wstring& new_content) { content = new_content; text->setString(content); } @@ -43,23 +64,14 @@ namespace guecs { } } - inline SpriteTexture load_texture(const string& name, bool is_icon) { - if(is_icon) { - return BACKEND->get_icon(name); - } else { - return BACKEND->get_sprite(name); - } - } - void Sprite::init(lel::Cell &cell) { + if(cell.center) stretch = false; + auto sprite_texture = load_texture(name, is_icon); auto bounds = sprite_texture.frame_size; sf::IntRect rect{{0,0}, bounds}; sprite = make_shared(*sprite_texture.texture, rect); - fmt::println("SPRITE centered: {}", cell.center); - - sprite->setPosition({float(cell.x + padding), float(cell.y + padding)}); if(stretch) { sprite->setScale({ @@ -71,6 +83,8 @@ namespace guecs { float scale = std::min(box_width / float(bounds.x), box_height / float(bounds.y)); sprite->setScale({scale, scale}); } + + sfml_center_helper(sprite, cell, padding); } void Sprite::render(sf::RenderWindow& window, sf::Shader *shader_ptr) { @@ -80,7 +94,6 @@ 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->setPosition({float(cell.x + padding), float(cell.y + padding)}); shape->setFillColor(color); shape->setOutlineColor(border_color); shape->setOutlineThickness(border_px); diff --git a/src/guecs/ui.cpp b/src/guecs/ui.cpp index b1824c6..5e8d498 100644 --- a/src/guecs/ui.cpp +++ b/src/guecs/ui.cpp @@ -82,21 +82,13 @@ namespace guecs { } }); - query([this](auto, auto& cell, auto& text) { - text.init(cell, $font); - }); - - query([this](auto, auto& cell, auto& text) { + query([this](auto, auto& cell, auto& text) { text.init(cell, $font); }); query([&](auto, auto &cell, auto &sprite) { sprite.init(cell); }); - - query([&](auto, auto &cell, auto &icon) { - icon.init(cell); - }); } void UI::debug_layout(sf::RenderWindow& window) { @@ -142,17 +134,7 @@ namespace guecs { sprite.render(window, shader_ptr); }); - query([&](auto ent, auto& icon) { - auto shader_ptr = find_shader(ent, false); - icon.render(window, shader_ptr); - }); - - query