|
|
|
@ -11,12 +11,12 @@ |
|
|
|
|
#include <fstream> |
|
|
|
|
#include <iostream> |
|
|
|
|
|
|
|
|
|
int WINDOW_WIDTH=1280; |
|
|
|
|
int WINDOW_HEIGHT=720; |
|
|
|
|
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=84; |
|
|
|
|
constexpr const int CONTENT_SIZE=56; |
|
|
|
|
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; |
|
|
|
@ -49,13 +49,13 @@ struct Slide { |
|
|
|
|
"[_|_|_]"); |
|
|
|
|
|
|
|
|
|
auto title = $gui.entity("title"); |
|
|
|
|
$gui.set<guecs::Text>(title, { |
|
|
|
|
$title, TITLE_SIZE}); |
|
|
|
|
$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}); |
|
|
|
|
CONTENT_SIZE, |
|
|
|
|
guecs::THEME.TEXT_COLOR, 20}); |
|
|
|
|
|
|
|
|
|
$gui.init(); |
|
|
|
|
} |
|
|
|
@ -158,6 +158,45 @@ struct SlidesUI { |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
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>(); |
|
|
|
@ -209,32 +248,37 @@ shared_ptr<SlideDeck> parse_slides(const string& md_file) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[]) { |
|
|
|
|
|
|
|
|
|
dbc::check(argc == 2, "USAGE: besos my_fucking_slides.md"); |
|
|
|
|
dbc::check(argc >= 2, "USAGE: besos <monitor_count> my_fucking_slides.md"); |
|
|
|
|
|
|
|
|
|
sfml::Backend backend; |
|
|
|
|
guecs::init(&backend); |
|
|
|
|
|
|
|
|
|
auto& modes = sf::VideoMode::getFullscreenModes(); |
|
|
|
|
WINDOW_WIDTH = modes[1].size.x; |
|
|
|
|
WINDOW_HEIGHT = modes[1].size.y; |
|
|
|
|
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; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
sf::RenderWindow controller(sf::VideoMode({400,400}), "Besos Loves Control"); |
|
|
|
|
|
|
|
|
|
sf::RenderWindow window(modes[1], "Besos Loves Slides", sf::Style::None); |
|
|
|
|
window.setFramerateLimit(FRAME_LIMIT); |
|
|
|
|
window.setVerticalSyncEnabled(VSYNC); |
|
|
|
|
sf::RenderWindow presenter(*screen_mode, |
|
|
|
|
"Besos Loves Slides", sf::Style::None, sf::State::Windowed); |
|
|
|
|
|
|
|
|
|
presenter.setFramerateLimit(FRAME_LIMIT); |
|
|
|
|
presenter.setVerticalSyncEnabled(VSYNC); |
|
|
|
|
|
|
|
|
|
int monitor_count = argc == 3 ? atoi(argv[1]) : 1; |
|
|
|
|
auto data = argc == 3 ? parse_slides(argv[2]) : parse_slides(argv[1]); |
|
|
|
|
|
|
|
|
|
auto data = parse_slides(argv[1]); |
|
|
|
|
SlidesUI slides(data); |
|
|
|
|
slides.init(); |
|
|
|
|
|
|
|
|
|
while(window.isOpen()) { |
|
|
|
|
while (const auto event = window.pollEvent()) { |
|
|
|
|
if(event->is<sf::Event::Closed>()) { |
|
|
|
|
window.close(); |
|
|
|
|
} |
|
|
|
|
ControlUI control_ui(presenter); |
|
|
|
|
control_ui.init(); |
|
|
|
|
|
|
|
|
|
while(controller.isOpen()) { |
|
|
|
|
while (const auto event = presenter.pollEvent()) { |
|
|
|
|
if(const auto* mouse = event->getIf<sf::Event::MouseButtonPressed>()) { |
|
|
|
|
sf::Vector2f pos = window.mapPixelToCoords(mouse->position); |
|
|
|
|
sf::Vector2f pos = presenter.mapPixelToCoords(mouse->position); |
|
|
|
|
|
|
|
|
|
if(mouse->button == sf::Mouse::Button::Left) { |
|
|
|
|
slides.mouse(pos.x, pos.y, {1 << guecs::ModBit::left}); |
|
|
|
@ -244,7 +288,41 @@ int main(int argc, char *argv[]) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
slides.render(window); |
|
|
|
|
window.display(); |
|
|
|
|
while (const auto event = controller.pollEvent()) { |
|
|
|
|
if(event->is<sf::Event::Closed>()) { |
|
|
|
|
controller.close(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(const auto* key = event->getIf<sf::Event::KeyPressed>()) { |
|
|
|
|
auto pos = presenter.getPosition(); |
|
|
|
|
auto size = presenter.getSize(); |
|
|
|
|
|
|
|
|
|
using KEY = sf::Keyboard::Scan; |
|
|
|
|
switch(key->scancode) { |
|
|
|
|
case KEY::A: |
|
|
|
|
if(true) { |
|
|
|
|
pos.x -= size.x; |
|
|
|
|
presenter.setPosition(pos); |
|
|
|
|
} break; |
|
|
|
|
case KEY::D: |
|
|
|
|
if(pos.x < int(size.x) * monitor_count) { |
|
|
|
|
pos.x += int(size.x); |
|
|
|
|
presenter.setPosition(pos); |
|
|
|
|
} break; |
|
|
|
|
case KEY::Q: |
|
|
|
|
controller.close(); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fmt::println("window pos: {},{}", pos.x, pos.y); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
slides.render(presenter); |
|
|
|
|
control_ui.render(controller); |
|
|
|
|
presenter.display(); |
|
|
|
|
controller.display(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|