From 3458b1bfb1160e953e43ad4f3f19792bee7abdf3 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 12 Mar 2019 14:46:02 +0100 Subject: [PATCH] imporve ENCODER support by sending signals --- lv_core/lv_indev.c | 34 ++++++++++++++++++++++------------ lv_objx/lv_btnm.c | 2 +- lv_objx/lv_ddlist.c | 22 +++++++--------------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/lv_core/lv_indev.c b/lv_core/lv_indev.c index 88f572d84..e04ef3685 100644 --- a/lv_core/lv_indev.c +++ b/lv_core/lv_indev.c @@ -541,13 +541,15 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) bool editable = false; focused->signal_cb(focused, LV_SIGNAL_GET_EDITABLE, &editable); - /*Button press happened*/ if(data->state == LV_INDEV_STATE_PR && i->proc.types.keypad.last_state == LV_INDEV_STATE_REL) { i->proc.pr_timestamp = lv_tick_get(); if(lv_group_get_editing(g) == true || editable == false) { + focused->signal_cb(focused, LV_SIGNAL_PRESSED, NULL); + if(i->proc.reset_query) return; /*The object might be deleted*/ + lv_obj_send_event(focused, LV_EVENT_PRESSED); if(i->proc.reset_query) return; /*The object might be deleted*/ } @@ -558,16 +560,15 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) lv_tick_elaps(i->proc.pr_timestamp) > LV_INDEV_LONG_PRESS_TIME) { /*On enter long press toggle edit mode.*/ if(editable) { - if(lv_ll_is_empty(&g->obj_ll) == false) + /*Don't leave edit mode if there is only one object (nowhere to navigate)*/ + if(lv_ll_is_empty(&g->obj_ll) == false) { lv_group_set_editing(g, lv_group_get_editing(g) ? false : true); /*Toggle edit mode on long press*/ - else { - /*Don't leave edit mode if there is only one object (nowhere to navigate)*/ - lv_obj_send_event(focused, LV_EVENT_LONG_PRESSED); - if(i->proc.reset_query) return; /*The object might be deleted*/ } } /*If not editable then just send a long press signal*/ else { + focused->signal_cb(focused, LV_SIGNAL_LONG_PRESS, NULL); + if(i->proc.reset_query) return; /*The object might be deleted*/ lv_obj_send_event(focused, LV_EVENT_LONG_PRESSED); if(i->proc.reset_query) return; /*The object might be deleted*/ } @@ -580,6 +581,9 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) /*The button was released on a non-editable object. Just send enter*/ if(editable == false) { lv_group_send_data(g, LV_GROUP_KEY_ENTER); + focused->signal_cb(focused, LV_SIGNAL_RELEASED, NULL); + if(i->proc.reset_query) return; /*The object might be deleted*/ + if(i->proc.long_pr_sent == 0) lv_obj_send_event(focused, LV_EVENT_SHORT_CLICKED); if(i->proc.reset_query) return; /*The object might be deleted*/ @@ -588,18 +592,24 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) lv_obj_send_event(focused, LV_EVENT_RELEASED); if(i->proc.reset_query) return; /*The object might be deleted*/ - - if(i->proc.reset_query) return; /*The object might be deleted*/ } - /*An object is being edited and the button is releases. Just send enter */ + /*An object is being edited and the button is released. */ else if(g->editing) { + /*Ignore long pressed enter release because it comes from mode switch*/ if(!i->proc.long_pr_sent || lv_ll_is_empty(&g->obj_ll)) { - lv_group_send_data(g, LV_GROUP_KEY_ENTER); /*Ignore long pressed enter release because it comes from mode switch*/ - lv_obj_send_event(focused, LV_EVENT_SHORT_CLICKED); - if(i->proc.reset_query) return; /*The object might be deleted*/ + focused->signal_cb(focused, LV_SIGNAL_RELEASED, NULL); + if(i->proc.reset_query) return; /*The object might be deleted*/ lv_obj_send_event(focused, LV_EVENT_SHORT_CLICKED); if(i->proc.reset_query) return; /*The object might be deleted*/ + + lv_obj_send_event(focused, LV_EVENT_CLICKED); + if(i->proc.reset_query) return; /*The object might be deleted*/ + + lv_obj_send_event(focused, LV_EVENT_RELEASED); + if(i->proc.reset_query) return; /*The object might be deleted*/ + + lv_group_send_data(g, LV_GROUP_KEY_ENTER); } } /*If the focused object is editable and now in navigate mode then on enter switch edit mode*/ diff --git a/lv_objx/lv_btnm.c b/lv_objx/lv_btnm.c index cacc0854c..86d58b872 100644 --- a/lv_objx/lv_btnm.c +++ b/lv_objx/lv_btnm.c @@ -822,7 +822,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) } else if(sign == LV_SIGNAL_PRESSED) { lv_indev_t * indev = lv_indev_get_act(); - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { uint16_t btn_pr; /*Search the pressed area*/ lv_indev_get_point(param, &p); diff --git a/lv_objx/lv_ddlist.c b/lv_objx/lv_ddlist.c index e97c4d3c6..9a7dd122d 100644 --- a/lv_objx/lv_ddlist.c +++ b/lv_objx/lv_ddlist.c @@ -688,21 +688,13 @@ static lv_res_t lv_ddlist_signal(lv_obj_t * ddlist, lv_signal_t sign, void * par lv_obj_invalidate(ddlist); } } else if(c == LV_GROUP_KEY_ENTER) { -// if(ext->opened) { -// ext->sel_opt_id_ori = ext->sel_opt_id; -// ext->opened = 0; -// res = lv_obj_send_event(ddlist, LV_EVENT_VALUE_CHANGED); -// if(res != LV_RES_OK) return res; -//#if LV_USE_GROUP -// lv_group_t * g = lv_obj_get_group(ddlist); -// bool editing = lv_group_get_editing(g); -// if(editing) lv_group_set_editing(g, false); /*In edit mode go to navigate mode if an option is selected*/ -//#endif -// } else { -// ext->opened = 1; -// } -// -// lv_ddlist_refr_size(ddlist, true); + lv_indev_t * indev = lv_indev_get_act(); + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { + lv_group_t * g = lv_obj_get_group(ddlist); + if(lv_group_get_editing(g)) { + lv_group_set_editing(g, false); + } + } } else if(c == LV_GROUP_KEY_ESC) { if(ext->opened) { ext->opened = 0;