diff --git a/main.cpp b/main.cpp index dc0a3a8..49097c3 100644 --- a/main.cpp +++ b/main.cpp @@ -11,12 +11,12 @@ #include #include -int WINDOW_WIDTH=1280; -int WINDOW_HEIGHT=720; +constexpr const int WINDOW_WIDTH=1920; +constexpr const int WINDOW_HEIGHT=1080; constexpr const int FRAME_LIMIT=60; constexpr const bool VSYNC=true; -constexpr const int TITLE_SIZE=84; -constexpr const int CONTENT_SIZE=56; +constexpr const int TITLE_SIZE=124; +constexpr const int CONTENT_SIZE=94; using std::string, std::wstring, std::shared_ptr, std::make_shared; using nlohmann::json; @@ -49,13 +49,13 @@ struct Slide { "[_|_|_]"); auto title = $gui.entity("title"); - $gui.set(title, { - $title, TITLE_SIZE}); + $gui.set(title, {$title, TITLE_SIZE}); auto content = $gui.entity("content"); $gui.set(content, { $content, - CONTENT_SIZE, guecs::THEME.TEXT_COLOR, 20}); + CONTENT_SIZE, + guecs::THEME.TEXT_COLOR, 20}); $gui.init(); } @@ -158,6 +158,45 @@ struct SlidesUI { } }; +struct ControlUI { + guecs::UI $gui; + guecs::Text* $status; + sf::RenderWindow& $presenter; + + ControlUI(sf::RenderWindow& presenter) : + $presenter(presenter) + { + $gui.position(0, 0, 400, 400); + $gui.layout( + "[status]" + "[docs]" + ); + } + + void init() { + auto status_id = $gui.entity("status"); + $gui.set(status_id, {L""}); + + auto docs_id = $gui.entity("docs"); + $gui.set(docs_id, {L"A: win left\nD: win right\nQ: quit"}); + + $status = $gui.get_if(status_id); + + $gui.init(); + } + + void render(sf::RenderWindow& window) { + auto pos = $presenter.getPosition(); + auto size = $presenter.getSize(); + + $status->update(fmt::format(L"pos={},{}\nsize={},{}", + pos.x, pos.y, size.x, size.y)); + + window.clear(); + $gui.render(window); + } +}; + shared_ptr parse_slides(const string& md_file) { shared_ptr slides = make_shared(); @@ -209,32 +248,37 @@ shared_ptr parse_slides(const string& md_file) { } int main(int argc, char *argv[]) { - - dbc::check(argc == 2, "USAGE: besos my_fucking_slides.md"); + dbc::check(argc >= 2, "USAGE: besos my_fucking_slides.md"); sfml::Backend backend; guecs::init(&backend); auto& modes = sf::VideoMode::getFullscreenModes(); - WINDOW_WIDTH = modes[1].size.x; - WINDOW_HEIGHT = modes[1].size.y; + auto screen_mode = std::find_if(modes.begin(), modes.end(), [=](const auto& a) -> bool { + return a.size.x == WINDOW_WIDTH && a.size.y == WINDOW_HEIGHT; + }); + + sf::RenderWindow controller(sf::VideoMode({400,400}), "Besos Loves Control"); - sf::RenderWindow window(modes[1], "Besos Loves Slides", sf::Style::None); - window.setFramerateLimit(FRAME_LIMIT); - window.setVerticalSyncEnabled(VSYNC); + sf::RenderWindow presenter(*screen_mode, + "Besos Loves Slides", sf::Style::None, sf::State::Windowed); + + presenter.setFramerateLimit(FRAME_LIMIT); + presenter.setVerticalSyncEnabled(VSYNC); + + int monitor_count = argc == 3 ? atoi(argv[1]) : 1; + auto data = argc == 3 ? parse_slides(argv[2]) : parse_slides(argv[1]); - auto data = parse_slides(argv[1]); SlidesUI slides(data); slides.init(); - while(window.isOpen()) { - while (const auto event = window.pollEvent()) { - if(event->is()) { - window.close(); - } + ControlUI control_ui(presenter); + control_ui.init(); + while(controller.isOpen()) { + while (const auto event = presenter.pollEvent()) { if(const auto* mouse = event->getIf()) { - sf::Vector2f pos = window.mapPixelToCoords(mouse->position); + sf::Vector2f pos = presenter.mapPixelToCoords(mouse->position); if(mouse->button == sf::Mouse::Button::Left) { slides.mouse(pos.x, pos.y, {1 << guecs::ModBit::left}); @@ -244,7 +288,41 @@ int main(int argc, char *argv[]) { } } - slides.render(window); - window.display(); + while (const auto event = controller.pollEvent()) { + if(event->is()) { + controller.close(); + } + + if(const auto* key = event->getIf()) { + auto pos = presenter.getPosition(); + auto size = presenter.getSize(); + + using KEY = sf::Keyboard::Scan; + switch(key->scancode) { + case KEY::A: + if(true) { + pos.x -= size.x; + presenter.setPosition(pos); + } break; + case KEY::D: + if(pos.x < int(size.x) * monitor_count) { + pos.x += int(size.x); + presenter.setPosition(pos); + } break; + case KEY::Q: + controller.close(); + break; + default: + break; + } + + fmt::println("window pos: {},{}", pos.x, pos.y); + } + } + + slides.render(presenter); + control_ui.render(controller); + presenter.display(); + controller.display(); } }