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