lv_group: add click_focus option

This commit is contained in:
Gabor Kiss-Vamosi
2018-07-12 23:38:27 +02:00
parent 9a28e559a4
commit d483d14c8e
8 changed files with 157 additions and 24 deletions

View File

@@ -569,7 +569,17 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param)
ext->btn_id_tgl = ext->btn_id_pr;
}
#if USE_LV_GROUP
/*Leave the clicked button as pressed if this the focused object in a group*/
lv_group_t * g = lv_obj_get_group(btnm);
if(lv_group_get_focused(g) != btnm) {
ext->btn_id_pr = LV_BTNM_PR_NONE;
}
#else
ext->btn_id_pr = LV_BTNM_PR_NONE;
#endif
}
} else if(sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_DEFOCUS) {
ext->btn_id_pr = LV_BTNM_PR_NONE;

View File

@@ -532,14 +532,14 @@ static lv_res_t lv_list_signal(lv_obj_t * list, lv_signal_t sign, void * param)
btn = get_next_btn(list, btn);
}
if(btn_prev != NULL) {
lv_btn_set_state(btn_prev, LV_BTN_STATE_TGL_REL);
lv_btn_set_state(btn_prev, LV_BTN_STATE_PR);
}
} else if(sign == LV_SIGNAL_DEFOCUS) {
/*Get the 'pressed' button*/
lv_obj_t * btn = NULL;
btn = get_next_btn(list, btn);
while(btn != NULL) {
if(lv_btn_get_state(btn) == LV_BTN_STATE_TGL_REL) break;
if(lv_btn_get_state(btn) == LV_BTN_STATE_PR) break;
btn = get_next_btn(list, btn);
}
@@ -555,40 +555,58 @@ static lv_res_t lv_list_signal(lv_obj_t * list, lv_signal_t sign, void * param)
lv_list_ext_t * ext = lv_obj_get_ext_attr(list);
btn = get_next_btn(list, btn);
while(btn != NULL) {
if(lv_btn_get_state(btn) == LV_BTN_STATE_TGL_REL) break;
if(lv_btn_get_state(btn) == LV_BTN_STATE_PR) break;
btn_prev = btn;
btn = get_next_btn(list, btn);
}
/*If there is a valid "pressed" button the make the next "pressed"*/
if(btn_prev != NULL && btn != NULL) {
lv_btn_set_state(btn, LV_BTN_STATE_REL);
lv_btn_set_state(btn_prev, LV_BTN_STATE_TGL_REL);
lv_btn_set_state(btn_prev, LV_BTN_STATE_PR);
lv_page_focus(list, btn_prev, ext->anim_time);
}
/*If there is no "pressed" button the make the first "pressed"*/
else {
btn = get_next_btn(list, NULL);
if(btn) { /*If there are no buttons on the list hen there is no first button*/
lv_btn_set_state(btn, LV_BTN_STATE_PR);
lv_page_focus(list, btn, ext->anim_time);
}
}
} else if(c == LV_GROUP_KEY_LEFT || c == LV_GROUP_KEY_UP) {
/*Get the last pressed button*/
lv_obj_t * btn = NULL;
lv_list_ext_t * ext = lv_obj_get_ext_attr(list);
btn = get_next_btn(list, btn);
while(btn != NULL) {
if(lv_btn_get_state(btn) == LV_BTN_STATE_TGL_REL) break;
if(lv_btn_get_state(btn) == LV_BTN_STATE_PR) break;
btn = get_next_btn(list, btn);
}
/*If there is a valid "pressed" button the make the next "pressed"*/
if(btn != NULL) {
lv_obj_t * btn_prev = get_next_btn(list, btn);
if(btn_prev != NULL) {
lv_obj_t * btn_next = get_next_btn(list, btn);
if(btn_next != NULL) {
lv_btn_set_state(btn, LV_BTN_STATE_REL);
lv_btn_set_state(btn_prev, LV_BTN_STATE_TGL_REL);
lv_page_focus(list, btn_prev, ext->anim_time);
lv_btn_set_state(btn_next, LV_BTN_STATE_PR);
lv_page_focus(list, btn_next, ext->anim_time);
}
}
/*If there is no "pressed" button the make the first "pressed"*/
else {
btn = get_next_btn(list, NULL);
if(btn) { /*If there are no buttons on the list hen there is no first button*/
lv_btn_set_state(btn, LV_BTN_STATE_PR);
lv_page_focus(list, btn, ext->anim_time);
}
}
} else if(c == LV_GROUP_KEY_ENTER) {
/*Get the 'pressed' button*/
lv_obj_t * btn = NULL;
btn = get_next_btn(list, btn);
while(btn != NULL) {
if(lv_btn_get_state(btn) == LV_BTN_STATE_TGL_REL) break;
if(lv_btn_get_state(btn) == LV_BTN_STATE_PR) break;
btn = get_next_btn(list, btn);
}

View File

@@ -73,6 +73,7 @@ lv_obj_t * lv_page_create(lv_obj_t * par, lv_obj_t * copy)
ext->sb.ver_draw = 0;
ext->sb.style = &lv_style_pretty;
ext->sb.mode = LV_SB_MODE_AUTO;
ext->arrow_scroll = 0;
/*Init the new page object*/
if(copy == NULL) {
@@ -117,6 +118,8 @@ lv_obj_t * lv_page_create(lv_obj_t * par, lv_obj_t * copy)
lv_page_set_pr_action(new_page, copy_ext->pr_action);
lv_page_set_rel_action(new_page, copy_ext->rel_action);
lv_page_set_sb_mode(new_page, copy_ext->sb.mode);
lv_page_set_arrow_scroll(new_page, copy_ext->arrow_scroll);
lv_page_set_style(new_page, LV_PAGE_STYLE_BG, lv_page_get_style(copy, LV_PAGE_STYLE_BG));
lv_page_set_style(new_page, LV_PAGE_STYLE_SCRL, lv_page_get_style(copy, LV_PAGE_STYLE_SCRL));
@@ -175,7 +178,7 @@ void lv_page_set_pr_action(lv_obj_t * page, lv_action_t pr_action)
/**
* Set the scroll bar mode on a page
* @param page pointer to a page object
* @param sb.mode the new mode from 'lv_page_sb.mode_t' enum
* @param sb_mode the new mode from 'lv_page_sb.mode_t' enum
*/
void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode)
{
@@ -189,6 +192,17 @@ void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode)
lv_obj_invalidate(page);
}
/**
* Enable/Disable scrolling with arrows if the page is in group (arrows: LV_GROUP_KEY_LEFT/RIGHT/UP/DOWN)
* @param page pointer to a page object
* @param en true: enable scrolling with arrows
*/
void lv_page_set_arrow_scroll(lv_obj_t * page, bool en)
{
lv_page_ext_t * ext = lv_obj_get_ext_attr(page);
ext->arrow_scroll = en ? 1 : 0;
}
/**
* Set a style of a page
* @param page pointer to a page object
@@ -244,6 +258,17 @@ lv_sb_mode_t lv_page_get_sb_mode(lv_obj_t * page)
return ext->sb.mode;
}
/**
* Get the the scrolling with arrows (LV_GROUP_KEY_LEFT/RIGHT/UP/DOWN) is enabled or not
* @param page pointer to a page object
* @return true: scrolling with arrows is enabled
*/
bool lv_page_get_arrow_scroll(lv_obj_t * page, bool en)
{
lv_page_ext_t * ext = lv_obj_get_ext_attr(page);
return ext->arrow_scroll ? true : false;
}
/**
* Get a style of a page
* @param page pointer to page object
@@ -538,12 +563,13 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param)
} else if(sign == LV_SIGNAL_CONTROLL) {
uint32_t c = *((uint32_t *) param);
lv_obj_t * scrl = lv_page_get_scrl(page);
if(c == LV_GROUP_KEY_DOWN || c == LV_GROUP_KEY_RIGHT) {
if((c == LV_GROUP_KEY_DOWN || c == LV_GROUP_KEY_RIGHT) && ext->arrow_scroll) {
#if USE_LV_ANIMATION
lv_anim_t a;
a.var = scrl;
a.start = lv_obj_get_y(scrl);
a.end = a.start - LV_DPI / 2;
a.end = a.start - lv_obj_get_height(page) / 4;
a.fp = (lv_anim_fp_t)lv_obj_set_y;
a.path = lv_anim_path_linear;
a.end_cb = NULL;
@@ -555,15 +581,15 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param)
a.repeat_pause = 0;
lv_anim_create(&a);
#else
lv_obj_set_y(scrl, lv_obj_get_y(scrl) - LV_DPI / 2);
lv_obj_set_y(scrl, lv_obj_get_y(scrl) - lv_obj_get_height(page) / 4);
#endif
} else if(c == LV_GROUP_KEY_UP || c == LV_GROUP_KEY_LEFT) {
} else if((c == LV_GROUP_KEY_UP || c == LV_GROUP_KEY_LEFT) && ext->arrow_scroll) {
#if USE_LV_ANIMATION
lv_anim_t a;
a.var = scrl;
a.start = lv_obj_get_y(scrl);
a.end = a.start + LV_DPI / 2;
a.end = a.start + lv_obj_get_height(page) / 4;
a.fp = (lv_anim_fp_t)lv_obj_set_y;
a.path = lv_anim_path_linear;
a.end_cb = NULL;
@@ -575,7 +601,7 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param)
a.repeat_pause = 0;
lv_anim_create(&a);
#else
lv_obj_set_y(scrl, lv_obj_get_y(scrl) - LV_DPI / 2);
lv_obj_set_y(scrl, lv_obj_get_y(scrl) + lv_obj_get_height(page) / 4);
#endif
}
} else if(sign == LV_SIGNAL_GET_TYPE) {

View File

@@ -62,6 +62,7 @@ typedef struct
uint8_t ver_draw :1; /*1: vertical scrollbar is visible now (Handled by the library)*/
uint8_t mode :3; /*Scrollbar visibility from 'lv_page_sb_mode_t'*/
} sb;
uint8_t arrow_scroll :1; /*1: Enable scrolling with LV_GROUP_KEY_LEFT/RIGHT/UP/DOWN*/
} lv_page_ext_t;
typedef enum {
@@ -118,10 +119,17 @@ void lv_page_set_pr_action(lv_obj_t * page, lv_action_t pr_action);
/**
* Set the scroll bar mode on a page
* @param page pointer to a page object
* @param sb.mode the new mode from 'lv_page_sb.mode_t' enum
* @param sb_mode the new mode from 'lv_page_sb.mode_t' enum
*/
void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode);
/**
* Enable/Disable scrolling with arrows if the page is in group (arrows: LV_GROUP_KEY_LEFT/RIGHT/UP/DOWN)
* @param page pointer to a page object
* @param en true: enable scrolling with arrows
*/
void lv_page_set_arrow_scroll(lv_obj_t * page, bool en);
/**
* Set the fit attribute of the scrollable part of a page.
* It means it can set its size automatically to involve all children.
@@ -185,6 +193,14 @@ void lv_page_set_style(lv_obj_t *page, lv_page_style_t type, lv_style_t *style);
*/
lv_sb_mode_t lv_page_get_sb_mode(lv_obj_t * page);
/**
* Get the the scrolling with arrows (LV_GROUP_KEY_LEFT/RIGHT/UP/DOWN) is enabled or not
* @param page pointer to a page object
* @return true: scrolling with arrows is enabled
*/
bool lv_page_get_arrow_scroll(lv_obj_t * page, bool en);
/**
* Get width of the scrollable part of a page
* @param page pointer to a page object