bwidgets/examples/run.hpp

86 lines
2.9 KiB
C++
Raw Normal View History

2021-08-06 14:22:56 +02:00
#ifndef BWIDGETS_EXAMPLES_RUN_HPP
#define BWIDGETS_EXAMPLES_RUN_HPP
2021-07-20 12:12:29 +02:00
#include <functional>
#include <iostream>
#include <basic_widgets/core/type/deleter.hpp>
#include <basic_widgets/w/widget_factory.hpp>
2021-07-20 12:12:29 +02:00
template<typename T>
2021-08-06 14:22:56 +02:00
concept WidgetType = std::derived_from<T, bwidgets::Widget>;
2021-07-20 12:12:29 +02:00
template<WidgetType W>
2021-08-10 23:48:19 +02:00
void run_example(
std::function<std::unique_ptr<W>()> factory,
2021-08-14 16:37:02 +02:00
std::function<void(W*, const std::shared_ptr<bwidgets::Font>, int, int)> setup,
2021-08-10 23:48:19 +02:00
int w = 3, int h = 3)
2021-07-20 12:12:29 +02:00
{
std::atexit([]() {
TTF_Quit();
SDL_Quit();
});
try {
2021-08-13 22:00:42 +02:00
bwidgets::success_or_throw<bwidgets::SDLError>(SDL_Init(SDL_INIT_VIDEO));
bwidgets::success_or_throw<bwidgets::SDLError>(TTF_Init());
2021-08-06 14:22:56 +02:00
const bwidgets::Size size_init {854, 480};
2021-08-10 23:48:19 +02:00
auto font =
std::make_shared<bwidgets::Font>(bwidgets::Font::find("Monospace"),
16); // NOLINT(readability-magic-numbers)
auto win = std::unique_ptr<SDL_Window, bwidgets::Deleter>(
2021-08-13 22:00:42 +02:00
bwidgets::ptr_or_throw<bwidgets::SDLError>(SDL_CreateWindow(
"basic_widgets example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
size_init.w, size_init.h,
SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_UTILITY)));
2021-08-10 23:48:19 +02:00
auto renderer =
std::make_shared<bwidgets::Renderer>(win.get(), -1, SDL_RENDERER_ACCELERATED);
renderer->blend_mode(SDL_BLENDMODE_BLEND);
2021-07-20 12:12:29 +02:00
auto layout = bwidgets::create_horizontal_layout();
for (auto x = 0; x < w; x++) {
auto col = bwidgets::create_vertical_layout();
for (auto y = 0; y < h; y++) {
auto widget = factory();
2021-08-12 23:17:00 +02:00
setup(widget.get(), font, x, y);
col->add_widget(std::move(widget));
2021-07-20 12:12:29 +02:00
}
layout->add_widget(std::move(col));
2021-07-20 12:12:29 +02:00
}
layout->renderer(renderer);
layout->viewport({0, 0, size_init.w, size_init.h});
2021-07-20 12:12:29 +02:00
bool quit {false};
while (!quit) {
2021-07-20 12:12:29 +02:00
SDL_Event ev;
while (SDL_PollEvent(&ev) != 0) {
switch (ev.type) {
2021-07-20 12:12:29 +02:00
case SDL_QUIT:
quit = true;
break;
case SDL_WINDOWEVENT:
if (ev.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
2021-08-08 14:30:56 +02:00
const auto size = renderer->output_size();
layout->viewport({0, 0, size.w, size.h});
2021-07-20 12:12:29 +02:00
}
break;
}
layout->handle_event(ev);
2021-07-20 12:12:29 +02:00
}
2021-08-06 14:22:56 +02:00
// NOLINTNEXTLINE(readability-magic-numbers)
renderer->draw_color({50, 60, 70, SDL_ALPHA_OPAQUE});
2021-07-20 12:12:29 +02:00
renderer->clear();
layout->render();
2021-07-20 12:12:29 +02:00
renderer->present();
}
2021-08-14 10:18:31 +02:00
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
2021-07-20 12:12:29 +02:00
}
}
#endif