#include "sfml/components.hpp" #include "sfml/sound.hpp" #include "sfml/shaders.hpp" #include "sfml/textures.hpp" #include "guecs.hpp" #include "constants.hpp" #include constexpr const int WINDOW_WIDTH=300; constexpr const int WINDOW_HEIGHT=400; using std::string, std::wstring; const std::unordered_map LABELS { {"readout", L""}, {"clear", L"CLR"}, {"btn0", L"0"}, {"btn1", L"1"}, {"btn2", L"2"}, {"btn3", L"3"}, {"btn4", L"4"}, {"btn5", L"5"}, {"btn6", L"6"}, {"btn7", L"7"}, {"btn8", L"8"}, {"btn9", L"9"}, {"mult", L"*"}, {"minus", L"-"}, {"plus", L"+"}, {"neg", L"!"}, {"dot", L"."}, {"eq", L"="} }; struct Calculator { guecs::UI $gui; wstring $input; double $value = 0.0; Calculator() { $gui.position(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); $gui.layout( "[*%(400)readout|_|_|_|clear]" "[btn7|btn8|btn9|mult]" "[btn4|btn5|btn6|minus]" "[btn1|btn2|btn3|plus]" "[neg|btn0|dot|eq]"); } void init() { $gui.set($gui.MAIN, {}); for(auto& [name, cell] : $gui.cells()) { auto id = $gui.entity(name); auto& label = LABELS.at(name); $gui.set(id, {}); $gui.set(id, {}); if(name == "readout") { $gui.set(id, {L"", 40}); } else { $gui.set(id, { label }); $gui.set(id, { [&, name](auto, auto) { handle_button(label[0]); } }); } } $gui.init(); } void render(sf::RenderWindow& window) { $gui.render(window); // $gui.debug_layout(window); } void mouse(float x, float y, bool hover) { $gui.mouse(x, y, hover); } void handle_button(wchar_t op) { switch(op) { case L'0': case L'1': case L'2': case L'3': case L'4': case L'5': case L'6': case L'7': case L'8': case L'9': case L'.': if($input.size() <= 10) { $input += op; } break; case L'*': $value = $value * std::stof($input); $input = L""; break; case L'-': $value = $value - std::stof($input); $input = L""; break; case L'+': $value = $value + std::stof($input); $input = L""; break; case L'!': $value = $value * -1.0; $input = L""; break; case L'=': $input = fmt::format(L"{}", $value); $value = 0.0; break; case L'C': $input = L""; break; } auto readout = $gui.entity("readout"); auto& label = $gui.get(readout); label.update($input); } }; int main() { sound::init(); shaders::init(); textures::init(); sf::RenderWindow window(sf::VideoMode({WINDOW_WIDTH, WINDOW_HEIGHT}), "LEL-GUECS Calculator"); window.setFramerateLimit(FRAME_LIMIT); window.setVerticalSyncEnabled(VSYNC); Calculator calc; calc.init(); 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); calc.mouse(pos.x, pos.y, false); } } } calc.render(window); window.display(); } }