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