diff --git a/src/main.cpp b/src/main.cpp index b00fc75..0e66176 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,30 +14,13 @@ struct Options { std::string deck_file{}; bool deck_given{false}; bool help{false}; + sf::Vector2u pres_size{WINDOW_WIDTH, WINDOW_HEIGHT}; + sf::Vector2u control_size{CONTROL_WIDTH, CONTROL_HEIGHT}; bool error{false}; + unsigned short port=9898; }; -std::shared_ptr load_slides(const std::string& input_md, std::shared_ptr backend) { - try { - auto deck = parse_slides(input_md, [&](nlohmann::json& config) { - backend->set_font(config["font_file"]); - guecs::init(backend.get()); - }); - - fmt::println("FONT FILE: {}", backend->$font_file); - - auto slides = std::make_shared(deck, sf::Vector2u{WINDOW_WIDTH, WINDOW_HEIGHT}); - slides->init(); - - return slides; - } catch(...) { - fmt::println("ERROR!"); - return nullptr; - } -} - - void print_usage() { fmt::println("USAGE: bezos [-p PORT] [-h] -d deck.md"); } @@ -73,70 +56,101 @@ Options parse_options(int argc, char* argv[]) { return result; } +struct App { + Options options; + gui::Backend backend{}; + sf::RenderWindow presenter{sf::VideoMode(options.pres_size), + "Bezos Loves Slides", sf::Style::None, sf::State::Windowed}; -int main(int argc, char *argv[]) { - auto options = parse_options(argc, argv); + sf::RenderWindow controller{sf::VideoMode(options.control_size), "Bezos Loves Control"}; + std::shared_ptr control_ui = nullptr; + std::shared_ptr slides = nullptr; + ChangeDetector reloader{}; - if(options.help) { - return 0; - } else if(options.error) { - return 1; + void init() { + presenter.setPosition({0,0}); + presenter.setFramerateLimit(FRAME_LIMIT); + presenter.setVerticalSyncEnabled(VSYNC); + + slides = load_slides(); + dbc::check(slides != nullptr, "ERROR in your .md file"); + + control_ui = std::make_shared(presenter, controller, options.port); + control_ui->init(); + control_ui->full_screen(false); + + reloader.watch(options.deck_file); + reloader.watch(slides->$deck->config["layouts"]); } - auto& modes = sf::VideoMode::getFullscreenModes(); - 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; - }); + void change_slides() { + // save the current slide + auto current_slide = slides->$deck->current; + // load the new one + auto new_slides = load_slides(); - sf::RenderWindow presenter(*screen_mode, - "Bezos Loves Slides", sf::Style::None, sf::State::Windowed); + if(new_slides) { + new_slides->set_slide(current_slide); + slides = new_slides; + } + } - presenter.setPosition({0,0}); - presenter.setFramerateLimit(FRAME_LIMIT); - presenter.setVerticalSyncEnabled(VSYNC); + void update() { + if(reloader.changed()) { + change_slides(); + } - sf::RenderWindow controller(sf::VideoMode({CONTROL_WIDTH, CONTROL_HEIGHT}), "Bezos Loves Control"); + slides->update(presenter); + control_ui->update(slides); + } - auto backend = std::make_shared(); + void render() { + slides->render(presenter); + control_ui->render(controller, *slides->$deck); - auto slides = load_slides(options.deck_file, backend); + presenter.display(); + controller.display(); + } - if(!slides) { - fmt::println("ERROR in your .md file"); - return 1; + bool open() { + return controller.isOpen(); } - ControlUI control_ui{presenter, controller, options.port}; - control_ui.init(); - control_ui.full_screen(false); + std::shared_ptr load_slides() { + try { + auto deck = parse_slides(options.deck_file, [&](nlohmann::json& config) { + backend.set_font(config["font_file"]); + guecs::init(&backend); + }); + + fmt::println("FONT FILE: {}", backend.$font_file); - ChangeDetector reloader; - reloader.watch(options.deck_file); - reloader.watch(slides->$deck->config["layouts"]); + auto slides = std::make_shared(deck, options.pres_size); + slides->init(); - while(controller.isOpen()) { - while(const auto event = presenter.pollEvent()) { - if(event) slides->handle_events(presenter, *event); + return slides; + } catch(...) { + fmt::println("ERROR!"); + return nullptr; } + } +}; - control_ui.update(slides); +int main(int argc, char *argv[]) { + auto options = parse_options(argc, argv); - slides->render(presenter); - control_ui.render(controller, *slides->$deck); + if(options.help) { + return 0; + } else if(options.error) { + return 1; + } - presenter.display(); - controller.display(); + auto app = std::make_shared(options); - if(reloader.changed()) { - // save the current slide - auto current_slide = slides->$deck->current; - // load the new one - auto new_slides = load_slides(options.deck_file, backend); - - if(new_slides) { - new_slides->set_slide(current_slide); - slides = new_slides; - } - } + app->init(); + + while(app->open()) { + app->update(); + app->render(); } } diff --git a/src/slides_ui.cpp b/src/slides_ui.cpp index 3562641..811936e 100644 --- a/src/slides_ui.cpp +++ b/src/slides_ui.cpp @@ -238,6 +238,12 @@ void SlidesUI::mouse(float x, float y, guecs::Modifiers mods) { } } +void SlidesUI::update(sf::RenderWindow& presenter) { + while(const auto event = presenter.pollEvent()) { + if(event) handle_events(presenter, *event); + } +} + void SlidesUI::handle_events(sf::RenderWindow& presenter, const sf::Event& event) { if(const auto* mev = event.getIf()) { sf::Vector2f pos = presenter.mapPixelToCoords(mev->position); diff --git a/src/slides_ui.hpp b/src/slides_ui.hpp index ba3127f..f1150bb 100644 --- a/src/slides_ui.hpp +++ b/src/slides_ui.hpp @@ -63,6 +63,7 @@ struct SlidesUI { void render(sf::RenderTarget& window); void mouse(float x, float y, guecs::Modifiers mods); void set_text(const std::string& name); + void update(sf::RenderWindow& presenter); void handle_events(sf::RenderWindow& presenter, const sf::Event& event); void configure_layouts(); };