mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 10:37:38 -04:00
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:
parent
8125877f60
commit
13412f67ca
5 changed files with 142 additions and 13 deletions
116
apps/root_menu.c
116
apps/root_menu.c
|
@ -477,26 +477,118 @@ static int do_shutdown(void)
|
||||||
MENUITEM_FUNCTION(do_shutdown_item, 0, ID2P(LANG_SHUTDOWN),
|
MENUITEM_FUNCTION(do_shutdown_item, 0, ID2P(LANG_SHUTDOWN),
|
||||||
do_shutdown, NULL, NULL, Icon_NOICON);
|
do_shutdown, NULL, NULL, Icon_NOICON);
|
||||||
#endif
|
#endif
|
||||||
MAKE_MENU(root_menu_, ID2P(LANG_ROCKBOX_TITLE),
|
|
||||||
item_callback, Icon_Rockbox,
|
struct menu_item_ex root_menu_;
|
||||||
&bookmarks, &file_browser,
|
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
|
#ifdef HAVE_TAGCACHE
|
||||||
&db_browser,
|
{ "database", &db_browser },
|
||||||
#endif
|
#endif
|
||||||
&wps_item, &menu_,
|
{ "wps", &wps_item },
|
||||||
|
{ "settings", &menu_ },
|
||||||
#ifdef HAVE_RECORDING
|
#ifdef HAVE_RECORDING
|
||||||
&rec,
|
{ "recording", &rec },
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_TUNER
|
#if CONFIG_TUNER
|
||||||
&fm,
|
{ "radio", &fm },
|
||||||
#endif
|
#endif
|
||||||
&playlists, &rocks_browser, &system_menu_
|
{ "playlists", &playlists },
|
||||||
|
{ "plugins", &rocks_browser },
|
||||||
|
{ "system_menu", &system_menu_ },
|
||||||
#if CONFIG_KEYPAD == PLAYER_PAD
|
#if CONFIG_KEYPAD == PLAYER_PAD
|
||||||
,&do_shutdown_item
|
{ "shutdown", &do_shutdown_item },
|
||||||
#endif
|
#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)
|
static int item_callback(int action, const struct menu_item_ex *this_item)
|
||||||
{
|
{
|
||||||
|
|
|
@ -61,8 +61,15 @@ enum {
|
||||||
GO_TO_SHORTCUTMENU
|
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);
|
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__ */
|
#endif /* __ROOT_MENU_H__ */
|
||||||
|
|
|
@ -844,6 +844,8 @@ struct user_settings
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char start_directory[MAX_PATHNAME+1];
|
char start_directory[MAX_PATHNAME+1];
|
||||||
|
/* status setting for the root menu customisability. 0 = default, 1 = loaded from cfg */
|
||||||
|
int root_menu;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** global variables **/
|
/** global variables **/
|
||||||
|
|
|
@ -1921,6 +1921,11 @@ const struct settings_list settings[] = {
|
||||||
"resume rewind", UNIT_SEC, 0, 60, 5,
|
"resume rewind", UNIT_SEC, 0, 60, 5,
|
||||||
NULL, NULL, NULL),
|
NULL, NULL, NULL),
|
||||||
#endif
|
#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);
|
const int nb_settings = sizeof(settings)/sizeof(*settings);
|
||||||
|
|
|
@ -2,6 +2,29 @@
|
||||||
\chapter{Advanced Topics}
|
\chapter{Advanced Topics}
|
||||||
|
|
||||||
\section{\label{ref:CustomisingUI}Customising the User Interface}
|
\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}{
|
\opt{lcd_bitmap}{
|
||||||
\subsection{\label{ref:GettingExtras}Getting Extras}
|
\subsection{\label{ref:GettingExtras}Getting Extras}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue