bwidgets/inc/basic_widgets/abstract/widget.hpp

58 lines
1.6 KiB
C++
Raw Normal View History

2021-06-03 19:14:02 +02:00
#ifndef WIDGET_HPP
#define WIDGET_HPP
2021-07-10 19:55:53 +02:00
#include <SDL2/SDL_events.h>
#include <SDL2/SDL_rect.h>
2021-06-03 19:14:02 +02:00
2021-07-16 17:18:13 +02:00
#include <basic_widgets/sdl/data_type.hpp>
#include <basic_widgets/sdl/renderer.hpp>
2021-07-10 19:55:53 +02:00
struct SDL_Renderer;
namespace bwidgets::abstract
2021-06-03 19:14:02 +02:00
{
2021-07-10 19:55:53 +02:00
class Widget
2021-06-13 15:44:11 +02:00
{
2021-07-10 19:55:53 +02:00
protected:
2021-07-16 17:18:13 +02:00
sdl::Renderer* _renderer {nullptr};
SDL_Rect _viewport {0, 0, 0, 0};
SDL_Rect _widget_area {0, 0, 0, 0};
2021-07-10 19:55:53 +02:00
2021-07-16 17:18:13 +02:00
virtual void _handle_geometry_change(const SDL_Rect&) noexcept = 0;
virtual void _handle_renderer_change(sdl::Renderer*) {}
virtual void _handle_rendering() = 0;
2021-07-10 19:55:53 +02:00
public:
Widget* parent;
2021-07-16 17:18:13 +02:00
Widget(Widget* p=nullptr) : parent(p) {}
2021-07-10 19:55:53 +02:00
2021-07-16 17:18:13 +02:00
//*********************************************
//
virtual ~Widget() noexcept = default;
2021-07-10 19:55:53 +02:00
virtual void handle_event(const SDL_Event&);
2021-07-16 17:18:13 +02:00
// -----
inline virtual sdl::Size size() const noexcept
{
return {_widget_area.w, _widget_area.h};
}
2021-07-16 17:18:13 +02:00
//
//*********************************************
virtual void render() final;
// -----
virtual inline void renderer(sdl::Renderer* r) final
{
_handle_renderer_change(r);
_renderer = r;
}
virtual inline void viewport(const SDL_Rect& vp) noexcept final
{
_handle_geometry_change(vp);
_viewport = vp;
}
2021-07-10 19:55:53 +02:00
};
}
2021-06-03 19:14:02 +02:00
#endif