ui: extend box->signal path with double-drag, triple-drag info

This commit is contained in:
Ryan Fleury
2024-03-29 10:58:05 -07:00
parent 6eb8e37d4d
commit 2842901f9c
2 changed files with 86 additions and 26 deletions
+58 -8
View File
@@ -2448,13 +2448,24 @@ ui_signal_from_box(UI_Box *box)
ui_state->active_box_key[evt_mouse_button_kind] = box->key;
sig.f |= (UI_SignalFlag_LeftPressed<<evt_mouse_button_kind);
ui_state->drag_start_mouse = evt->pos;
if(ui_key_match(box->key, ui_state->last_press_key[evt_mouse_button_kind]) &&
evt->timestamp_us-ui_state->last_press_timestamp_us[evt_mouse_button_kind] <= 1000000*os_double_click_time())
if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) &&
evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_double_click_time())
{
sig.f |= (UI_SignalFlag_LeftDoubleClicked<<evt_mouse_button_kind);
}
ui_state->last_press_key[evt_mouse_button_kind] = box->key;
ui_state->last_press_timestamp_us[evt_mouse_button_kind] = evt->timestamp_us;
if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) &&
ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][1]) &&
evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_double_click_time() &&
ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] - ui_state->press_timestamp_history_us[evt_mouse_button_kind][1] <= 1000000*os_double_click_time())
{
sig.f |= (UI_SignalFlag_LeftTripleClicked<<evt_mouse_button_kind);
}
MemoryCopy(&ui_state->press_timestamp_history_us[evt_mouse_button_kind][1], &ui_state->press_timestamp_history_us[evt_mouse_button_kind][0],
sizeof(ui_state->press_timestamp_history_us[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_timestamp_history_us[evt_mouse_button_kind])-1);
MemoryCopy(&ui_state->press_key_history[evt_mouse_button_kind][1], &ui_state->press_key_history[evt_mouse_button_kind][0],
sizeof(ui_state->press_key_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_key_history[evt_mouse_button_kind])-1);
ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] = evt->timestamp_us;
ui_state->press_key_history[evt_mouse_button_kind][0] = box->key;
taken = 1;
}
@@ -2619,12 +2630,51 @@ ui_signal_from_box(UI_Box *box)
//////////////////////////////
//- rjf: active -> dragging
//
for(EachEnumVal(UI_MouseButtonKind, k))
if(box->flags & UI_BoxFlag_MouseClickable)
{
if(ui_key_match(ui_state->active_box_key[k], box->key) ||
sig.f & (UI_SignalFlag_LeftPressed<<k))
for(EachEnumVal(UI_MouseButtonKind, k))
{
sig.f |= (UI_SignalFlag_LeftDragging<<k);
if(ui_key_match(ui_state->active_box_key[k], box->key) ||
sig.f & (UI_SignalFlag_LeftPressed<<k))
{
sig.f |= (UI_SignalFlag_LeftDragging<<k);
}
}
}
//////////////////////////////
//- rjf: dragging started via double-click -> double-dragging
//
if(box->flags & UI_BoxFlag_MouseClickable)
{
for(EachEnumVal(UI_MouseButtonKind, k))
{
if(sig.f & (UI_SignalFlag_LeftDragging<<k) &&
ui_key_match(ui_state->press_key_history[k][0], box->key) &&
ui_key_match(ui_state->press_key_history[k][1], box->key) &&
ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time())
{
sig.f |= (UI_SignalFlag_LeftDoubleDragging<<k);
}
}
}
//////////////////////////////
//- rjf: dragging started via triple-click -> triple-dragging
//
if(box->flags & UI_BoxFlag_MouseClickable)
{
for(EachEnumVal(UI_MouseButtonKind, k))
{
if(sig.f & (UI_SignalFlag_LeftDragging<<k) &&
ui_key_match(ui_state->press_key_history[k][0], box->key) &&
ui_key_match(ui_state->press_key_history[k][1], box->key) &&
ui_key_match(ui_state->press_key_history[k][2], box->key) &&
ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_double_click_time() &&
ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*os_double_click_time())
{
sig.f |= (UI_SignalFlag_LeftTripleDragging<<k);
}
}
}