Index: apps/gui/bitmap/list.c =================================================================== --- apps/gui/bitmap/list.c (revision 17381) +++ apps/gui/bitmap/list.c (working copy) @@ -102,7 +102,12 @@ vp_text->drawmode, 0); return true; } - + +static bool right_align_line = false; +void gui_synclist_set_right_aligned_line(bool right_align) +{ + right_align_line = right_align; +} void list_draw(struct screen *display, struct viewport *parent, struct gui_synclist *list) { @@ -177,6 +182,7 @@ char entry_buffer[MAX_PATH]; unsigned char *entry_name; int text_pos = 0; + right_align_line = false; s = list->callback_get_item_name(i, list->data, entry_buffer, sizeof(entry_buffer)); entry_name = P2STR(s); @@ -239,8 +245,26 @@ if (item_offset > item_width - (list_text[display->screen_type].width - text_pos)) { /* don't scroll */ - display->puts_style_offset(0, i-start, entry_name, - list_text[display->screen_type].drawmode, item_offset); + if (right_align_line) + { + struct viewport vp = list_text[display->screen_type]; + vp.height = font_get(vp.font)->height; + vp.width = item_width; + vp.x += (list_text[display->screen_type].width - item_width); + vp.y += (i-start)*vp.height; + /* get the selectoin bar happening */ + display->puts_style_offset(0, i-start, " ", + list_text[display->screen_type].drawmode, 0); + display->set_viewport(&vp); + display->puts_style_offset(0, 0, entry_name, + vp.drawmode, 0); + display->set_viewport(&list_text[display->screen_type]); + } + else + { + display->puts_style_offset(0, i-start, entry_name, + list_text[display->screen_type].drawmode, item_offset); + } } else { @@ -248,9 +272,24 @@ list_text[display->screen_type].drawmode, item_offset); } } + else if (right_align_line) + { + struct viewport vp = list_text[display->screen_type]; + vp.height = font_get(vp.font)->height; + vp.width = item_width; + vp.x += (list_text[display->screen_type].width - item_width); + vp.y += (i-start)*vp.height; + /* get the selectoin bar happening */ + display->puts_style_offset(0, i-start, " ", + list_text[display->screen_type].drawmode, 0); + display->set_viewport(&vp); + display->puts_style_offset(0, 0, entry_name, + vp.drawmode, 0); + display->set_viewport(&list_text[display->screen_type]); + } else display->puts_style_offset(0, i-start, entry_name, - list_text[display->screen_type].drawmode, item_offset); + list_text[display->screen_type].drawmode, item_offset); /* do the icon */ if (list->callback_get_item_icon && global_settings.show_icons) { Index: apps/gui/list.c =================================================================== --- apps/gui/list.c (revision 17381) +++ apps/gui/list.c (working copy) @@ -155,6 +155,7 @@ gui_list->data=data; gui_list->scroll_all=scroll_all; gui_list->selected_size=selected_size; + gui_list->movement_size = selected_size; gui_list->title = NULL; gui_list->title_width = 0; gui_list->title_icon = Icon_NOICON; @@ -257,7 +258,7 @@ nb_lines = viewport_get_nb_lines(&vp); /* edge case,, selected last item */ - if (gui_list->selected_item == gui_list->nb_items -1) + if (gui_list->selected_item == gui_list->nb_items - 1) { gui_list->start_item[screen] = MAX(0, gui_list->nb_items - nb_lines); } @@ -275,7 +276,7 @@ } else { - int top_of_screen = gui_list->selected_item - SCROLL_LIMIT; + int top_of_screen = gui_list->selected_item - SCROLL_LIMIT+1; int temp = MIN(top_of_screen, gui_list->nb_items - nb_lines); gui_list->start_item[screen] = MAX(0, temp); } @@ -314,6 +315,7 @@ int i; if( item_number > gui_list->nb_items-1 || item_number < 0 ) return; + gui_list->selected_item = item_number; FOR_NB_SCREENS(i) gui_list_put_selection_on_screen(gui_list, i); @@ -323,22 +325,31 @@ int offset) { int new_selection; + int last_item = gui_list->nb_items - gui_list->selected_size; if (gui_list->selected_size > 1) { - offset *= gui_list->selected_size; + offset *= gui_list->movement_size; /* always select the first item of multi-line lists */ - offset -= offset%gui_list->selected_size; + offset -= offset%gui_list->movement_size; } new_selection = gui_list->selected_item + offset; - if (new_selection >= gui_list->nb_items) + + if (new_selection > last_item) { + new_selection = gui_list->nb_items - gui_list->movement_size; + if (gui_list->selected_size > gui_list->movement_size && + new_selection > gui_list->nb_items - gui_list->selected_size) + new_selection = gui_list->nb_items - gui_list->selected_size; + gui_list->selected_item = gui_list->limit_scroll ? - gui_list->nb_items - gui_list->selected_size : 0; + new_selection : 0; } else if (new_selection < 0) { - gui_list->selected_item = gui_list->limit_scroll ? - 0 : gui_list->nb_items - gui_list->selected_size; + if (gui_list->limit_scroll) + gui_list->selected_item = 0; + else + gui_list->selected_item = gui_list->nb_items - gui_list->selected_size; } else if (gui_list->show_selection_marker == false) { @@ -360,12 +371,12 @@ if (screen_top < 0) screen_top = 0; gui_list->start_item[i] = MIN(screen_top, gui_list->start_item[i] + - gui_list->selected_size); + gui_list->movement_size); } else { gui_list->start_item[i] = MAX(0, gui_list->start_item[i] - - gui_list->selected_size); + gui_list->movement_size); } } return; Index: apps/gui/quickscreen.c =================================================================== --- apps/gui/quickscreen.c (revision 17381) +++ apps/gui/quickscreen.c (working copy) @@ -221,7 +221,7 @@ display->set_viewport(NULL); } -static int option_value(const struct settings_list *setting) +int option_value(const struct settings_list *setting) { if ((setting->flags & F_BOOL_SETTING) == F_BOOL_SETTING) { Index: apps/gui/list.h =================================================================== --- apps/gui/list.h (revision 17381) +++ apps/gui/list.h (working copy) @@ -98,6 +98,9 @@ int start_item[NB_SCREENS]; /* the item that is displayed at the top of the screen */ /* the number of lines that are selected at the same time */ int selected_size; + /* the number of items to jump when the selection changes. + by default set to selected_size */ + int movement_size; /* These are used to calculate how much of the screen content we need to redraw. */ int last_displayed_selected_item; Index: apps/menu.c =================================================================== --- apps/menu.c (revision 17381) +++ apps/menu.c (working copy) @@ -69,7 +69,7 @@ static int current_subitems[MAX_MENU_SUBITEMS]; static int current_subitems_count = 0; static int talk_menu_item(int selected_item, void *data); - +static struct gui_synclist *menulists; static void get_menu_callback(const struct menu_item_ex *m, menu_callback_type *menu_callback) { @@ -94,6 +94,23 @@ return i; return 0; } +bool menu_has_settings(const struct menu_item_ex *menu) +{ + int i, t; + const struct menu_item_ex *submenu; + for (i=0;iflags);i++) + { + submenu = menu->submenus[i]; + t = (submenu->flags&MENU_TYPE_MASK); + if (t == MT_SETTING || + t == MT_SETTING_W_TEXT) + return true; + } + return false; +} + +bool show_info_line = false; +int option_value(const struct settings_list *setting); static char * get_menu_item_name(int selected_item, void * data, char *buffer, @@ -101,7 +118,27 @@ { const struct menu_item_ex *menu = (const struct menu_item_ex *)data; int type = (menu->flags&MENU_TYPE_MASK); - selected_item = get_menu_selection(selected_item, menu); + int menu_selection = gui_synclist_get_sel_pos(menulists); + int list_line = selected_item; + if (show_info_line && selected_item <= menu_selection) + selected_item = get_menu_selection(selected_item, menu); + else if (show_info_line && selected_item == menu_selection + 1) + { + menu = menu->submenus[selected_item-1]; + type = (menu->flags&MENU_TYPE_MASK); + gui_synclist_set_right_aligned_line(true); + if (type == MT_SETTING_W_TEXT || + type == MT_SETTING) + { + const struct settings_list *setting = find_setting(menu->variable, NULL); + return option_get_valuestring(setting, + buffer, buffer_len, + option_value(setting)); + } + return "---->"; + } + else + selected_item = get_menu_selection(selected_item-(show_info_line?1:0), menu); (void)buffer_len; /* only MT_MENU or MT_RETURN_ID is allowed in here */ @@ -135,7 +172,13 @@ { const struct menu_item_ex *menu = (const struct menu_item_ex *)data; int menu_icon = Icon_NOICON; - selected_item = get_menu_selection(selected_item, menu); + int menu_selection = gui_synclist_get_sel_pos(menulists); + if (show_info_line && selected_item <= menu_selection) + selected_item = get_menu_selection(selected_item, menu); + else if (show_info_line && selected_item == menu_selection + 1) + return Icon_NOICON; + else + selected_item = get_menu_selection(selected_item-(show_info_line?1:0), menu); if ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID) { @@ -202,8 +245,9 @@ } } current_submenus_menu = (struct menu_item_ex *)menu; - - gui_synclist_init(lists,get_menu_item_name,(void*)menu,false,1, parent); + show_info_line = menu_has_settings(menu); + gui_synclist_init(lists,get_menu_item_name,(void*)menu,false,show_info_line?2:1, parent); + lists->movement_size = 1; #ifdef HAVE_LCD_BITMAP if (menu->callback_and_desc->icon_id == Icon_NOICON) icon = Icon_Submenu_Entered; @@ -217,7 +261,7 @@ #endif if(global_settings.talk_menu) gui_synclist_set_voice_callback(lists, talk_menu_item); - gui_synclist_set_nb_items(lists,current_subitems_count); + gui_synclist_set_nb_items(lists,current_subitems_count+(show_info_line?1:0)); gui_synclist_limit_scroll(lists,true); gui_synclist_select_item(lists, find_menu_selection(selected)); @@ -390,6 +434,7 @@ gui_buttonbar_set(&buttonbar, "<<<", "", ""); #endif + menulists = &lists; menu_callback_type menu_callback = NULL; if (start_menu == NULL) menu = &main_menu_;