bwidgets/src/w/base/widget.cpp

78 lines
1.7 KiB
C++
Raw Normal View History

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>
#include <basic_widgets/w/base/widget.hpp>
#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) {
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) {
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
{
if (_renderer == nullptr) return this;
2021-07-16 17:18:13 +02:00
2021-08-06 14:22:56 +02:00
#ifndef _NDEBUG
_renderer
->draw_color({
// NOLINTNEXTLINE(readability-magic-numbers)
{0, 255, 0, SDL_ALPHA_TRANSPARENT}
})
->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
auto Widget::renderer(Renderer* r) -> Widget*
{
if (r != _renderer) {
_handle_renderer_change(r);
_renderer = r;
}
return this;
}
auto Widget::viewport(const SDL_Rect& vp) noexcept -> Widget*
{
_handle_geometry_change(vp);
_viewport = vp;
return this;
}
auto Widget::viewport() const noexcept -> const SDL_Rect&
{
return _viewport;
}