#include "guecs/sfml/backend.hpp" #include "guecs/sfml/components.hpp" #include "guecs/uistack.hpp" #include "guecs/ui.hpp" #include #include #include #include #include using namespace std::chrono_literals; struct TestScreen { guecs::UI $gui{}; TestScreen(const std::string &layout) { init(layout); } void init(const std::string& layout) { $gui.position(0, 0, 1280, 720); $gui.layout(layout); for(auto& [name, cell] : $gui.cells()) { auto gui_id = $gui.entity(name); $gui.set(gui_id, {}); $gui.set(gui_id, {}); $gui.set(gui_id, {guecs::to_wstring(name)}); $gui.set(gui_id, { [&, gui_id, name](auto) { fmt::println("click! {}={}", name, gui_id); } }); } $gui.init(); } void render(sf::RenderTarget& target) { $gui.render(target); } bool mouse(float x, float y, guecs::Modifiers mods) { return $gui.mouse(x, y, mods); } void update() { // empty } }; int main() { try { sfml::Backend backend; guecs::init(&backend); sf::RenderWindow window(sf::VideoMode({1280, 720}), "Multi-Screen Tester"); window.setVerticalSyncEnabled(true); window.setFramerateLimit(60); window.setPosition({0,0}); gui::UIStack stack; auto test2 = std::make_shared("[test2|sonice]"); auto test3 = std::make_shared("[test3|pointer]"); { stack.add("test1", std::make_shared("[test1|hello]")); stack.add("test2", test2); stack.add("test3", test3); } stack.set_active("test1"); while(window.isOpen()) { while (const auto event = window.pollEvent()) { if(event->is()) { window.close(); } if(const auto* mouse = event->getIf()) { if(mouse->button == sf::Mouse::Button::Left) { sf::Vector2f pos = window.mapPixelToCoords(mouse->position); stack.mouse(pos.x, pos.y, false); } } else if(const auto* key = event->getIf()) { using KEY = sf::Keyboard::Scan; switch(key->scancode) { case KEY::Q: return 0; case KEY::N: { bool good = stack.next(); fmt::println("showing {} is {}", stack.active_name(), good); } break; case KEY::P: { bool good = stack.prev(); fmt::println("showing {} is {}", stack.active_name(), good); } break; case KEY::F: stack.first(); break; case KEY::L: stack.last(); break; default: break; } } } stack.update(); stack.render(window); window.display(); std::this_thread::sleep_for(100ms); } } catch(const std::system_error& e) { std::cout << "WARNING: On OSX you'll get this error on shutdown.\n"; std::cout << "Caught system_error with code " "[" << e.code() << "] meaning " "[" << e.what() << "]\n"; } }