diff --git a/CHANGELOG.md b/CHANGELOG.md index be3d1f6aa..143bf2b05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ - Added ADC (analog voltage) support to gpio library (by @jamisonderek) - Support `subghz` custom modulation, support `transmitFile(path, repeats)`, new `end()` function (by @Willy-JL) - FBT: New `SKIP_EXTERNAL` toggle and `EXTRA_EXT_APPS` config option (by @Willy-JL) +- GUI: Additional `menu_get_selected_item()` API (by @Willy-JL) - Desktop: - Added TV animation from OFW which was missing (internal on OFW) - OFW: New Intruder animation (by @Astrrra) @@ -106,6 +107,7 @@ - Infrared: Correct Samsung.ir CH+ command (by @skyhawkillusions) - FBT: Consistent version/branch info, fix gitorigin (by @Willy-JL) - AssetPacker: Pack pre-compiled icons and fonts too (by @Willy-JL) +- GUI: Return user-provided index from `menu_set_selected_item()` like `submenu` equivalent (by @Willy-JL) - JS: - Fix `subghz` RAW files, fix memory leaks, deinit correctly, better error handling (by @Willy-JL) - OFW: Disable logging in mjs +2k free flash (by @hedger) diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index 58852becd..686c6bfcb 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -615,6 +615,47 @@ void menu_reset(Menu* menu) { true); } +static void menu_set_position(Menu* menu, uint32_t position) { + furi_check(menu); + + with_view_model( + menu->view, + MenuModel * model, + { + if(position < MenuItemArray_size(model->items) && position != model->position) { + model->scroll_counter = 0; + + MenuItem* item = MenuItemArray_get(model->items, model->position); + icon_animation_stop(item->icon); + + item = MenuItemArray_get(model->items, position); + icon_animation_start(item->icon); + + model->position = position; + } + }, + true); +} + +uint32_t menu_get_selected_item(Menu* menu) { + furi_check(menu); + + uint32_t selected_item_index = 0; + + with_view_model( + menu->view, + MenuModel * model, + { + if(model->position < MenuItemArray_size(model->items)) { + const MenuItem* item = MenuItemArray_cget(model->items, model->position); + selected_item_index = item->index; + } + }, + false); + + return selected_item_index; +} + void menu_set_selected_item(Menu* menu, uint32_t index) { furi_check(menu); @@ -622,17 +663,23 @@ void menu_set_selected_item(Menu* menu, uint32_t index) { menu->view, MenuModel * model, { - if(index < MenuItemArray_size(model->items) && index != model->position) { - model->scroll_counter = 0; - - MenuItem* item = MenuItemArray_get(model->items, model->position); - icon_animation_stop(item->icon); - - item = MenuItemArray_get(model->items, index); - icon_animation_start(item->icon); - - model->position = index; + size_t position = 0; + MenuItemArray_it_t it; + for(MenuItemArray_it(it, model->items); !MenuItemArray_end_p(it); + MenuItemArray_next(it)) { + if(index == MenuItemArray_cref(it)->index) { + break; + } + position++; } + + const size_t items_size = MenuItemArray_size(model->items); + + if(position >= items_size) { + position = 0; + } + + model->position = position; }, true); } @@ -676,7 +723,7 @@ static void menu_process_up(Menu* menu) { } }, false); - menu_set_selected_item(menu, position); + menu_set_position(menu, position); } static void menu_process_down(Menu* menu) { @@ -718,7 +765,7 @@ static void menu_process_down(Menu* menu) { } }, false); - menu_set_selected_item(menu, position); + menu_set_position(menu, position); } static void menu_process_left(Menu* menu) { @@ -777,7 +824,7 @@ static void menu_process_left(Menu* menu) { } }, false); - menu_set_selected_item(menu, position); + menu_set_position(menu, position); } static void menu_process_right(Menu* menu) { @@ -841,7 +888,7 @@ static void menu_process_right(Menu* menu) { } }, false); - menu_set_selected_item(menu, position); + menu_set_position(menu, position); } static void menu_process_ok(Menu* menu) { diff --git a/applications/services/gui/modules/menu.h b/applications/services/gui/modules/menu.h index 616bfcebe..453c3f371 100644 --- a/applications/services/gui/modules/menu.h +++ b/applications/services/gui/modules/menu.h @@ -61,6 +61,14 @@ void menu_add_item( */ void menu_reset(Menu* menu); +/** Get current menu item + * + * @param menu Menu instance + * + * @return Index of the selected item + */ +uint32_t menu_get_selected_item(Menu* menu); + /** Set current menu item * * @param menu Menu instance diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 169c08b02..56575f36d 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -2573,6 +2573,7 @@ Function,+,memset,void*,"void*, int, size_t" Function,+,menu_add_item,void,"Menu*, const char*, const Icon*, uint32_t, MenuItemCallback, void*" Function,+,menu_alloc,Menu*, Function,+,menu_free,void,Menu* +Function,+,menu_get_selected_item,uint32_t,Menu* Function,+,menu_get_view,View*,Menu* Function,+,menu_reset,void,Menu* Function,+,menu_set_selected_item,void,"Menu*, uint32_t"