From 5efb6d7facfda7034ca7dbc96a4c52b461e5ada3 Mon Sep 17 00:00:00 2001 From: Christian Soffke Date: Sat, 19 Apr 2025 02:16:58 +0200 Subject: [PATCH] Settings menu: add main menu customization Lets you launch the main_menu_config plugin from Settings, so that it remains accessible, even after all other menu items have been hidden. Includes minor changes to the main menu config plugin, so that it better fits in with the rest of the settings menus: * Keep theme enabled * Autosave * Add "On" or "Off" suffix to each item, to prevent confusion when Icon_Config is blank, as is the case with certain iconsets * Update current selection after swapping items * Prefix spoken selection with row number for enhanced clarity when swapping items * Change title to LANG_MAIN_MENU * ACTION_STD_OK to toggle an item's visibility * ACTION_STD_CONTEXT to access options for reordering menu items, or for reverting to the default menu * Ask for confirmation before reverting Change-Id: I74240b94243224c76e23ef8f3a0559bd8ba28df0 --- apps/lang/english.lang | 14 ++--- apps/menus/main_menu.c | 10 ++++ apps/plugin.c | 3 +- apps/plugins/main_menu_config.c | 91 ++++++++++++++++++----------- manual/advanced_topics/main.tex | 13 ++--- manual/main_menu/main.tex | 16 +++++ manual/plugins/main_menu_config.tex | 17 +----- 7 files changed, 99 insertions(+), 65 deletions(-) diff --git a/apps/lang/english.lang b/apps/lang/english.lang index f0be657565..6e5179bbf0 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -14152,16 +14152,16 @@ id: LANG_TOGGLE_ITEM - desc: in main_menu_config + desc: deprecated user: core - *: "Toggle Item" + *: "" - *: "Toggle Item" + *: "" - *: "Toggle Item" + *: "" @@ -14222,13 +14222,13 @@ id: LANG_MAIN_MENU_ORDER - desc: main_menu_config plugin title + desc: deprecated user: core - *: "Rockbox Main Menu Order" + *: "" - *: "Rockbox Main Menu Order" + *: "" *: "" diff --git a/apps/menus/main_menu.c b/apps/menus/main_menu.c index f16fce9487..8805b52944 100644 --- a/apps/menus/main_menu.c +++ b/apps/menus/main_menu.c @@ -495,6 +495,15 @@ MAKE_MENU(info_menu, ID2P(LANG_SYSTEM), 0, Icon_System_menu, /* INFO MENU */ /***********************************/ +static int main_menu_config(void) +{ + plugin_load(PLUGIN_APPS_DIR "/main_menu_config.rock", NULL); + return 0; +} + +MENUITEM_FUNCTION(main_menu_config_item, 0, ID2P(LANG_MAIN_MENU), + main_menu_config, NULL, Icon_Rockbox); + /***********************************/ /* MAIN MENU */ @@ -509,6 +518,7 @@ MAKE_MENU(main_menu_, ID2P(LANG_SETTINGS), NULL, #if CONFIG_RTC &timedate_item, #endif + &main_menu_config_item, &manage_settings, ); /* MAIN MENU */ diff --git a/apps/plugin.c b/apps/plugin.c index 87c4f1eab7..dd92791622 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -860,7 +860,8 @@ int plugin_load(const char* plugin, const void* parameter) /* for some plugins, the SBS can be left enabled */ const char *sepch = strrchr(plugin, PATH_SEPCH); - bool theme_enabled = sepch && !strcmp("properties.rock", sepch + 1); + bool theme_enabled = sepch && (!strcmp("properties.rock", sepch + 1) || + !strcmp("main_menu_config.rock", sepch + 1)); if (current_plugin_handle) { diff --git a/apps/plugins/main_menu_config.c b/apps/plugins/main_menu_config.c index b4b5813b21..c42169ad38 100644 --- a/apps/plugins/main_menu_config.c +++ b/apps/plugins/main_menu_config.c @@ -40,11 +40,14 @@ static const char * menu_get_name(int selected_item, void * data, char * buffer, size_t buffer_len) { (void)data; - (void)buffer; - (void)buffer_len; unsigned char *p = menu_items[selected_item].name; int id = P2ID(p); - return (id != -1) ? rb->str(id) : p; + + rb->snprintf(buffer, buffer_len, "%s: %s", (id != -1) ? rb->str(id) : p, + menu_items[selected_item].enabled ? + rb->str(LANG_ON) : rb->str(LANG_OFF)); + + return buffer; } static enum themable_icons menu_get_icon(int selected_item, void * data) @@ -157,7 +160,8 @@ static int menu_speak_item(int selected_item, void *data) if (id != -1) { - rb->talk_id(id, false); + rb->talk_number(selected_item + 1, false); + rb->talk_id(id, true); rb->talk_id(menu_items[selected_item].enabled ? LANG_ON : LANG_OFF, true); } @@ -172,6 +176,7 @@ enum plugin_status plugin_start(const void* parameter) rb->global_settings->show_icons = true; struct gui_synclist list; bool done = false; + bool changed = false; int action, cur_sel; menu_table = rb->root_menu_get_options(&menu_item_count); @@ -182,59 +187,72 @@ enum plugin_status plugin_start(const void* parameter) rb->gui_synclist_set_voice_callback(&list, menu_speak_item); rb->gui_synclist_set_icon_callback(&list, menu_get_icon); rb->gui_synclist_set_nb_items(&list, menu_item_count); - rb->gui_synclist_set_title(&list, rb->str(LANG_MAIN_MENU_ORDER), Icon_Rockbox); - rb->gui_synclist_draw(&list); + rb->gui_synclist_set_title(&list, rb->str(LANG_MAIN_MENU), Icon_Rockbox); rb->gui_synclist_speak_item(&list); while (!done) { + rb->gui_synclist_draw(&list); cur_sel = rb->gui_synclist_get_sel_pos(&list); - action = rb->get_action(CONTEXT_LIST,TIMEOUT_BLOCK); + action = rb->get_action(CONTEXT_LIST, HZ/10); if (rb->gui_synclist_do_button(&list, &action)) continue; switch (action) { case ACTION_STD_OK: + menu_items[cur_sel].enabled = !menu_items[cur_sel].enabled; + rb->gui_synclist_speak_item(&list); + changed = true; + break; + case ACTION_STD_CONTEXT: { - MENUITEM_STRINGLIST(menu, "Main Menu Editor", NULL, - ID2P(LANG_TOGGLE_ITEM), + MENUITEM_STRINGLIST(menu, ID2P(LANG_MAIN_MENU), NULL, ID2P(LANG_MOVE_ITEM_UP), ID2P(LANG_MOVE_ITEM_DOWN), - "----------", - ID2P(LANG_LOAD_DEFAULT_CONFIGURATION), - ID2P(LANG_SAVE_EXIT)); + ID2P(LANG_LOAD_DEFAULT_CONFIGURATION)); switch (rb->do_menu(&menu, NULL, NULL, false)) { case 0: - menu_items[cur_sel].enabled = !menu_items[cur_sel].enabled; + if (cur_sel == 0) + { + rb->splash(HZ, ID2P(LANG_FAILED)); + break; + } + swap_items(cur_sel, cur_sel - 1); + rb->gui_synclist_select_item(&list, cur_sel - 1); /* speaks */ + changed = true; break; case 1: - if (cur_sel == 0) - break; - swap_items(cur_sel, cur_sel - 1); - break; - case 2: if (cur_sel + 1 == menu_item_count) + { + rb->splash(HZ, ID2P(LANG_FAILED)); break; + } swap_items(cur_sel, cur_sel + 1); + rb->gui_synclist_select_item(&list, cur_sel + 1); /* speaks */ + changed = true; break; - case 4: - rb->root_menu_set_default(&rb->global_settings->root_menu_customized, NULL); - load_from_cfg(); - break; - case 5: - done = true; - save_to_cfg(); - rb->global_settings->root_menu_customized = true; - rb->settings_save(); - break; - } - if (!done) - { - rb->gui_synclist_draw(&list); - rb->gui_synclist_speak_item(&list); + case 2:; + static const char *lines[] = + {ID2P(LANG_RESET_ASK), ID2P(LANG_LOAD_DEFAULT_CONFIGURATION)}; + static const struct text_message message={lines, 2}; + + switch(rb->gui_syncyesno_run(&message, NULL, NULL)) + { + case YESNO_YES: + rb->root_menu_set_default(&rb->global_settings->root_menu_customized, NULL); + load_from_cfg(); + break; + default: + rb->splash(HZ, ID2P(LANG_CANCEL)); + break; + } + /* fall-through */ + default: + rb->gui_synclist_speak_item(&list); } + rb->gui_synclist_set_title(&list, rb->str(LANG_MAIN_MENU), Icon_Rockbox); break; } case ACTION_STD_CANCEL: @@ -243,6 +261,13 @@ enum plugin_status plugin_start(const void* parameter) } } + if (changed) + { + save_to_cfg(); + rb->global_settings->root_menu_customized = true; + rb->settings_save(); + } rb->global_settings->show_icons = show_icons; + return PLUGIN_OK; } diff --git a/manual/advanced_topics/main.tex b/manual/advanced_topics/main.tex index 7d6bb0ae0b..93ca3fccd0 100755 --- a/manual/advanced_topics/main.tex +++ b/manual/advanced_topics/main.tex @@ -5,10 +5,11 @@ \subsection{\label{ref:CustomisingTheMainMenu}Customising The Main Menu} -It is possible to customise the main menu, i.e. to reorder or to hide some -of its items (only the main menu can be customised, submenus can not). -To accomplish this, load a \fname{.cfg} file (as described in -\reference{ref:manage_settings}) containing the following line: +The easiest way to reorder or to hide menu items is via the settings menu +(see \reference{ref:main_menu_config}). + +To accomplish this using a text editor instead, load a \fname{.cfg} file +(as described in \reference{ref:manage_settings}) containing the following line: \config{root~menu~order:items}, where ``items'' is a comma separated list (no spaces around the commas!) of the following words: \config{bookmarks}, \config{files}, \opt{tagcache}{\config{database}, }% @@ -32,10 +33,6 @@ for changing the settings (the latter will be added automatically). To reset the menu items to the default, use \config{root~menu~order:-} (i.e. use a hyphen instead of ``items''). -This configuration entry can only be created and edited with a text editor or -the Main Menu Config Plugin (see \reference{ref:main_menu_config}). -It is not possible to change this setting via the settings menu. - \subsection{\label{ref:CustomisingThePlayername}Customising The Playername} Some themes show a customizable playername in the Whats Playing Screen. diff --git a/manual/main_menu/main.tex b/manual/main_menu/main.tex index a9e78a6bf8..e4c9e99130 100644 --- a/manual/main_menu/main.tex +++ b/manual/main_menu/main.tex @@ -141,6 +141,22 @@ to recording. The details of this menu are covered in detail in \reference{ref:Recordingsettings}. } +\subsection{Main Menu} +{\label{ref:main_menu_config}} +Allows you to hide or reorder items from the main menu. + +Press \ActionStdOk{} to toggle an item's visibility. + +Press \ActionStdContext{} to access the following options: +\begin{description} +\item[Move Item Up] Swap selected menu item with the previous one +\item[Move Item down] Swap selected menu item with the next one +\item[Load Default Configuration] Discard all customization +\end{description} + +For an advanced description of the associated configuration entry, +see \reference{ref:CustomisingTheMainMenu}. + \subsection{Manage Settings} The \setting{Manage Settings} option allows the saving and re-loading of user configuration settings, browsing the hard drive for alternate firmwares, and finally diff --git a/manual/plugins/main_menu_config.tex b/manual/plugins/main_menu_config.tex index b21c0020c6..40c4a1a5ca 100644 --- a/manual/plugins/main_menu_config.tex +++ b/manual/plugins/main_menu_config.tex @@ -1,17 +1,2 @@ \subsection{Main Menu Configuration} -{\label{ref:main_menu_config}} - -This plugin helps you customizing the main menu (i.e. reorder or hide menu -items). It changes the appropriate configuration file as described in -\reference{ref:CustomisingTheMainMenu}. - -When you start the plugin, the available main menu items will be displayed. -By pressing \ActionStdOk{} you open a menu with the following options: -\begin{description} -\item[Toggle Item] Hide the selected menu item or make it visible again -\item[Move Item Up] Swap the selected menu item with the previous one -\item[Move Item down] Swap the selected menu item with the next one -\item[Load Default Configuration] Discards all customization -\item[Exit] Save your changes to the configuration file and exit the plugin -\end{description} -You can leave the plugin without saving by pressing \ActionStdCancel{}. +see \reference{ref:main_menu_config}