From 1ccb14a77bb05711e75a11841b0819a2f043926d Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 7 May 2026 18:45:12 -0400 Subject: [PATCH] Make it possible to set the font in the deck meta. --- assets/layouts.json | 2 +- src/app.cpp | 21 ++++++++------------ src/slides_ui.cpp | 48 +++++++++++++++++++++++++-------------------- src/slides_ui.hpp | 3 ++- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/assets/layouts.json b/assets/layouts.json index a29f1b0..99b715c 100644 --- a/assets/layouts.json +++ b/assets/layouts.json @@ -10,7 +10,7 @@ "[=title|=*%(200,100)description|_|_|_]" ], "default_slide": [ - "[=*%(300,200)title|_|_|_|_]", + "[*%(300,200)title|_|_|_|_]", "[_|_|_]", "[*%(300,600)content|_|_|*%(200,600)image|_]", "[_|_|_|_|_]", diff --git a/src/app.cpp b/src/app.cpp index 0db7804..d5e6bd9 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -53,20 +53,15 @@ bool App::open() { } 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); - }); + 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); + fmt::println("FONT FILE: {}", backend.$font_file); - auto slides = std::make_shared(deck, options.pres_size); - slides->init(); + auto slides = std::make_shared(deck, options.pres_size); + slides->init(); - return slides; - } catch(...) { - fmt::println("ERROR!"); - return nullptr; - } + return slides; } diff --git a/src/slides_ui.cpp b/src/slides_ui.cpp index 811936e..8889f5d 100644 --- a/src/slides_ui.cpp +++ b/src/slides_ui.cpp @@ -57,7 +57,7 @@ void Slide::init(lel::Cell& cell, const std::string& layout) { } } -void Slide::config_text(guecs::Text &result, nlohmann::json& config, std::string prefix) { +void Slide::config_text(guecs::Text &result, nlohmann::json& config, const std::string& prefix) { if(config.contains(prefix + "_size")) result.size = config[prefix + "_size"]; if(config.contains(prefix + "_color")) { @@ -163,34 +163,42 @@ void SlidesUI::set_slide(size_t index) { show_slide(); } +auto optional_config(const std::string& name, json& config_a, json& config_b) { + if(config_a.contains(name)) { + return config_a[name]; + } else { + return config_b[name]; + } +} + +bool SlidesUI::has_optional(const std::string& name, json& slide_config) { + return slide_config.contains(name) || $deck->config.contains(name); +} + void SlidesUI::show_slide() { - // THIS NEEDS TO BE DONE FOR ALL SLIDES OR CONTROL CAN'T SHOW NEXT SLIDE - // MOVE TO DECK auto& slide = $deck->current_slide(); // kind of have to set the background for the whole UI using the slide config auto& bg = $gui.get($gui.MAIN); - sf::Color color = guecs::THEME.FILL_COLOR; - if(slide.$config.contains("bg_image")) { - bg.set_sprite(slide.$config["bg_image"], true); - } else if($deck->config.contains("bg_image")) { - bg.set_sprite($deck->config["bg_image"], true); + if(has_optional("bg_image", slide.$config)) { + bg.set_sprite(optional_config("bg_image", slide.$config, $deck->config), true); } else { bg.sprite = nullptr; bg.texture = nullptr; } - if(slide.$config.contains("bg_color")) { - auto color_conf = slide.$config["bg_color"]; - color = {color_conf[0], color_conf[1], color_conf[2], color_conf[3]}; - } else if($deck->config.contains("bg_color")) { - auto color_conf = $deck->config["bg_color"]; - color = {color_conf[0], color_conf[1], color_conf[2], color_conf[3]}; + if(has_optional("bg_color", slide.$config)) { + auto color_conf = optional_config("bg_color", slide.$config, $deck->config); + bg.set_color({color_conf[0], color_conf[1], color_conf[2], color_conf[3]}); + } else { + bg.set_color(guecs::THEME.FILL_COLOR); } - if(slide.$config.contains("shader")) { - slide.$shader = shaders::get(slide.$config["shader"]); + bg.init(); + + if(has_optional("shader", slide.$config)) { + slide.$shader = shaders::get(optional_config("shader", slide.$config, $deck->config)); slide.$shader->setUniform("u_resolution", sf::Vector2f{WINDOW_WIDTH, WINDOW_HEIGHT}); } else { slide.$shader = nullptr; @@ -198,21 +206,19 @@ void SlidesUI::show_slide() { std::string layout_name{"default_slide"}; - if(slide.$config.contains("layout")) { - layout_name = slide.$config["layout"]; + if(has_optional("layout", slide.$config)) { + layout_name = optional_config("layout", slide.$config, $deck->config); } auto& layout = $layouts[layout_name]; - bg.set_color(color); - bg.init(); - auto& cell = $gui.cell_for("slide"); slide.init(cell, layout); } void SlidesUI::render(sf::RenderTarget& window) { + window.clear(); $gui.render($view_texture); auto& slide = $deck->current_slide(); slide.render($view_texture); diff --git a/src/slides_ui.hpp b/src/slides_ui.hpp index f1150bb..80cb40e 100644 --- a/src/slides_ui.hpp +++ b/src/slides_ui.hpp @@ -25,7 +25,7 @@ struct Slide { void init(lel::Cell& cell, const std::string& layout); void render(sf::RenderTarget& view); - void config_text(guecs::Text &result, nlohmann::json& config, std::string prefix); + void config_text(guecs::Text &result, nlohmann::json& deck_config, const std::string& prefix); }; using SlideSet = std::vector; @@ -66,4 +66,5 @@ struct SlidesUI { void update(sf::RenderWindow& presenter); void handle_events(sf::RenderWindow& presenter, const sf::Event& event); void configure_layouts(); + bool has_optional(const std::string& name, nlohmann::json& slide_config); };