mirror of
https://github.com/libSDL2pp/libSDL2pp.git
synced 2025-08-03 19:05:59 -04:00
Added basic event dispatching (needs event types specialization)
This commit is contained in:
parent
04f7c2a365
commit
06f1d48de4
@ -28,35 +28,36 @@
|
||||
|
||||
#include <SDL_events.h>
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
namespace SDL2pp {
|
||||
namespace Private
|
||||
{
|
||||
template <typename EventHandler>
|
||||
auto DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler) -> std::enable_if<IsEventHandlerFunctor<EventHandler, SDL_Event>::value>
|
||||
{
|
||||
eventHandler(event);
|
||||
}
|
||||
|
||||
template <typename EventHandler>
|
||||
auto DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler) -> std::enable_if<IsEventHandlerObject<EventHandler, SDL_Event>::value>
|
||||
auto DispatchSpecificEvent(const SDL_Event &event, EventHandler&& eventHandler) -> typename std::enable_if<IsEventHandlerObject<EventHandler, SDL_Event>::value>::type
|
||||
{
|
||||
eventHandler.HandleEvent(event);
|
||||
}
|
||||
|
||||
template <typename EventHandler>
|
||||
auto DispatchEvent(const SDL_Event&, EventHandler&&) -> std::enable_if<!IsEventHandler<EventHandler, SDL_Event>::value>
|
||||
auto DispatchSpecificEvent(const SDL_Event &event, EventHandler&& eventHandler) -> typename std::enable_if<IsEventHandlerFunctor<EventHandler, SDL_Event>::value>::type
|
||||
{
|
||||
static_assert(!IsEventHandler<EventHandler, SDL_Event>::value, "One of the given values is not a valid event handler");
|
||||
eventHandler(event);
|
||||
}
|
||||
|
||||
template <typename EventHandler>
|
||||
auto DispatchSpecificEvent(const SDL_Event &, EventHandler&&) -> typename std::enable_if<!IsEventHandler<EventHandler, SDL_Event>::value>::type
|
||||
{
|
||||
static_assert(IsEventHandler<EventHandler, SDL_Event>::value, "Event handler is not a valid functor or object");
|
||||
}
|
||||
|
||||
template <typename... EventHandlers>
|
||||
void DispatchEvent(const SDL_Event & event, EventHandlers&&... eventHandlers) {
|
||||
DispatchEvent(event, eventHandlers...);
|
||||
}
|
||||
void DispatchEvent(const SDL_Event &, EventHandlers&&...);
|
||||
|
||||
template <typename EventHandler, typename... EventHandlers>
|
||||
void DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler, EventHandlers&&... eventHandlers) {
|
||||
DispatchEvent(event, eventHandler);
|
||||
DispatchSpecificEvent(event, eventHandler);
|
||||
DispatchEvent(event, eventHandlers...);
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,7 @@ SET(CLI_TESTS
|
||||
test_color
|
||||
test_color_constexpr
|
||||
test_error
|
||||
test_eventdispatching
|
||||
test_eventhandler
|
||||
test_optional
|
||||
test_pointrect
|
||||
|
57
tests/test_eventdispatching.cc
Normal file
57
tests/test_eventdispatching.cc
Normal file
@ -0,0 +1,57 @@
|
||||
#include <SDL_main.h>
|
||||
|
||||
#include <SDL2pp/Private/EventDispatching.hh>
|
||||
|
||||
#include "testing.h"
|
||||
|
||||
using namespace SDL2pp::Private;
|
||||
|
||||
static auto globalResult = Sint32{0};
|
||||
|
||||
inline void handler(SDL_Event event)
|
||||
{
|
||||
globalResult = event.user.code;
|
||||
}
|
||||
|
||||
BEGIN_TEST(int, char*[])
|
||||
|
||||
SDL_Event event;
|
||||
event.type = SDL_USEREVENT;
|
||||
event.user.code = 31;
|
||||
|
||||
DispatchEvent(event);
|
||||
|
||||
auto result = Sint32{0};
|
||||
DispatchEvent(event, [&result](SDL_Event event) {
|
||||
result = event.user.code;
|
||||
});
|
||||
EXPECT_EQUAL(event.user.code, result);
|
||||
|
||||
DispatchEvent(event, handler);
|
||||
EXPECT_EQUAL(event.user.code, globalResult);
|
||||
|
||||
struct EventHandlerFunctor {
|
||||
Sint32 result;
|
||||
|
||||
void operator()(SDL_Event event) {
|
||||
result = event.user.code;
|
||||
}
|
||||
};
|
||||
|
||||
auto eventHandlerFunctor = EventHandlerFunctor{};
|
||||
DispatchEvent(event, eventHandlerFunctor);
|
||||
EXPECT_EQUAL(event.user.code, eventHandlerFunctor.result);
|
||||
|
||||
struct EventHandlerObject {
|
||||
Sint32 result;
|
||||
|
||||
void HandleEvent(SDL_Event event) {
|
||||
result = event.user.code;
|
||||
}
|
||||
};
|
||||
|
||||
auto eventHandlerObject = EventHandlerObject{};
|
||||
DispatchEvent(event, eventHandlerObject);
|
||||
EXPECT_EQUAL(event.user.code, eventHandlerObject.result);
|
||||
|
||||
END_TEST()
|
Loading…
x
Reference in New Issue
Block a user