GUI: Menu fix set_selected_item(), add get_selected_item()

This commit is contained in:
Willy-JL
2024-07-12 23:35:27 +01:00
parent e4db9ec84e
commit ebca3024d9
4 changed files with 72 additions and 14 deletions

View File

@@ -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)

View File

@@ -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) {

View File

@@ -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

View File

@@ -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"
1 entry status name type params
2573 Function + menu_add_item void Menu*, const char*, const Icon*, uint32_t, MenuItemCallback, void*
2574 Function + menu_alloc Menu*
2575 Function + menu_free void Menu*
2576 Function + menu_get_selected_item uint32_t Menu*
2577 Function + menu_get_view View* Menu*
2578 Function + menu_reset void Menu*
2579 Function + menu_set_selected_item void Menu*, uint32_t