App and options are now in their own files for better handling.

master
Zed A. Shaw 3 weeks ago
parent 6a6382ec74
commit e33d989b9e
  1. 2
      meson.build
  2. 72
      src/app.cpp
  3. 27
      src/app.hpp
  4. 139
      src/main.cpp
  5. 38
      src/options.cpp
  6. 17
      src/options.hpp

@ -97,6 +97,8 @@ sources = [
'src/backend.cpp', 'src/backend.cpp',
'src/control.cpp', 'src/control.cpp',
'src/changes.cpp', 'src/changes.cpp',
'src/options.cpp',
'src/app.cpp',
] ]
tests = [ tests = [

@ -0,0 +1,72 @@
#include "app.hpp"
#include <fmt/xchar.h>
#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<ControlUI>(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<SlidesUI> 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<SlidesUI>(deck, options.pres_size);
slides->init();
return slides;
} catch(...) {
fmt::println("ERROR!");
return nullptr;
}
}

@ -0,0 +1,27 @@
#pragma once
#include "backend.hpp"
#include "constants.hpp"
#include "slides_ui.hpp"
#include "control_ui.hpp"
#include <memory>
#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<ControlUI> control_ui = nullptr;
std::shared_ptr<SlidesUI> slides = nullptr;
ChangeDetector reloader{};
void init();
void change_slides();
void update();
void render();
bool open();
std::shared_ptr<SlidesUI> load_slides();
};

@ -1,140 +1,6 @@
#include "backend.hpp" #include "options.hpp"
#include "guecs/ui.hpp" #include "app.hpp"
#include <fmt/xchar.h>
#include "dbc.hpp"
#include "constants.hpp"
#include "slides_ui.hpp"
#include "control_ui.hpp"
#include "parser.hpp"
#include <memory> #include <memory>
#include <unistd.h>
#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<ControlUI> control_ui = nullptr;
std::shared_ptr<SlidesUI> 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<ControlUI>(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<SlidesUI> 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<SlidesUI>(deck, options.pres_size);
slides->init();
return slides;
} catch(...) {
fmt::println("ERROR!");
return nullptr;
}
}
};
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
auto options = parse_options(argc, argv); auto options = parse_options(argc, argv);
@ -146,7 +12,6 @@ int main(int argc, char *argv[]) {
} }
auto app = std::make_shared<App>(options); auto app = std::make_shared<App>(options);
app->init(); app->init();
while(app->open()) { while(app->open()) {

@ -0,0 +1,38 @@
#include "options.hpp"
#include <fmt/core.h>
#include <unistd.h>
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;
}

@ -0,0 +1,17 @@
#pragma once
#include <SFML/System/Vector2.hpp>
#include <string>
#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[]);
Loading…
Cancel
Save