Initial first steps in pulling the SFML event processing out of the gui::fsm so that I can handle more complex things like drag and drop.
parent
0674908e49
commit
5aa54d875f
@ -1,86 +0,0 @@ |
||||
#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"); |
||||
} |
||||
} |
||||
} |
@ -1,33 +0,0 @@ |
||||
#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,116 @@ |
||||
#define FSM_DEBUG 1 |
||||
#include "event_router.hpp" |
||||
#include "dbc.hpp" |
||||
#include "events.hpp" |
||||
|
||||
namespace gui { |
||||
namespace routing { |
||||
using enum Event; |
||||
using enum State; |
||||
|
||||
gui::Event Router::process_event(std::optional<sf::Event> ev) { |
||||
$next_event = gui::Event::TICK; |
||||
|
||||
if(ev->is<sf::Event::Closed>()) { |
||||
return gui::Event::QUIT; |
||||
} |
||||
|
||||
if(const auto* mouse = ev->getIf<sf::Event::MouseButtonPressed>()) { |
||||
if(mouse->button == sf::Mouse::Button::Left) { |
||||
position = mouse->position; |
||||
event(MOUSE_DOWN); |
||||
} |
||||
} else if(const auto* mouse = ev->getIf<sf::Event::MouseButtonReleased>()) { |
||||
if(mouse->button == sf::Mouse::Button::Left) { |
||||
position = mouse->position; |
||||
event(MOUSE_UP); |
||||
} |
||||
} else if(const auto* mouse = ev->getIf<sf::Event::MouseMoved>()) { |
||||
position = mouse->position; |
||||
event(MOUSE_MOVE); |
||||
} |
||||
|
||||
if(const auto* key = ev->getIf<sf::Event::KeyPressed>()) { |
||||
scancode = key->scancode; |
||||
event(KEY_PRESS); |
||||
} |
||||
|
||||
return $next_event; |
||||
} |
||||
|
||||
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: |
||||
set_event(gui::Event::TICK); |
||||
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,43 @@ |
||||
#pragma once |
||||
#include "events.hpp" |
||||
#include "simplefsm.hpp" |
||||
#include <SFML/Graphics.hpp> |
||||
|
||||
namespace gui { |
||||
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: |
||||
sf::Vector2i position; |
||||
sf::Keyboard::Scancode scancode; |
||||
gui::Event $next_event = gui::Event::TICK; |
||||
|
||||
void event(Event ev); |
||||
|
||||
void START(Event ev); |
||||
void IDLE(Event ev); |
||||
void MOUSE_ACTIVE(Event ev); |
||||
void MOUSE_MOVING(Event ev); |
||||
|
||||
gui::Event process_event(std::optional<sf::Event> ev); |
||||
|
||||
void set_event(gui::Event ev) { |
||||
$next_event = ev; |
||||
} |
||||
}; |
||||
} |
||||
} |
Loading…
Reference in new issue