main menu: Add the ability to hide and reorder the main menu items.

To change the shown menu items add the line "root_menu_order:<items>" into your config.cfg
<items> can be any of:
bookmarks, files, database, wps, settings, recording, radio, playlists, plugins, system_menu, shortcuts

Manual entry by Alexander Levin

Change-Id: Ie7f4bfb0f795184de094d05fc341a6cedd1c0cde
Reviewed-on: http://gerrit.rockbox.org/104
Reviewed-by: Jonathan Gordon <rockbox@jdgordon.info>
This commit is contained in:
Jonathan Gordon 2012-02-09 21:21:40 +11:00
parent 8125877f60
commit 13412f67ca
5 changed files with 142 additions and 13 deletions

View file

@ -477,26 +477,118 @@ static int do_shutdown(void)
MENUITEM_FUNCTION(do_shutdown_item, 0, ID2P(LANG_SHUTDOWN),
do_shutdown, NULL, NULL, Icon_NOICON);
#endif
MAKE_MENU(root_menu_, ID2P(LANG_ROCKBOX_TITLE),
item_callback, Icon_Rockbox,
&bookmarks, &file_browser,
struct menu_item_ex root_menu_;
static struct menu_callback_with_desc root_menu_desc = {
item_callback, ID2P(LANG_ROCKBOX_TITLE), Icon_Rockbox };
struct menu_table {
char *string;
const struct menu_item_ex *item;
};
static struct menu_table menu_table[] = {
/* Order here represents the default ordering */
{ "bookmarks", &bookmarks },
{ "files", &file_browser },
#ifdef HAVE_TAGCACHE
&db_browser,
{ "database", &db_browser },
#endif
&wps_item, &menu_,
{ "wps", &wps_item },
{ "settings", &menu_ },
#ifdef HAVE_RECORDING
&rec,
{ "recording", &rec },
#endif
#if CONFIG_TUNER
&fm,
{ "radio", &fm },
#endif
&playlists, &rocks_browser, &system_menu_
{ "playlists", &playlists },
{ "plugins", &rocks_browser },
{ "system_menu", &system_menu_ },
#if CONFIG_KEYPAD == PLAYER_PAD
,&do_shutdown_item
{ "shutdown", &do_shutdown_item },
#endif
,&shortcut_menu
);
{ "shortcuts", &shortcut_menu },
};
#define MAX_MENU_ITEMS (sizeof(menu_table) / sizeof(struct menu_table))
static struct menu_item_ex *root_menu__[MAX_MENU_ITEMS];
void root_menu_load_from_cfg(void* setting, char *value)
{
char *next = value, *start;
unsigned int menu_item_count = 0, i;
bool main_menu_added = false;
root_menu_.flags = MENU_HAS_DESC | MT_MENU;
root_menu_.submenus = (const struct menu_item_ex **)&root_menu__;
root_menu_.callback_and_desc = &root_menu_desc;
while (next && menu_item_count < MAX_MENU_ITEMS)
{
start = next;
next = strchr(next, ',');
if (next)
{
*next = '\0';
next++;
}
for (i=0; i<MAX_MENU_ITEMS; i++)
{
if (*start && !strcmp(start, menu_table[i].string))
{
root_menu__[menu_item_count++] = (struct menu_item_ex *)menu_table[i].item;
if (menu_table[i].item == &menu_)
main_menu_added = true;
break;
}
}
}
if (!main_menu_added)
root_menu__[menu_item_count++] = (struct menu_item_ex *)&menu_;
root_menu_.flags |= MENU_ITEM_COUNT(menu_item_count);
*(int*)setting = 1;
}
char* root_menu_write_to_cfg(void* setting, char*buf, int buf_len)
{
(void)setting;
unsigned i, written, j;
for (i = 0; i < MENU_GET_COUNT(root_menu_.flags); i++)
{
for (j=0; j<MAX_MENU_ITEMS; j++)
{
if (menu_table[j].item == root_menu__[i])
{
written = snprintf(buf, buf_len, "%s,", menu_table[j].string);
buf_len -= written;
buf += written;
break;
}
}
}
return buf;
}
void root_menu_set_default(void* setting, void* defaultval)
{
unsigned i;
(void)defaultval;
root_menu_.flags = MENU_HAS_DESC | MT_MENU;
root_menu_.submenus = (const struct menu_item_ex **)&root_menu__;
root_menu_.callback_and_desc = &root_menu_desc;
for (i=0; i<MAX_MENU_ITEMS; i++)
{
root_menu__[i] = (struct menu_item_ex *)menu_table[i].item;
}
root_menu_.flags |= MENU_ITEM_COUNT(MAX_MENU_ITEMS);
*(int*)setting = 0;
}
bool root_menu_is_changed(void* setting, void* defaultval)
{
(void)defaultval;
return *(int*)setting != 0;
}
static int item_callback(int action, const struct menu_item_ex *this_item)
{

View file

@ -61,8 +61,15 @@ enum {
GO_TO_SHORTCUTMENU
};
extern const struct menu_item_ex root_menu_;
extern struct menu_item_ex root_menu_;
extern void previous_music_is_wps(void);
void root_menu_load_from_cfg(void* setting, char *value);
char* root_menu_write_to_cfg(void* setting, char*buf, int buf_len);
void root_menu_set_default(void* setting, void* defaultval);
bool root_menu_is_changed(void* setting, void* defaultval);
#endif /* __ROOT_MENU_H__ */

View file

@ -844,6 +844,8 @@ struct user_settings
#endif
char start_directory[MAX_PATHNAME+1];
/* status setting for the root menu customisability. 0 = default, 1 = loaded from cfg */
int root_menu;
};
/** global variables **/

View file

@ -1921,6 +1921,11 @@ const struct settings_list settings[] = {
"resume rewind", UNIT_SEC, 0, 60, 5,
NULL, NULL, NULL),
#endif
CUSTOM_SETTING(0, root_menu,
LANG_ROCKBOX_TITLE, /* lang string here is never actually used */
NULL, "root_menu_order",
root_menu_load_from_cfg, root_menu_write_to_cfg,
root_menu_is_changed, root_menu_set_default),
};
const int nb_settings = sizeof(settings)/sizeof(*settings);

View file

@ -2,6 +2,29 @@
\chapter{Advanced Topics}
\section{\label{ref:CustomisingUI}Customising the User Interface}
\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. To accomplish this, the file \fname{/.rockbox/config.cfg} must
be edited (presumably on the computer while the \dap{} is connected to it
via USB). There, the line starting with \config{root\_menu\_order:} must
be edited (or created if it is not present yet).
The line should look like \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{database}{\config{database}, }%
\config{wps}, \config{settings}, \opt{recording}{\config{recording}, }%
\opt{radio}{\config{radio}, }\config{playlists}, \config{plugins},
\config{system\_menu}, \opt{PLAYER_PAD}{\config{shutdown}, }\config{shortcuts}.
Each of the words, if it occurs in the list, activates the appropriate item
in the main menu. The order of the items is given by the order of the words
in the list. The items whose words do not occur in the list will be hidden,
with one exception: the menu item ``Settings'' will be shown even if its word
is not in the list (it is added as the last item then).
Only the main menu can be customised this way, submenus can not.
\opt{lcd_bitmap}{
\subsection{\label{ref:GettingExtras}Getting Extras}