Allow settings to have a different title in the setting screen than they 
have in the menu.
Fixes the scroll speed/step settings


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12572 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/menu.c b/apps/menu.c
index 98cce52..df786dd 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -334,12 +334,12 @@
     
     menu = menu->submenus[selected_item];
     
-    if (menu->flags&MENU_DYNAMIC_DESC)
+    if ((menu->flags&MENU_DYNAMIC_DESC) && (type != MT_SETTING_W_TEXT))
         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)
+    if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT))
     {
         const struct settings_list *v
                 = find_setting(menu->variable, NULL);
@@ -353,7 +353,7 @@
 static void menu_get_icon(int selected_item, void * data, ICON * icon)
 {
     const struct menu_item_ex *menu = (const struct menu_item_ex *)data;
-    int menu_icon;
+    int menu_icon = Icon_NOICON;
     selected_item = get_menu_selection(selected_item, menu);
     
     menu = menu->submenus[selected_item];
@@ -365,6 +365,7 @@
     switch (menu->flags&MENU_TYPE_MASK)
     {
         case MT_SETTING:
+        case MT_SETTING_W_TEXT:
             *icon = bitmap_icons_6x8[Icon_Menu_setting];
             break;
         case MT_MENU:
@@ -438,12 +439,14 @@
                     struct gui_synclist *lists)
 {
     int id = -1;
+    int type;
     if (global_settings.talk_menu)
     {
         int sel = get_menu_selection(gui_synclist_get_sel_pos(lists),menu);
         if ((menu->flags&MENU_TYPE_MASK) == MT_MENU)
         {
-            if ((menu->submenus[sel]->flags&MENU_TYPE_MASK) == MT_SETTING)
+            type = menu->submenus[sel]->flags&MENU_TYPE_MASK;
+            if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT))
                 talk_setting(menu->submenus[sel]->variable);
             else 
             {
@@ -463,8 +466,14 @@
                                                temp->variable,
                                                &setting_id);
     bool ret_val = false;
+    unsigned char *title;
     if (setting)
     {
+        if ((temp->flags&MENU_TYPE_MASK) == MT_SETTING_W_TEXT)
+            title = temp->callback_and_desc->desc;
+        else
+            title = ID2P(setting->lang_id);
+
         if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING)
         {
             bool temp_var, *var;
@@ -478,7 +487,7 @@
             {
                 var = (bool*)setting->setting;
             }
-            set_bool_options(str(setting->lang_id),var,
+            set_bool_options(P2STR(title), var,
                         STR(setting->bool_setting->lang_yes),
                         STR(setting->bool_setting->lang_no),
                         setting->bool_setting->option_callback);
@@ -489,7 +498,7 @@
         }
         else if (setting->flags&F_T_SOUND)
         {
-            set_sound(str(setting->lang_id), setting->setting,
+            set_sound(P2STR(title), setting->setting,
                         setting->sound_setting->setting);
         }
         else /* other setting, must be an INT type */
@@ -519,8 +528,7 @@
                     min = setting->int_setting->min;
                     step = setting->int_setting->step;
                 }
-                set_int_ex(str(setting->lang_id),
-                        NULL,
+                set_int_ex(P2STR(title), NULL,
                         setting->int_setting->unit,var,
                         setting->int_setting->option_callback,
                         step, min, max,
@@ -561,7 +569,7 @@
                         j++;
                     }
                 }
-                set_option(str(setting->lang_id), var, INT,
+                set_option(P2STR(title), var, INT,
                             options,j,
                             setting->
                                choice_setting->option_callback);
@@ -721,6 +729,7 @@
                                     temp->func_with_param->param);
                     break;
                 case MT_SETTING:
+                case MT_SETTING_W_TEXT:
                 {
                     if (do_setting_from_menu(temp))
                         init_menu_lists(menu, &lists, 0, true);
diff --git a/apps/menu.h b/apps/menu.h
index f5bc2dd..fa5d7e5 100644
--- a/apps/menu.h
+++ b/apps/menu.h
@@ -60,6 +60,9 @@
 enum menu_item_type {
     MT_MENU = 0,
     MT_SETTING,
+    MT_SETTING_W_TEXT, /* same as setting, but uses different
+                          text for the setting title,
+                          ID2P() or "literal" for the str param */
     MT_FUNCTION_CALL, /* used when the standard code wont work */
     MT_FUNCTION_WITH_PARAM,
     MT_RETURN_ID, /* returns the position of the selected item (starting at 0)*/
@@ -134,6 +137,14 @@
     static const struct menu_item_ex name =                  \
         {MT_SETTING, {.variable = (void*)var},{callback}};
 
+/*  Use this for settings which have a differnt title in their
+    setting screen than in the menu (e.g scroll options */
+#define MENUITEM_SETTING_W_TEXT(name, var, str, callback )              \
+    static const struct menu_callback_with_desc name##__ = {callback,str, Icon_NOICON};\
+    static const struct menu_item_ex name =                             \
+        {MT_SETTING_W_TEXT|MENU_HAS_DESC, {.variable = (void*)var },     \
+            {.callback_and_desc = & name##__}};
+
 /*  Use this To create a list of NON-XLATABLE (for the time being) Strings
     When the user enters this list and selects one, the menu will exits
     and its return value will be the index of the chosen item */
diff --git a/apps/menus/display_menu.c b/apps/menus/display_menu.c
index 26eac23..1cd6f0e 100644
--- a/apps/menus/display_menu.c
+++ b/apps/menus/display_menu.c
@@ -279,16 +279,20 @@
 
 /***********************************/
 /*    SCROLL MENU                  */
-MENUITEM_SETTING(scroll_speed, &global_settings.scroll_speed, NULL);
+MENUITEM_SETTING_W_TEXT(scroll_speed, &global_settings.scroll_speed,
+                         ID2P(LANG_SCROLL), NULL);
 MENUITEM_SETTING(scroll_delay, &global_settings.scroll_delay, NULL);
 #ifdef HAVE_LCD_BITMAP
-MENUITEM_SETTING(scroll_step, &global_settings.scroll_step, NULL);
+MENUITEM_SETTING_W_TEXT(scroll_step, &global_settings.scroll_step,
+                        ID2P(LANG_SCROLL_STEP_EXAMPLE), NULL);
 #endif
 MENUITEM_SETTING(bidir_limit, &global_settings.bidir_limit, NULL);
 #ifdef HAVE_REMOTE_LCD
-MENUITEM_SETTING(remote_scroll_speed, &global_settings.remote_scroll_speed, NULL);
+MENUITEM_SETTING_W_TEXT(remote_scroll_speed, &global_settings.remote_scroll_speed,
+                         ID2P(LANG_SCROLL), NULL);
 MENUITEM_SETTING(remote_scroll_delay, &global_settings.remote_scroll_delay, NULL);
-MENUITEM_SETTING(remote_scroll_step, &global_settings.remote_scroll_step, NULL);
+MENUITEM_SETTING_W_TEXT(remote_scroll_step, &global_settings.remote_scroll_step,
+                        ID2P(LANG_SCROLL_STEP_EXAMPLE), NULL);
 MENUITEM_SETTING(remote_bidir_limit, &global_settings.remote_bidir_limit, NULL);
 MAKE_MENU(remote_scroll_sets, ID2P(LANG_REMOTE_SCROLL_SETS), 0, Icon_NOICON,
           &remote_scroll_speed, &remote_scroll_delay,