From: Vladimir 'phcoder' Serbinenko Date: Fri, 2 Jul 2010 16:28:54 +0000 (+0200) Subject: * gfxmenu/gui_list.c (draw_menu): Use viewport to simplify code and fix X-Git-Tag: 1.99~765 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4037210375271ec4eb80e942a518e5f9de5a58f0;p=thirdparty%2Fgrub.git * gfxmenu/gui_list.c (draw_menu): Use viewport to simplify code and fix too long captions. (list_get_minimal_size): Take selection box into account. --- diff --git a/ChangeLog b/ChangeLog index f26c62431..36dd9fb49 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-07-02 Vladimir Serbinenko + + * gfxmenu/gui_list.c (draw_menu): Use viewport to simplify code and fix + too long captions. + (list_get_minimal_size): Take selection box into account. + 2010-07-02 Vladimir Serbinenko * font/font.c (grub_font_get_glyph_with_fallback): Avoid dereferencing diff --git a/gfxmenu/gui_list.c b/gfxmenu/gui_list.c index 8583a214e..8058fcc4f 100644 --- a/gfxmenu/gui_list.c +++ b/gfxmenu/gui_list.c @@ -210,7 +210,7 @@ draw_scrollbar (list_impl_t self, /* Draw the list of items. */ static void -draw_menu (list_impl_t self, int width, int num_shown_items) +draw_menu (list_impl_t self, int num_shown_items) { if (! self->menu_box || ! self->selected_item_box) return; @@ -227,10 +227,18 @@ draw_menu (list_impl_t self, int width, int num_shown_items) grub_gfxmenu_box_t selbox = self->selected_item_box; int sel_leftpad = selbox->get_left_pad (selbox); - int item_top = boxpad; - int item_left = boxpad + sel_leftpad; + int sel_toppad = selbox->get_top_pad (selbox); + int item_top = sel_toppad; int menu_index; int visible_index; + struct grub_video_rect oviewport; + + grub_video_get_viewport (&oviewport.x, &oviewport.y, + &oviewport.width, &oviewport.height); + grub_video_set_viewport (oviewport.x + boxpad, + oviewport.y + boxpad, + oviewport.width - 2 * boxpad, + oviewport.height - 2 * boxpad); for (visible_index = 0, menu_index = self->first_shown_index; visible_index < num_shown_items && menu_index < self->view->menu->size; @@ -240,16 +248,16 @@ draw_menu (list_impl_t self, int width, int num_shown_items) if (is_selected) { - int sel_toppad = selbox->get_top_pad (selbox); - selbox->set_content_size (selbox, (width - 2 * boxpad), item_height); - selbox->draw (selbox, item_left - sel_leftpad, + selbox->set_content_size (selbox, oviewport.width - 2 * boxpad - 2, + item_height - 1); + selbox->draw (selbox, 0, item_top - sel_toppad); } struct grub_video_bitmap *icon; if ((icon = get_item_icon (self, menu_index)) != 0) grub_video_blit_bitmap (icon, GRUB_VIDEO_BLIT_BLEND, - item_left, + sel_leftpad, item_top + (item_height - self->icon_height) / 2, 0, 0, self->icon_width, self->icon_height); @@ -266,12 +274,16 @@ draw_menu (list_impl_t self, int width, int num_shown_items) grub_font_draw_string (item_title, font, grub_gui_map_color (text_color), - item_left + self->icon_width + icon_text_space, + sel_leftpad + self->icon_width + icon_text_space, (item_top + (item_height - (ascent + descent)) / 2 + ascent)); item_top += item_height + item_vspace; } + grub_video_set_viewport (oviewport.x, + oviewport.y, + oviewport.width, + oviewport.height); } static void @@ -313,7 +325,7 @@ list_paint (void *vself, const grub_video_rect_t *region) box->draw (box, 0, 0); grub_gui_set_viewport (&content_rect, &vpsave2); - draw_menu (self, content_rect.width, num_shown_items); + draw_menu (self, num_shown_items); grub_gui_restore_viewport (&vpsave2); if (drawing_scrollbar) @@ -322,7 +334,7 @@ list_paint (void *vself, const grub_video_rect_t *region) 0, self->view->menu->size, self->bounds.width - box_right_pad + self->scrollbar_width, - box_top_pad + self->item_padding, + box_top_pad, self->bounds.height - box_top_pad - box_bottom_pad); } @@ -375,6 +387,9 @@ list_get_minimal_size (void *vself, unsigned *width, unsigned *height) int box_right_pad = box->get_right_pad (box); int box_bottom_pad = box->get_bottom_pad (box); unsigned width_s; + + grub_gfxmenu_box_t selbox = self->selected_item_box; + int sel_toppad = selbox->get_top_pad (selbox); *width = grub_font_get_string_width (self->item_font, "Typical OS"); width_s = grub_font_get_string_width (self->selected_item_font, @@ -388,7 +403,7 @@ list_get_minimal_size (void *vself, unsigned *width, unsigned *height) *height = (item_height * num_items + item_vspace * (num_items - 1) + 2 * boxpad - + box_top_pad + box_bottom_pad); + + box_top_pad + box_bottom_pad + sel_toppad); } else {