События
Для обработки событий используется подписная модель. Контрол или пользовательский код подписывается в окне на нужные ему события и получает их. События могут быть сгенерированы системой или пользовательским кодом.
Все события проходят через окно. Для работы с ними используются следующие методы:
class window
{
public:
...
std::string subscribe(std::function<void(const event&)> receive_callback, event_type event_types, std::shared_ptr<i_control> control = nullptr);
void unsubscribe(const std::string &subscriber_id);
void emit_event(int32_t x, int32_t y);
...
};
std::string subscribe(...)
Используется для получения событий от окна. Метод возвращает уникальный идентификатор подписчика
который нужно передать в unsubscribe()
для отписки.
- receive_callback - функция, получающая события
- event_types - битовая маска, указывающая какие события нужно получать
- control - при установке данного поля будут приходить только события мыши происходящие над этим контролом и клавиатурные события если у него имеется фокус ввода. В противном случае, будут приходить все события от окна.
unsubscribe(const std::string &subscriber_id)
Предназначен для прекращения подписки на события окна
- subscriber_id - уникальный идентификатор подписчика, выданный методом
subscribe
emit_event(int32_t x, int32_t y)
Метод, генерирующий internal event. Используется пользовательским кодом для генерации собственных событий.
Типы событий
enum class event_type : uint32_t
{
system = (1 << 0),
mouse = (1 << 1),
keyboard = (1 << 2),
internal = (1 << 3),
all = system | mouse | keyboard | internal
};
struct event
{
event_type type;
union
{
mouse_event mouse_event_;
keyboard_event keyboard_event_;
internal_event internal_event_;
};
};
В зависимости от типа события берется значение из объединения event.
События мыши
enum class mouse_event_type
{
move,
enter,
leave,
right_down,
right_up,
center_down,
center_up,
left_down,
left_up,
left_double,
wheel
};
struct mouse_event
{
mouse_event_type type;
int32_t x, y;
int32_t wheel_delta;
};
События клавиатуры
enum class keyboard_event_type
{
down,
up,
key
};
struct keyboard_event
{
keyboard_event_type type;
uint8_t modifier; /// vk_capital or vk_shift or vk_alt or vk_insert
char key[4];
uint8_t key_size;
};
Внутренние события
enum class internal_event_type
{
set_focus,
remove_focus,
execute_focused,
size_changed,
position_changed,
user_emitted
};
struct internal_event
{
internal_event_type type;
int32_t x, y;
};