lel-guecs/demos/meters.cpp

124 lines
3.4 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 TestMeters {
guecs::UI $gui{};
void init() {
$gui.position(0, 0, 1280, 720);
$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<guecs::Rectangle>(gui_id, {guecs::THEME.PADDING, {120, 25, 25, 255}});
if(name.starts_with("meter")) {
$gui.set<guecs::Meter>(gui_id, {1.0f, guecs::THEME.DARK_LIGHT, guecs::THEME.PADDING});
} else {
$gui.set<guecs::Meter>(gui_id, {1.0f, guecs::THEME.DARK_LIGHT, guecs::THEME.PADDING, true});
}
$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) {
auto& meter = $gui.get<guecs::Meter>(gui_id);
auto& bg = $gui.get<guecs::Rectangle>(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};
}
}
});
}
$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() {
$gui.update();
}
};
int main() {
try {
sfml::Backend backend;
guecs::init(&backend);
sf::RenderWindow window(sf::VideoMode({1280, 720}), "Meter Tester");
window.setVerticalSyncEnabled(true);
window.setFramerateLimit(60);
window.setPosition({0,0});
TestMeters gui;
gui.init();
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);
gui.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;
default:
break;
}
}
}
gui.$gui.query<guecs::Meter>([](auto ent, auto& meter) {
if(meter.percent <= 0.0f) {
meter.percent = 1.0f;
} else {
meter.percent -= 0.01f * float(ent);
}
});
gui.update();
gui.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";
}
}