Rework the code into separate files for further dev.

master
Zed A. Shaw 10 months ago
parent e26a937ce6
commit 8cc5973f71
  1. 10
      constants.hpp
  2. 46
      control.cpp
  3. 14
      control.hpp
  4. 248
      main.cpp
  5. 3
      meson.build
  6. 59
      parser.cpp
  7. 6
      parser.hpp
  8. 132
      slides.cpp
  9. 37
      slides.hpp

@ -0,0 +1,10 @@
#pragma once
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=124;
constexpr const int CONTENT_SIZE=94;
constexpr const int CONTROL_WIDTH=400;
constexpr const int CONTROL_HEIGHT=400;

@ -0,0 +1,46 @@
#include "guecs/sfml/components.hpp"
#include "guecs/ui.hpp"
#include <fmt/xchar.h>
#include <deque>
#include <iostream>
#include <nlohmann/json.hpp>
#include "dbc.hpp"
#include <memory>
#include <filesystem>
#include <fstream>
#include <iostream>
#include "constants.hpp"
#include "control.hpp"
ControlUI::ControlUI(sf::RenderWindow& presenter) :
$presenter(presenter)
{
$gui.position(0, 0, CONTROL_WIDTH, CONTROL_HEIGHT);
$gui.layout(
"[status]"
"[docs]"
);
}
void ControlUI::init() {
auto status_id = $gui.entity("status");
$gui.set<guecs::Text>(status_id, {L""});
auto docs_id = $gui.entity("docs");
$gui.set<guecs::Text>(docs_id, {L"A: win left\nD: win right\nQ: quit"});
$status = $gui.get_if<guecs::Text>(status_id);
$gui.init();
}
void ControlUI::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);
}

@ -0,0 +1,14 @@
#pragma once
#include "guecs/sfml/components.hpp"
#include "guecs/ui.hpp"
struct ControlUI {
guecs::UI $gui;
guecs::Text* $status;
sf::RenderWindow& $presenter;
ControlUI(sf::RenderWindow& presenter);
void init();
void render(sf::RenderWindow& window);
};

@ -1,251 +1,11 @@
#include "guecs/sfml/backend.hpp"
#include "guecs/sfml/components.hpp"
#include "guecs/ui.hpp"
#include <fmt/xchar.h>
#include <deque>
#include <iostream>
#include <nlohmann/json.hpp>
#include "dbc.hpp"
#include <memory>
#include <filesystem>
#include <fstream>
#include <iostream>
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=124;
constexpr const int CONTENT_SIZE=94;
using std::string, std::wstring, std::shared_ptr, std::make_shared;
using nlohmann::json;
namespace fs = std::filesystem;
struct Slide {
guecs::UI $gui;
wstring $title;
wstring $content;
json $config;
bool $initialized = false;
Slide(const string& title, const string& content, json& config) :
$title(guecs::to_wstring(title)),
$content(guecs::to_wstring(content)),
$config(config)
{
}
void init(lel::Cell& cell) {
if(!$initialized) {
$initialized = true;
$gui.position(cell.x, cell.y, cell.w, cell.h);
$gui.layout(
"[=*%(300,200)title|_|_]"
"[_|_|_]"
"[=*%(300,300)content|_|_]"
"[_|_|_]"
"[_|_|_]");
auto title = $gui.entity("title");
$gui.set<guecs::Text>(title, {$title, TITLE_SIZE});
auto content = $gui.entity("content");
$gui.set<guecs::Text>(content, {
$content,
CONTENT_SIZE,
guecs::THEME.TEXT_COLOR, 20});
$gui.init();
}
}
void render(sf::RenderWindow& window) {
$gui.render(window);
// $gui.debug_layout(window);
}
};
using SlideDeck = std::vector<Slide>;
struct SlidesUI {
guecs::UI $gui;
shared_ptr<SlideDeck> $slides = nullptr;
size_t $current = 0;
SlidesUI(shared_ptr<SlideDeck> slides) {
dbc::check(slides != nullptr, "slides is null");
dbc::check(slides->size() > 0, "slide deck is empy");
$slides = slides;
$current = 0;
$gui.position(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
$gui.layout(
"[t_left|t_center|t_right]"
"[m_left|*%(300,400)slide|_|_|m_right]"
"[_|_|_|_|_]"
"[_|_|_|_|_]"
"[_|_|_|_|_]"
"[_|_|_|_|_]"
"[b_left|b_center|b_right]"
);
}
void init() {
guecs::Background bg{$gui.$parser, };
bg.set_color(guecs::THEME.BG_COLOR_DARK);
$gui.set<guecs::Background>($gui.MAIN, bg);
show_slide();
$gui.init();
}
Slide& current() {
return $slides->at($current);
}
void next_slide() {
if($current < $slides->size() - 1) {
$current++;
show_slide();
}
}
void prev_slide() {
if($current > 0) {
$current--;
show_slide();
}
}
void show_slide() {
auto& slide = current();
auto& bg = $gui.get<guecs::Background>($gui.MAIN);
sf::Color color = guecs::THEME.FILL_COLOR;
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]};
}
bg.set_color(color);
bg.init();
auto& cell = $gui.cell_for("slide");
slide.init(cell);
}
void render(sf::RenderWindow& window) {
$gui.render(window);
auto& slide = current();
slide.render(window);
// $gui.debug_layout(window);
}
void mouse(float x, float y, guecs::Modifiers mods) {
$gui.mouse(x, y, mods);
if(mods.test(guecs::ModBit::left)) {
next_slide();
} else if(mods.test(guecs::ModBit::right)) {
prev_slide();
}
}
};
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<guecs::Text>(status_id, {L""});
auto docs_id = $gui.entity("docs");
$gui.set<guecs::Text>(docs_id, {L"A: win left\nD: win right\nQ: quit"});
$status = $gui.get_if<guecs::Text>(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<SlideDeck> parse_slides(const string& md_file) {
shared_ptr<SlideDeck> slides = make_shared<SlideDeck>();
dbc::check(fs::exists(md_file), "md file missing");
auto size = fs::file_size(md_file);
string line(size, '\0');
bool started = false;
json config;
if(std::ifstream in_file{md_file, std::ios::binary}) {
while(std::getline(in_file, line)) {
if(line == "{") {
string json_data;
do {
json_data += line;
} while (std::getline(in_file, line) && line != "}");
json_data += "}";
config = json::parse(json_data);
std::cout << "JSON: " << config << '\n';
} else if(line == "===") {
fmt::println("START");
started = true;
} else if(line == "---") {
fmt::println("START SLIDE");
} else {
if(started) {
string title = line;
string content;
while(std::getline(in_file, line) && line != "---") {
content += line + "\n";
}
slides->emplace_back(title, content, config);
config = json::parse("{}");
} else {
fmt::println("JUNK: {}", line);
}
}
}
}
return slides;
}
#include "constants.hpp"
#include "slides.hpp"
#include "control.hpp"
#include "parser.hpp"
int main(int argc, char *argv[]) {
dbc::check(argc >= 2, "USAGE: besos <monitor_count> my_fucking_slides.md");

@ -83,6 +83,9 @@ sources = [
'dbc.cpp',
'backend.cpp',
'main.cpp',
'control.cpp',
'slides.cpp',
'parser.cpp'
]
tests = [

@ -0,0 +1,59 @@
#include "parser.hpp"
#include "dbc.hpp"
#include <filesystem>
#include <fstream>
#include <iostream>
#include <nlohmann/json.hpp>
#include <memory>
using std::shared_ptr, std::string, nlohmann::json;
namespace fs = std::filesystem;
shared_ptr<SlideDeck> parse_slides(const string& md_file) {
shared_ptr<SlideDeck> slides = std::make_shared<SlideDeck>();
dbc::check(fs::exists(md_file), "md file missing");
auto size = fs::file_size(md_file);
string line(size, '\0');
bool started = false;
json config;
if(std::ifstream in_file{md_file, std::ios::binary}) {
while(std::getline(in_file, line)) {
if(line == "{") {
string json_data;
do {
json_data += line;
} while (std::getline(in_file, line) && line != "}");
json_data += "}";
config = json::parse(json_data);
std::cout << "JSON: " << config << '\n';
} else if(line == "===") {
fmt::println("START");
started = true;
} else if(line == "---") {
fmt::println("START SLIDE");
} else {
if(started) {
string title = line;
string content;
while(std::getline(in_file, line) && line != "---") {
content += line + "\n";
}
slides->emplace_back(title, content, config);
config = json::parse("{}");
} else {
fmt::println("JUNK: {}", line);
}
}
}
}
return slides;
}

@ -0,0 +1,6 @@
#pragma once
#include <memory>
#include <string>
#include "slides.hpp"
std::shared_ptr<SlideDeck> parse_slides(const std::string& md_file);

@ -0,0 +1,132 @@
#include "guecs/sfml/components.hpp"
#include "guecs/ui.hpp"
#include <fmt/xchar.h>
#include <deque>
#include <iostream>
#include <nlohmann/json.hpp>
#include "dbc.hpp"
#include <memory>
#include "constants.hpp"
#include "slides.hpp"
using std::string, std::wstring, std::shared_ptr, std::make_shared;
using nlohmann::json;
Slide::Slide(const string& title, const string& content, json& config) :
$title(guecs::to_wstring(title)),
$content(guecs::to_wstring(content)),
$config(config)
{
}
void Slide::init(lel::Cell& cell) {
if(!$initialized) {
$initialized = true;
$gui.position(cell.x, cell.y, cell.w, cell.h);
$gui.layout(
"[=*%(300,200)title|_|_]"
"[_|_|_]"
"[=*%(300,300)content|_|_]"
"[_|_|_]"
"[_|_|_]");
auto title = $gui.entity("title");
$gui.set<guecs::Text>(title, {$title, TITLE_SIZE});
auto content = $gui.entity("content");
$gui.set<guecs::Text>(content, {
$content,
CONTENT_SIZE,
guecs::THEME.TEXT_COLOR, 20});
$gui.init();
}
}
void Slide::render(sf::RenderWindow& window) {
$gui.render(window);
// $gui.debug_layout(window);
}
SlidesUI::SlidesUI(shared_ptr<SlideDeck> slides) {
dbc::check(slides != nullptr, "slides is null");
dbc::check(slides->size() > 0, "slide deck is empy");
$slides = slides;
$current = 0;
$gui.position(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
$gui.layout(
"[t_left|t_center|t_right]"
"[m_left|*%(300,400)slide|_|_|m_right]"
"[_|_|_|_|_]"
"[_|_|_|_|_]"
"[_|_|_|_|_]"
"[_|_|_|_|_]"
"[b_left|b_center|b_right]"
);
}
void SlidesUI::init() {
guecs::Background bg{$gui.$parser, };
bg.set_color(guecs::THEME.BG_COLOR_DARK);
$gui.set<guecs::Background>($gui.MAIN, bg);
show_slide();
$gui.init();
}
Slide& SlidesUI::current() {
return $slides->at($current);
}
void SlidesUI::next_slide() {
if($current < $slides->size() - 1) {
$current++;
show_slide();
}
}
void SlidesUI::prev_slide() {
if($current > 0) {
$current--;
show_slide();
}
}
void SlidesUI::show_slide() {
auto& slide = current();
auto& bg = $gui.get<guecs::Background>($gui.MAIN);
sf::Color color = guecs::THEME.FILL_COLOR;
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]};
}
bg.set_color(color);
bg.init();
auto& cell = $gui.cell_for("slide");
slide.init(cell);
}
void SlidesUI::render(sf::RenderWindow& window) {
$gui.render(window);
auto& slide = current();
slide.render(window);
// $gui.debug_layout(window);
}
void SlidesUI::mouse(float x, float y, guecs::Modifiers mods) {
$gui.mouse(x, y, mods);
if(mods.test(guecs::ModBit::left)) {
next_slide();
} else if(mods.test(guecs::ModBit::right)) {
prev_slide();
}
}

@ -0,0 +1,37 @@
#pragma once
#include "guecs/sfml/backend.hpp"
#include "guecs/sfml/components.hpp"
#include "guecs/ui.hpp"
#include <nlohmann/json.hpp>
#include <memory>
struct Slide {
guecs::UI $gui;
std::wstring $title;
std::wstring $content;
nlohmann::json $config;
bool $initialized = false;
Slide(const std::string& title, const std::string& content, nlohmann::json& config);
void init(lel::Cell& cell);
void render(sf::RenderWindow& window);
};
using SlideDeck = std::vector<Slide>;
struct SlidesUI {
guecs::UI $gui;
std::shared_ptr<SlideDeck> $slides = nullptr;
size_t $current = 0;
SlidesUI(std::shared_ptr<SlideDeck> slides);
void init();
Slide& current();
void next_slide();
void prev_slide();
void show_slide();
void render(sf::RenderWindow& window);
void mouse(float x, float y, guecs::Modifiers mods);
};
Loading…
Cancel
Save