2021-08-06 14:22:56 +02:00
|
|
|
#ifndef BWIDGETS_EXAMPLES_EXAMPLE_WIDGET
|
|
|
|
#define BWIDGETS_EXAMPLES_EXAMPLE_WIDGET
|
2021-07-26 22:57:28 +02:00
|
|
|
|
2021-08-12 16:30:00 +02:00
|
|
|
#include <chrono>
|
2021-07-26 22:57:28 +02:00
|
|
|
|
|
|
|
#include <basic_widgets/core/math.hpp>
|
|
|
|
#include <basic_widgets/core/renderer.hpp>
|
2021-08-17 00:27:51 +02:00
|
|
|
#include <basic_widgets/w/base/widget_impl.hpp>
|
2021-07-26 22:57:28 +02:00
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
using bwidgets::Color;
|
|
|
|
using bwidgets::rect_margin;
|
|
|
|
using bwidgets::Size;
|
2021-08-17 00:27:51 +02:00
|
|
|
using bwidgets::WidgetImpl;
|
2021-07-26 22:57:28 +02:00
|
|
|
|
2021-08-17 00:27:51 +02:00
|
|
|
class Example final : public WidgetImpl
|
2021-07-26 22:57:28 +02:00
|
|
|
{
|
2021-07-30 20:41:47 +02:00
|
|
|
void _handle_geometry_change(const SDL_Rect& vp) noexcept override
|
2021-07-26 22:57:28 +02:00
|
|
|
{
|
|
|
|
_widget_area = {2, 2, vp.w - 4, vp.h - 4};
|
|
|
|
}
|
|
|
|
|
2021-07-30 20:41:47 +02:00
|
|
|
void _handle_rendering() override
|
2021-07-26 22:57:28 +02:00
|
|
|
{
|
2021-08-14 09:25:28 +02:00
|
|
|
const auto now = std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
|
|
std::chrono::steady_clock::now().time_since_epoch())
|
|
|
|
.count();
|
|
|
|
const uint8_t r = 255 * (now % cycle_r / (float)cycle_r); // NOLINT
|
|
|
|
const uint8_t g = 255 * (now % cycle_g / (float)cycle_g); // NOLINT
|
|
|
|
const uint8_t b = 255 * (now % cycle_b / (float)cycle_b); // NOLINT
|
2021-08-19 15:00:44 +02:00
|
|
|
const Color base_color {r, g, b, SDL_ALPHA_OPAQUE};
|
2021-08-06 14:22:56 +02:00
|
|
|
|
|
|
|
const int border = 10;
|
2021-07-29 16:06:03 +02:00
|
|
|
for (auto i = 0; i < border; i += 3) {
|
2021-08-06 14:22:56 +02:00
|
|
|
uint8_t alpha = 255 * i / border; // NOLINT(readability-magic-numbers)
|
|
|
|
_renderer
|
|
|
|
->draw_color({
|
|
|
|
{base_color().r, base_color().g, base_color().b, alpha}
|
|
|
|
})
|
2021-07-29 16:06:03 +02:00
|
|
|
->draw_rect(rect_margin(_widget_area, {i, i}));
|
2021-07-26 22:57:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
_renderer->draw_color(base_color)
|
2021-07-29 16:06:03 +02:00
|
|
|
->draw_rect(nullptr)
|
|
|
|
->fill_rect(rect_margin(_widget_area, {border * 2, border * 2}));
|
2021-07-26 22:57:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
2021-08-06 14:22:56 +02:00
|
|
|
unsigned int cycle_r {3500}; // NOLINT(readability-magic-numbers)
|
|
|
|
unsigned int cycle_g {3500}; // NOLINT(readability-magic-numbers)
|
|
|
|
unsigned int cycle_b {3500}; // NOLINT(readability-magic-numbers)
|
2021-07-26 22:57:28 +02:00
|
|
|
|
2021-08-17 00:27:51 +02:00
|
|
|
using WidgetImpl::WidgetImpl;
|
2021-08-12 23:50:22 +02:00
|
|
|
|
2021-07-30 20:41:47 +02:00
|
|
|
[[nodiscard]] auto size() const noexcept -> Size override
|
2021-07-26 22:57:28 +02:00
|
|
|
{
|
2021-08-06 14:22:56 +02:00
|
|
|
return {128, 64}; // NOLINT(readability-magic-numbers)
|
2021-07-26 22:57:28 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|