Implemented an initial cut at the event router. Its job is to take the random events from SFML and translate them into nice clean orderly events to the Gui::FSM.
parent
5c47a0151c
commit
0674908e49
@ -0,0 +1,86 @@ |
|||||||
|
#define FSM_DEBUG 1 |
||||||
|
#include "event_router.hpp" |
||||||
|
#include "dbc.hpp" |
||||||
|
|
||||||
|
namespace routing { |
||||||
|
using enum Event; |
||||||
|
using enum State; |
||||||
|
|
||||||
|
void Router::process_window(sf::RenderWindow& window) { |
||||||
|
(void)window; |
||||||
|
} |
||||||
|
|
||||||
|
void Router::event(Event ev) { |
||||||
|
switch($state) { |
||||||
|
FSM_STATE(State, START, ev); |
||||||
|
FSM_STATE(State, IDLE, ev); |
||||||
|
FSM_STATE(State, MOUSE_ACTIVE, ev); |
||||||
|
FSM_STATE(State, MOUSE_MOVING, ev); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void Router::START(Event ) { |
||||||
|
state(State::IDLE); |
||||||
|
} |
||||||
|
|
||||||
|
void Router::IDLE(Event ev) { |
||||||
|
switch(ev) { |
||||||
|
case MOUSE_DOWN: |
||||||
|
state(State::MOUSE_ACTIVE); |
||||||
|
break; |
||||||
|
case MOUSE_UP: |
||||||
|
dbc::log("mouse up in IDLE"); |
||||||
|
break; |
||||||
|
case MOUSE_MOVE: |
||||||
|
dbc::log("mouse move, send moved event"); |
||||||
|
break; |
||||||
|
case KEY_PRESS: |
||||||
|
dbc::log("key pressed"); |
||||||
|
break; |
||||||
|
default: |
||||||
|
dbc::sentinel("invalid event"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void Router::MOUSE_ACTIVE(Event ev) { |
||||||
|
switch(ev) { |
||||||
|
case MOUSE_DOWN: |
||||||
|
dbc::log("mouse down in MOUSE_ACTIVE"); |
||||||
|
break; |
||||||
|
case MOUSE_UP: |
||||||
|
dbc::log("mouse up, send click event"); |
||||||
|
state(State::IDLE); |
||||||
|
break; |
||||||
|
case MOUSE_MOVE: |
||||||
|
state(State::MOUSE_MOVING); |
||||||
|
break; |
||||||
|
case KEY_PRESS: |
||||||
|
dbc::log("send the key but cancel"); |
||||||
|
state(State::IDLE); |
||||||
|
break; |
||||||
|
default: |
||||||
|
dbc::sentinel("invalid event"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void Router::MOUSE_MOVING(Event ev) { |
||||||
|
switch(ev) { |
||||||
|
case MOUSE_DOWN: |
||||||
|
dbc::log("mouse down in MOUSE_MOVING state"); |
||||||
|
break; |
||||||
|
case MOUSE_UP: |
||||||
|
dbc::log("mouse up, send drop event"); |
||||||
|
state(State::IDLE); |
||||||
|
break; |
||||||
|
case MOUSE_MOVE: |
||||||
|
dbc::log("mouse move, send drag event"); |
||||||
|
break; |
||||||
|
case KEY_PRESS: |
||||||
|
dbc::log("send the key but cancel"); |
||||||
|
state(State::IDLE); |
||||||
|
break; |
||||||
|
default: |
||||||
|
dbc::sentinel("invalid event"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
#pragma once |
||||||
|
#include "events.hpp" |
||||||
|
#include "simplefsm.hpp" |
||||||
|
#include <SFML/Graphics.hpp> |
||||||
|
|
||||||
|
namespace routing { |
||||||
|
enum class State { |
||||||
|
START, |
||||||
|
IDLE, |
||||||
|
MOUSE_ACTIVE, |
||||||
|
MOUSE_MOVING, |
||||||
|
}; |
||||||
|
|
||||||
|
enum class Event { |
||||||
|
STARTED=0, |
||||||
|
MOUSE_DOWN=1, |
||||||
|
MOUSE_UP=2, |
||||||
|
MOUSE_MOVE=3, |
||||||
|
KEY_PRESS=4 |
||||||
|
}; |
||||||
|
|
||||||
|
class Router : public DeadSimpleFSM<State, Event> { |
||||||
|
public: |
||||||
|
void event(Event ev); |
||||||
|
|
||||||
|
void START(Event ev); |
||||||
|
void IDLE(Event ev); |
||||||
|
void MOUSE_ACTIVE(Event ev); |
||||||
|
void MOUSE_MOVING(Event ev); |
||||||
|
|
||||||
|
void process_window(sf::RenderWindow& window); |
||||||
|
}; |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
#include <catch2/catch_test_macros.hpp> |
||||||
|
#include <fmt/core.h> |
||||||
|
#include <string> |
||||||
|
#include "event_router.hpp" |
||||||
|
|
||||||
|
using namespace fmt; |
||||||
|
using enum routing::Event; |
||||||
|
using enum routing::State; |
||||||
|
|
||||||
|
using EventScript = std::vector<routing::Event>; |
||||||
|
|
||||||
|
void run_script(routing::Router& router, routing::State expected, EventScript script) { |
||||||
|
for(auto ev : script) { |
||||||
|
router.event(ev); |
||||||
|
} |
||||||
|
|
||||||
|
REQUIRE(router.in_state(expected)); |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("basic router operations test", "[event_router]") { |
||||||
|
routing::Router router; |
||||||
|
|
||||||
|
// start goes to idle
|
||||||
|
run_script(router, IDLE, { |
||||||
|
STARTED |
||||||
|
}); |
||||||
|
|
||||||
|
// simulate drag and drop
|
||||||
|
run_script(router, IDLE, { |
||||||
|
MOUSE_DOWN, |
||||||
|
MOUSE_MOVE, |
||||||
|
MOUSE_UP, |
||||||
|
KEY_PRESS |
||||||
|
}); |
||||||
|
|
||||||
|
// moving the mouse outside dnd
|
||||||
|
run_script(router, IDLE, { |
||||||
|
MOUSE_MOVE, |
||||||
|
KEY_PRESS, |
||||||
|
MOUSE_MOVE |
||||||
|
}); |
||||||
|
|
||||||
|
// regular mouse click
|
||||||
|
run_script(router, IDLE, { |
||||||
|
MOUSE_DOWN, |
||||||
|
MOUSE_UP |
||||||
|
}); |
||||||
|
|
||||||
|
// possible bad key press in a move?
|
||||||
|
run_script(router, IDLE, { |
||||||
|
MOUSE_DOWN, |
||||||
|
MOUSE_MOVE, |
||||||
|
KEY_PRESS, |
||||||
|
MOUSE_UP, |
||||||
|
}); |
||||||
|
} |
Loading…
Reference in new issue