mirror of
https://github.com/libSDL2pp/libSDL2pp.git
synced 2025-08-04 03:15: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 <SDL_events.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
namespace SDL2pp {
|
namespace SDL2pp {
|
||||||
namespace Private
|
namespace Private
|
||||||
{
|
{
|
||||||
template <typename EventHandler>
|
template <typename EventHandler>
|
||||||
auto DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler) -> std::enable_if<IsEventHandlerFunctor<EventHandler, SDL_Event>::value>
|
auto DispatchSpecificEvent(const SDL_Event &event, EventHandler&& eventHandler) -> typename std::enable_if<IsEventHandlerObject<EventHandler, SDL_Event>::value>::type
|
||||||
{
|
|
||||||
eventHandler(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename EventHandler>
|
|
||||||
auto DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler) -> std::enable_if<IsEventHandlerObject<EventHandler, SDL_Event>::value>
|
|
||||||
{
|
{
|
||||||
eventHandler.HandleEvent(event);
|
eventHandler.HandleEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename EventHandler>
|
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>
|
template <typename... EventHandlers>
|
||||||
void DispatchEvent(const SDL_Event & event, EventHandlers&&... eventHandlers) {
|
void DispatchEvent(const SDL_Event &, EventHandlers&&...);
|
||||||
DispatchEvent(event, eventHandlers...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename EventHandler, typename... EventHandlers>
|
template <typename EventHandler, typename... EventHandlers>
|
||||||
void DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler, EventHandlers&&... eventHandlers) {
|
void DispatchEvent(const SDL_Event &event, EventHandler&& eventHandler, EventHandlers&&... eventHandlers) {
|
||||||
DispatchEvent(event, eventHandler);
|
DispatchSpecificEvent(event, eventHandler);
|
||||||
DispatchEvent(event, eventHandlers...);
|
DispatchEvent(event, eventHandlers...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ SET(CLI_TESTS
|
|||||||
test_color
|
test_color
|
||||||
test_color_constexpr
|
test_color_constexpr
|
||||||
test_error
|
test_error
|
||||||
|
test_eventdispatching
|
||||||
test_eventhandler
|
test_eventhandler
|
||||||
test_optional
|
test_optional
|
||||||
test_pointrect
|
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