From e33d989b9e6ff376d075be8d32fd9bdd75acbfbd Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 4 May 2026 00:43:50 -0400 Subject: [PATCH] App and options are now in their own files for better handling. --- meson.build | 2 + src/app.cpp | 72 +++++++++++++++++++++++++ src/app.hpp | 27 ++++++++++ src/main.cpp | 139 +----------------------------------------------- src/options.cpp | 38 +++++++++++++ src/options.hpp | 17 ++++++ 6 files changed, 158 insertions(+), 137 deletions(-) create mode 100644 src/app.cpp create mode 100644 src/app.hpp create mode 100644 src/options.cpp create mode 100644 src/options.hpp diff --git a/meson.build b/meson.build index 97e3b08..fb1ed54 100644 --- a/meson.build +++ b/meson.build @@ -97,6 +97,8 @@ sources = [ 'src/backend.cpp', 'src/control.cpp', 'src/changes.cpp', + 'src/options.cpp', + 'src/app.cpp', ] tests = [ diff --git a/src/app.cpp b/src/app.cpp new file mode 100644 index 0000000..0db7804 --- /dev/null +++ b/src/app.cpp @@ -0,0 +1,72 @@ +#include "app.hpp" +#include +#include "parser.hpp" +#include "dbc.hpp" + +void App::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"]); +} + +void App::change_slides() { + // save the current slide + auto current_slide = slides->$deck->current; + // load the new one + auto new_slides = load_slides(); + + if(new_slides) { + new_slides->set_slide(current_slide); + slides = new_slides; + } +} + +void App::update() { + if(reloader.changed()) { + change_slides(); + } + + slides->update(presenter); + control_ui->update(slides); +} + +void App::render() { + slides->render(presenter); + control_ui->render(controller, *slides->$deck); + + presenter.display(); + controller.display(); +} + +bool App::open() { + return controller.isOpen(); +} + +std::shared_ptr App::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); + + auto slides = std::make_shared(deck, options.pres_size); + slides->init(); + + return slides; + } catch(...) { + fmt::println("ERROR!"); + return nullptr; + } +} diff --git a/src/app.hpp b/src/app.hpp new file mode 100644 index 0000000..53b4140 --- /dev/null +++ b/src/app.hpp @@ -0,0 +1,27 @@ +#pragma once +#include "backend.hpp" +#include "constants.hpp" +#include "slides_ui.hpp" +#include "control_ui.hpp" +#include +#include "changes.hpp" +#include "options.hpp" + +struct App { + Options options; + gui::Backend backend{}; + sf::RenderWindow presenter{sf::VideoMode(options.pres_size), + "Bezos Loves Slides", sf::Style::None, sf::State::Windowed}; + + sf::RenderWindow controller{sf::VideoMode(options.control_size), "Bezos Loves Control"}; + std::shared_ptr control_ui = nullptr; + std::shared_ptr slides = nullptr; + ChangeDetector reloader{}; + + void init(); + void change_slides(); + void update(); + void render(); + bool open(); + std::shared_ptr load_slides(); +}; diff --git a/src/main.cpp b/src/main.cpp index 0e66176..ffa8317 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,140 +1,6 @@ -#include "backend.hpp" -#include "guecs/ui.hpp" -#include -#include "dbc.hpp" -#include "constants.hpp" -#include "slides_ui.hpp" -#include "control_ui.hpp" -#include "parser.hpp" +#include "options.hpp" +#include "app.hpp" #include -#include -#include "changes.hpp" - -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; -}; - -void print_usage() { - fmt::println("USAGE: bezos [-p PORT] [-h] -d deck.md"); -} - -Options parse_options(int argc, char* argv[]) { - int opt = 0; - Options result; - - while((opt = getopt(argc, argv, "hp:d:")) != -1) { - switch(opt) { - case 'h': - print_usage(); - return {.help=true}; - break; - case 'p': - result.port = std::stoi(optarg); - break; - case 'd': - result.deck_given=true; - result.deck_file = optarg; - break; - default: - print_usage(); - return {.error=true}; - } - } - - if(!result.deck_given) { - print_usage(); - result.error = true; - } - - 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}; - - sf::RenderWindow controller{sf::VideoMode(options.control_size), "Bezos Loves Control"}; - std::shared_ptr control_ui = nullptr; - std::shared_ptr slides = nullptr; - ChangeDetector reloader{}; - - 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"]); - } - - void change_slides() { - // save the current slide - auto current_slide = slides->$deck->current; - // load the new one - auto new_slides = load_slides(); - - if(new_slides) { - new_slides->set_slide(current_slide); - slides = new_slides; - } - } - - void update() { - if(reloader.changed()) { - change_slides(); - } - - slides->update(presenter); - control_ui->update(slides); - } - - void render() { - slides->render(presenter); - control_ui->render(controller, *slides->$deck); - - presenter.display(); - controller.display(); - } - - bool open() { - return controller.isOpen(); - } - - 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); - - auto slides = std::make_shared(deck, options.pres_size); - slides->init(); - - return slides; - } catch(...) { - fmt::println("ERROR!"); - return nullptr; - } - } -}; int main(int argc, char *argv[]) { auto options = parse_options(argc, argv); @@ -146,7 +12,6 @@ int main(int argc, char *argv[]) { } auto app = std::make_shared(options); - app->init(); while(app->open()) { diff --git a/src/options.cpp b/src/options.cpp new file mode 100644 index 0000000..e70335e --- /dev/null +++ b/src/options.cpp @@ -0,0 +1,38 @@ +#include "options.hpp" +#include +#include + +void print_usage() { + fmt::println("USAGE: bezos [-p PORT] [-h] -d deck.md"); +} + +Options parse_options(int argc, char* argv[]) { + int opt = 0; + Options result; + + while((opt = getopt(argc, argv, "hp:d:")) != -1) { + switch(opt) { + case 'h': + print_usage(); + return {.help=true}; + break; + case 'p': + result.port = std::stoi(optarg); + break; + case 'd': + result.deck_given=true; + result.deck_file = optarg; + break; + default: + print_usage(); + return {.error=true}; + } + } + + if(!result.deck_given) { + print_usage(); + result.error = true; + } + + return result; +} diff --git a/src/options.hpp b/src/options.hpp new file mode 100644 index 0000000..bd0d7ac --- /dev/null +++ b/src/options.hpp @@ -0,0 +1,17 @@ +#pragma once +#include +#include +#include "constants.hpp" + +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; +}; + +void print_usage(); +Options parse_options(int argc, char* argv[]);