The event router is working well and I can do drag-n-drop but I'll have to rethink where to use it.

This commit is contained in:
Zed A. Shaw 2025-06-05 23:31:38 -04:00
parent 5aa54d875f
commit c509162be1
8 changed files with 126 additions and 63 deletions

View file

@ -1,4 +1,3 @@
#define FSM_DEBUG 1
#include "event_router.hpp"
#include "dbc.hpp"
#include "events.hpp"
@ -44,6 +43,7 @@ namespace gui {
FSM_STATE(State, IDLE, ev);
FSM_STATE(State, MOUSE_ACTIVE, ev);
FSM_STATE(State, MOUSE_MOVING, ev);
FSM_STATE(State, MOUSE_DRAGGING, ev);
}
}
@ -54,17 +54,15 @@ namespace gui {
void Router::IDLE(Event ev) {
switch(ev) {
case MOUSE_DOWN:
move_count=0;
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");
set_event(gui::Event::MOUSE_MOVE);
break;
case KEY_PRESS:
dbc::log("key pressed");
set_event(gui::Event::KEY_PRESS);
break;
default:
dbc::sentinel("invalid event");
@ -73,18 +71,17 @@ namespace gui {
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");
set_event(gui::Event::MOUSE_CLICK);
state(State::IDLE);
break;
case MOUSE_MOVE:
move_count++;
set_event(gui::Event::MOUSE_DRAG);
state(State::MOUSE_MOVING);
break;
case KEY_PRESS:
dbc::log("send the key but cancel");
set_event(gui::Event::KEY_PRESS);
state(State::IDLE);
break;
default:
@ -94,23 +91,46 @@ namespace gui {
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");
case MOUSE_UP: {
dbc::check(move_count < $drag_tolerance, "mouse up but not in dragging state");
set_event(gui::Event::MOUSE_CLICK);
state(State::IDLE);
break;
} break;
case MOUSE_MOVE:
dbc::log("mouse move, send drag event");
move_count++;
if(move_count < $drag_tolerance) {
set_event(gui::Event::MOUSE_DRAG);
} else {
set_event(gui::Event::MOUSE_DRAG_START);
state(State::MOUSE_DRAGGING);
}
break;
case KEY_PRESS:
dbc::log("send the key but cancel");
state(State::IDLE);
set_event(gui::Event::KEY_PRESS);
break;
default:
dbc::sentinel("invalid event");
}
}
void Router::MOUSE_DRAGGING(Event ev) {
switch(ev) {
case MOUSE_UP:
set_event(gui::Event::MOUSE_DROP);
state(State::IDLE);
break;
case MOUSE_MOVE:
move_count++;
set_event(gui::Event::MOUSE_DRAG);
break;
case KEY_PRESS:
set_event(gui::Event::KEY_PRESS);
break;
default:
dbc::sentinel("invalid events");
}
}
}
}