summaryrefslogtreecommitdiff
path: root/apps/menu.c
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2007-02-19 02:14:51 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2007-02-19 02:14:51 +0000
commit2801a87d543f38cadd076330f329c84e23852997 (patch)
tree480e1ed1826bde58452939527432900b0b1172bd /apps/menu.c
parentf98c27f60ff9090769a9530a969d57ecd8965396 (diff)
downloadrockbox-2801a87d543f38cadd076330f329c84e23852997.zip
rockbox-2801a87d543f38cadd076330f329c84e23852997.tar.gz
rockbox-2801a87d543f38cadd076330f329c84e23852997.tar.bz2
rockbox-2801a87d543f38cadd076330f329c84e23852997.tar.xz
Convert the EQ menus
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12398 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/menu.c')
-rw-r--r--apps/menu.c232
1 files changed, 126 insertions, 106 deletions
diff --git a/apps/menu.c b/apps/menu.c
index 6728481..a455674 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -290,7 +290,7 @@ static int current_subitems_count = 0;
void get_menu_callback(const struct menu_item_ex *m,
menu_callback_type *menu_callback)
{
- if (m->flags&MENU_HAS_DESC)
+ if (m->flags&(MENU_HAS_DESC|MENU_DYNAMIC_DESC))
*menu_callback= m->callback_and_desc->menu_callback;
else
*menu_callback = m->menu_callback;
@@ -318,6 +318,11 @@ static char * get_menu_item_name(int selected_item,void * data, char *buffer)
}
menu = menu->submenus[selected_item];
+
+ if (menu->flags&MENU_DYNAMIC_DESC)
+ return menu->menu_get_name_and_icon->list_get_name(selected_item,
+ menu->menu_get_name_and_icon->list_get_name_data, buffer);
+
type = (menu->flags&MENU_TYPE_MASK);
if (type == MT_SETTING)
{
@@ -333,26 +338,32 @@ static char * get_menu_item_name(int selected_item,void * data, char *buffer)
static void menu_get_icon(int selected_item, void * data, ICON * icon)
{
const struct menu_item_ex *menu = (const struct menu_item_ex *)data;
+ ICON menu_icon = NOICON;
selected_item = get_menu_selection(selected_item, menu);
menu = menu->submenus[selected_item];
+ if (menu->flags&MENU_HAS_DESC)
+ menu_icon = menu->callback_and_desc->icon;
+ else if (menu->flags&MENU_DYNAMIC_DESC)
+ menu_icon = menu->menu_get_name_and_icon->icon;
+
switch (menu->flags&MENU_TYPE_MASK)
{
case MT_SETTING:
*icon = bitmap_icons_6x8[Icon_Menu_setting];
break;
case MT_MENU:
- if (menu->callback_and_desc->icon == NOICON)
+ if (menu_icon == NOICON)
*icon = bitmap_icons_6x8[Icon_Submenu];
- else
- *icon = menu->callback_and_desc->icon;
+ else
+ *icon = menu_icon;
break;
case MT_FUNCTION_CALL:
case MT_FUNCTION_WITH_PARAM:
- if (menu->callback_and_desc->icon == NOICON)
+ if (menu_icon == NOICON)
*icon = bitmap_icons_6x8[Icon_Menu_functioncall];
else
- *icon = menu->callback_and_desc->icon;
+ *icon = menu_icon;
break;
default:
*icon = NOICON;
@@ -432,6 +443,113 @@ static void talk_menu_item(const struct menu_item_ex *menu,
}
}
#define MAX_OPTIONS 32
+/* returns true if the menu needs to be redrwan */
+bool do_setting_from_menu(const struct menu_item_ex *temp)
+{
+ int setting_id;
+ const struct settings_list *setting = find_setting(
+ temp->variable,
+ &setting_id);
+ bool ret_val = false;
+ if (setting)
+ {
+ if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING)
+ {
+ bool temp_var, *var;
+ bool show_icons = global_settings.show_icons;
+ if (setting->flags&F_TEMPVAR)
+ {
+ temp_var = *(bool*)setting->setting;
+ var = &temp_var;
+ }
+ else
+ {
+ var = (bool*)setting->setting;
+ }
+ set_bool_options(str(setting->lang_id),var,
+ STR(setting->bool_setting->lang_yes),
+ STR(setting->bool_setting->lang_no),
+ setting->bool_setting->option_callback);
+ if (setting->flags&F_TEMPVAR)
+ *(bool*)setting->setting = temp_var;
+ if (show_icons != global_settings.show_icons)
+ ret_val = true;
+ }
+ else if (setting->flags&F_T_SOUND)
+ {
+ set_sound(str(setting->lang_id), setting->setting,
+ setting->sound_setting->setting);
+ }
+ else /* other setting, must be an INT type */
+ {
+ int temp_var, *var;
+ if (setting->flags&F_TEMPVAR)
+ {
+ temp_var = *(int*)setting->setting;
+ var = &temp_var;
+ }
+ else
+ {
+ var = (int*)setting->setting;
+ }
+ if (setting->flags&F_INT_SETTING)
+ {
+ set_int_ex(str(setting->lang_id),
+ NULL,
+ setting->int_setting->unit,var,
+ setting->int_setting->option_callback,
+ setting->int_setting->step,
+ setting->int_setting->min,
+ setting->int_setting->max,
+ setting->int_setting->formatter,
+ setting->int_setting->get_talk_id);
+ }
+ else if (setting->flags&F_CHOICE_SETTING)
+ {
+ static struct opt_items options[MAX_OPTIONS];
+ char buffer[256];
+ char *buf_start = buffer;
+ int buf_free = 256;
+ int i,j, count = setting->choice_setting->count;
+ for (i=0, j=0; i<count && i<MAX_OPTIONS; i++)
+ {
+ if (setting->flags&F_CHOICETALKS)
+ {
+ if (cfg_int_to_string(setting_id, i,
+ buf_start, buf_free))
+ {
+ int len = strlen(buf_start) +1;
+ options[j].string = buf_start;
+ buf_start += len;
+ buf_free -= len;
+ options[j].voice_id =
+ setting->choice_setting->talks[i];
+ j++;
+ }
+ }
+ else
+ {
+ options[j].string =
+ P2STR(setting->
+ choice_setting->desc[i]);
+ options[j].voice_id =
+ P2ID(setting->
+ choice_setting->desc[i]);
+ j++;
+ }
+ }
+ set_option(str(setting->lang_id), var, INT,
+ options,j,
+ setting->
+ choice_setting->option_callback);
+ }
+ if (setting->flags&F_TEMPVAR)
+ *(int*)setting->setting = temp_var;
+ }
+ }
+ return ret_val;
+}
+
int do_menu(const struct menu_item_ex *start_menu)
{
int action;
@@ -551,106 +669,8 @@ int do_menu(const struct menu_item_ex *start_menu)
break;
case MT_SETTING:
{
- int setting_id;
- const struct settings_list *setting = find_setting(
- temp->variable,
- &setting_id);
- if (setting)
- {
- if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING)
- {
- bool temp_var, *var;
- bool show_icons = global_settings.show_icons;
- if (setting->flags&F_TEMPVAR)
- {
- temp_var = *(bool*)setting->setting;
- var = &temp_var;
- }
- else
- {
- var = (bool*)setting->setting;
- }
- set_bool_options(str(setting->lang_id),var,
- STR(setting->bool_setting->lang_yes),
- STR(setting->bool_setting->lang_no),
- setting->bool_setting->option_callback);
- if (setting->flags&F_TEMPVAR)
- *(bool*)setting->setting = temp_var;
- if (show_icons != global_settings.show_icons)
- init_menu_lists(menu, &lists, 0, true);
- }
- else if (setting->flags&F_T_SOUND)
- {
- set_sound(str(setting->lang_id), setting->setting,
- setting->sound_setting->setting);
- }
- else /* other setting, must be an INT type */
- {
- int temp_var, *var;
- if (setting->flags&F_TEMPVAR)
- {
- temp_var = *(int*)setting->setting;
- var = &temp_var;
- }
- else
- {
- var = (int*)setting->setting;
- }
- if (setting->flags&F_INT_SETTING)
- {
- set_int_ex(str(setting->lang_id),
- NULL,
- setting->int_setting->unit,var,
- setting->int_setting->option_callback,
- setting->int_setting->step,
- setting->int_setting->min,
- setting->int_setting->max,
- setting->int_setting->formatter,
- setting->int_setting->get_talk_id);
- }
- else if (setting->flags&F_CHOICE_SETTING)
- {
- static struct opt_items options[MAX_OPTIONS];
- char buffer[256];
- char *buf_start = buffer;
- int buf_free = 256;
- int i,j, count = setting->choice_setting->count;
- for (i=0, j=0; i<count && i<MAX_OPTIONS; i++)
- {
- if (setting->flags&F_CHOICETALKS)
- {
- if (cfg_int_to_string(setting_id, i,
- buf_start, buf_free))
- {
- int len = strlen(buf_start) +1;
- options[j].string = buf_start;
- buf_start += len;
- buf_free -= len;
- options[j].voice_id =
- setting->choice_setting->talks[i];
- j++;
- }
- }
- else
- {
- options[j].string =
- P2STR(setting->
- choice_setting->desc[i]);
- options[j].voice_id =
- P2ID(setting->
- choice_setting->desc[i]);
- j++;
- }
- }
- set_option(str(setting->lang_id), var, INT,
- options,j,
- setting->
- choice_setting->option_callback);
- }
- if (setting->flags&F_TEMPVAR)
- *(int*)setting->setting = temp_var;
- }
- }
+ if (do_setting_from_menu(temp))
+ init_menu_lists(menu, &lists, 0, true);
break;
}
case MT_RETURN_ID: