diff --git a/Apps/System/tests/menu_simple_test.c b/Apps/System/tests/menu_simple_test.c index 12e262e5..c904be6b 100644 --- a/Apps/System/tests/menu_simple_test.c +++ b/Apps/System/tests/menu_simple_test.c @@ -84,12 +84,12 @@ static void _menu_select_callback(ClickRecognizerRef recognizer, void *context) static void _menu_next_callback(ClickRecognizerRef recognizer, void *context) { - menu_layer_set_selected_next(s_menu_layer, false, s_row_align, true); + menu_layer_set_selected_next(s_menu_layer, recognizer, false, s_row_align, true); } static void _menu_prev_callback(ClickRecognizerRef recognizer, void *context) { - menu_layer_set_selected_next(s_menu_layer, true, s_row_align, true); + menu_layer_set_selected_next(s_menu_layer, recognizer, true, s_row_align, true); } static void _menu_exit_callback(ClickRecognizerRef recognizer, void* context) diff --git a/rwatch/ui/action_menu.c b/rwatch/ui/action_menu.c index 158d0561..b6d2a18c 100644 --- a/rwatch/ui/action_menu.c +++ b/rwatch/ui/action_menu.c @@ -219,14 +219,14 @@ static void _action_menu_select_prev(ClickRecognizerRef recognizer, void *contex { ActionMenu *action_menu = (ActionMenu*)context; if (!action_menu->is_frozen) - menu_layer_set_selected_next(action_menu->menu_layer, true, MenuRowAlignCenter, true); + menu_layer_set_selected_next(action_menu->menu_layer, recognizer, true, MenuRowAlignCenter, true); } static void _action_menu_select_next(ClickRecognizerRef recognizer, void *context) { ActionMenu *action_menu = (ActionMenu*)context; if (!action_menu->is_frozen) - menu_layer_set_selected_next(action_menu->menu_layer, false, MenuRowAlignCenter, true); + menu_layer_set_selected_next(action_menu->menu_layer, recognizer, false, MenuRowAlignCenter, true); } static void _action_menu_activate_item(ClickRecognizerRef recognizer, void *context) diff --git a/rwatch/ui/layer/menu_layer.c b/rwatch/ui/layer/menu_layer.c index 54c64458..9f6a47e4 100644 --- a/rwatch/ui/layer/menu_layer.c +++ b/rwatch/ui/layer/menu_layer.c @@ -102,13 +102,28 @@ static bool has_next_index(const MenuLayer *menu_layer, const MenuIndex *index, || (!up && (index->section < menu_layer->end_index.section || index->row < menu_layer->end_index.row - 1)); } -static MenuIndex get_next_index(MenuLayer *menu_layer, bool up) +static MenuIndex get_next_index(MenuLayer *menu_layer, ClickRecognizerRef ref, bool up) { MenuIndex index = menu_layer->selected; if (!has_next_index(menu_layer, &index, up)) + { + if (click_recognizer_is_repeating(ref)) + { + return index; + } + if(index.row == 0) + { + index.row = get_num_rows(menu_layer, index.section) - (uint16_t) 1; + return index; + } + if(index.row == get_num_rows(menu_layer, index.section) - (uint16_t) 1) + { + index.row = 0; + return index; + } return index; - + } if (up && index.row == 0) { --index.section; @@ -124,9 +139,9 @@ static MenuIndex get_next_index(MenuLayer *menu_layer, bool up) return index; } -void menu_layer_set_selected_next(MenuLayer *menu_layer, bool up, MenuRowAlign scroll_align, bool animated) +void menu_layer_set_selected_next(MenuLayer *menu_layer, ClickRecognizerRef ref, bool up, MenuRowAlign scroll_align, bool animated) { - menu_layer_set_selected_index(menu_layer, get_next_index(menu_layer, up), scroll_align, animated); + menu_layer_set_selected_index(menu_layer, get_next_index(menu_layer, ref, up), scroll_align, animated); } static MenuCellSpan *_get_cell_span(MenuLayer *menu_layer, const MenuIndex *index) @@ -360,11 +375,11 @@ static void scroll_click_handler(ClickRecognizerRef ref, MenuLayer *menu_layer) { bool up = click_recognizer_get_button_id(ref) == BUTTON_ID_UP; if (!click_recognizer_is_repeating(ref)) { - menu_layer_set_selected_next(menu_layer, up, MenuRowAlignCenter, ANIMATE_ON_CLICK); + menu_layer_set_selected_next(menu_layer, ref, up, MenuRowAlignCenter, ANIMATE_ON_CLICK); menu_layer_scroll_repeat_prepare(menu_layer); } else { if (menu_layer_scroll_repeat(menu_layer)) - menu_layer_set_selected_next(menu_layer, up, MenuRowAlignCenter, ANIMATE_ON_CLICK); + menu_layer_set_selected_next(menu_layer, ref, up, MenuRowAlignCenter, ANIMATE_ON_CLICK); } } diff --git a/rwatch/ui/layer/menu_layer.h b/rwatch/ui/layer/menu_layer.h index cdbe88ac..3f2aaa60 100644 --- a/rwatch/ui/layer/menu_layer.h +++ b/rwatch/ui/layer/menu_layer.h @@ -151,7 +151,7 @@ typedef enum MenuRowAlignBottom, } MenuRowAlign; -void menu_layer_set_selected_next(MenuLayer *menu_layer, bool up, MenuRowAlign scroll_align, +void menu_layer_set_selected_next(MenuLayer *menu_layer,ClickRecognizerRef ref, bool up, MenuRowAlign scroll_align, bool animated); void menu_layer_set_selected_index(MenuLayer *menu_layer, MenuIndex index,