2021-07-23 20:08:52 +02:00
|
|
|
#include <SDL2/SDL_assert.h>
|
2021-07-10 19:55:53 +02:00
|
|
|
#include <SDL2/SDL_events.h>
|
|
|
|
|
2021-07-29 16:06:03 +02:00
|
|
|
#include <basic_widgets/w/base/widget.hpp>
|
2021-07-18 18:26:12 +02:00
|
|
|
#include <basic_widgets/w/feat/keyboard_handler.hpp>
|
|
|
|
#include <basic_widgets/w/feat/mouse_handler.hpp>
|
2021-06-08 14:30:38 +02:00
|
|
|
|
2021-07-10 19:55:53 +02:00
|
|
|
using namespace bwidgets;
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Widget::handle_event(const SDL_Event& ev) -> Widget*
|
2021-06-08 14:30:38 +02:00
|
|
|
{
|
2021-08-06 14:22:56 +02:00
|
|
|
if (auto* handler = dynamic_cast<KeyboardHandler*>(this); handler) {
|
2021-07-29 16:06:03 +02:00
|
|
|
switch (ev.type) {
|
2021-07-10 19:55:53 +02:00
|
|
|
case SDL_KEYDOWN:
|
|
|
|
case SDL_KEYUP:
|
|
|
|
handler->handle_keyboard(ev.key);
|
|
|
|
break;
|
|
|
|
case SDL_TEXTINPUT:
|
|
|
|
handler->handle_keyboard(ev.text);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
if (auto* handler = dynamic_cast<MouseHandler*>(this); handler) {
|
2021-07-29 16:06:03 +02:00
|
|
|
switch (ev.type) {
|
2021-07-10 19:55:53 +02:00
|
|
|
case SDL_MOUSEBUTTONDOWN:
|
|
|
|
case SDL_MOUSEBUTTONUP:
|
|
|
|
handler->handle_mouse(ev.button, _viewport);
|
|
|
|
break;
|
|
|
|
case SDL_MOUSEMOTION:
|
|
|
|
handler->handle_mouse(ev.motion, _viewport);
|
|
|
|
break;
|
|
|
|
}
|
2021-06-08 14:30:38 +02:00
|
|
|
}
|
2021-07-19 23:50:50 +02:00
|
|
|
|
|
|
|
return this;
|
2021-06-08 14:30:38 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Widget::render() -> Widget*
|
2021-06-08 14:30:38 +02:00
|
|
|
{
|
2021-07-30 20:41:47 +02:00
|
|
|
if (_renderer == nullptr) return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-08-14 12:05:24 +02:00
|
|
|
#ifdef BWIDGETS_DEBUG
|
2021-08-06 14:22:56 +02:00
|
|
|
_renderer
|
|
|
|
->draw_color({
|
|
|
|
// NOLINTNEXTLINE(readability-magic-numbers)
|
2021-08-14 12:05:24 +02:00
|
|
|
{0, 255, 0, SDL_ALPHA_OPAQUE}
|
2021-08-06 14:22:56 +02:00
|
|
|
})
|
|
|
|
->draw_rect(nullptr);
|
2021-07-19 23:50:50 +02:00
|
|
|
#endif
|
2021-07-16 17:18:13 +02:00
|
|
|
|
|
|
|
_renderer->viewport(_viewport);
|
|
|
|
_handle_rendering();
|
2021-07-19 23:50:50 +02:00
|
|
|
|
|
|
|
return this;
|
2021-06-08 14:30:38 +02:00
|
|
|
}
|
2021-08-06 14:22:56 +02:00
|
|
|
|
2021-08-12 23:27:09 +02:00
|
|
|
auto Widget::renderer(std::shared_ptr<Renderer> r) -> Widget*
|
2021-08-06 14:22:56 +02:00
|
|
|
{
|
|
|
|
if (r != _renderer) {
|
|
|
|
_handle_renderer_change(r);
|
|
|
|
_renderer = r;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2021-08-08 16:00:22 +02:00
|
|
|
auto Widget::viewport(const SDL_Rect& vp) -> Widget*
|
2021-08-06 14:22:56 +02:00
|
|
|
{
|
|
|
|
_handle_geometry_change(vp);
|
|
|
|
_viewport = vp;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2021-08-08 16:00:22 +02:00
|
|
|
auto Widget::viewport() const -> const SDL_Rect&
|
2021-08-06 14:22:56 +02:00
|
|
|
{
|
|
|
|
return _viewport;
|
|
|
|
}
|