123 lines
3.2 KiB
C++
123 lines
3.2 KiB
C++
#include "guecs/sfml/backend.hpp"
|
|
#include "guecs/sfml/components.hpp"
|
|
#include "guecs/uistack.hpp"
|
|
#include "guecs/ui.hpp"
|
|
#include <iostream>
|
|
#include <chrono>
|
|
#include <thread>
|
|
#include <flat_map>
|
|
#include <fmt/core.h>
|
|
|
|
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<guecs::Rectangle>(gui_id, {});
|
|
$gui.set<guecs::Effect>(gui_id, {});
|
|
$gui.set<guecs::Text>(gui_id, {guecs::to_wstring(name)});
|
|
$gui.set<guecs::Clickable>(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<TestScreen> stack;
|
|
auto test2 = std::make_shared<TestScreen>("[test2|sonice]");
|
|
auto test3 = std::make_shared<TestScreen>("[test3|pointer]");
|
|
|
|
{
|
|
stack.add("test1", std::make_shared<TestScreen>("[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<sf::Event::Closed>()) {
|
|
window.close();
|
|
}
|
|
|
|
if(const auto* mouse = event->getIf<sf::Event::MouseButtonPressed>()) {
|
|
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<sf::Event::KeyPressed>()) {
|
|
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";
|
|
}
|
|
}
|