 Chromium Code Reviews
 Chromium Code Reviews Issue 10532171:
  Added support for icon views (view used instead of icon in a menu item).  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src
    
  
    Issue 10532171:
  Added support for icon views (view used instead of icon in a menu item).  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src| OLD | NEW | 
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "ui/views/controls/menu/menu_item_view.h" | 5 #include "ui/views/controls/menu/menu_item_view.h" | 
| 6 | 6 | 
| 7 #include <uxtheme.h> | 7 #include <uxtheme.h> | 
| 8 #include <Vssym32.h> | 8 #include <Vssym32.h> | 
| 9 | 9 | 
| 10 #include "grit/ui_strings.h" | 10 #include "grit/ui_strings.h" | 
| 11 #include "ui/base/native_theme/native_theme_win.h" | 11 #include "ui/base/native_theme/native_theme_win.h" | 
| 12 #include "ui/gfx/canvas.h" | 12 #include "ui/gfx/canvas.h" | 
| 13 #include "ui/views/controls/menu/menu_config.h" | 13 #include "ui/views/controls/menu/menu_config.h" | 
| 14 #include "ui/views/controls/menu/submenu_view.h" | 14 #include "ui/views/controls/menu/submenu_view.h" | 
| 15 | 15 | 
| 16 using ui::NativeTheme; | 16 using ui::NativeTheme; | 
| 17 | 17 | 
| 18 namespace views { | 18 namespace views { | 
| 19 | 19 | 
| 20 void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) { | 20 void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) { | 
| 21 const MenuConfig& config = MenuConfig::instance(); | 21 const MenuConfig& config = MenuConfig::instance(); | 
| 22 | |
| 22 bool render_selection = | 23 bool render_selection = | 
| 23 (mode == PB_NORMAL && IsSelected() && | 24 (mode == PB_NORMAL && IsSelected() && | 
| 24 parent_menu_item_->GetSubmenu()->GetShowSelection(this) && | 25 parent_menu_item_->GetSubmenu()->GetShowSelection(this) && | 
| 25 !has_children()); | 26 NonIconChildViewsCount() == 0); | 
| 
msw
2012/06/28 01:56:38
nit: add parens around this conditional term.
 
yefimt
2012/06/28 16:53:34
Done.
 | |
| 26 int default_sys_color; | 27 int default_sys_color; | 
| 27 int state; | 28 int state; | 
| 28 NativeTheme::State control_state; | 29 NativeTheme::State control_state; | 
| 29 | 30 | 
| 30 if (enabled()) { | 31 if (enabled()) { | 
| 31 if (render_selection) { | 32 if (render_selection) { | 
| 32 control_state = NativeTheme::kHovered; | 33 control_state = NativeTheme::kHovered; | 
| 33 state = MPI_HOT; | 34 state = MPI_HOT; | 
| 34 default_sys_color = COLOR_HIGHLIGHTTEXT; | 35 default_sys_color = COLOR_HIGHLIGHTTEXT; | 
| 35 } else { | 36 } else { | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 78 | 79 | 
| 79 // Render the foreground. | 80 // Render the foreground. | 
| 80 // Menu color is specific to Vista, fallback to classic colors if can't | 81 // Menu color is specific to Vista, fallback to classic colors if can't | 
| 81 // get color. | 82 // get color. | 
| 82 SkColor fg_color = ui::NativeThemeWin::instance()->GetThemeColorWithDefault( | 83 SkColor fg_color = ui::NativeThemeWin::instance()->GetThemeColorWithDefault( | 
| 83 ui::NativeThemeWin::MENU, MENU_POPUPITEM, state, TMT_TEXTCOLOR, | 84 ui::NativeThemeWin::MENU, MENU_POPUPITEM, state, TMT_TEXTCOLOR, | 
| 84 default_sys_color); | 85 default_sys_color); | 
| 85 const gfx::Font& font = GetFont(); | 86 const gfx::Font& font = GetFont(); | 
| 86 int accel_width = parent_menu_item_->GetSubmenu()->max_accelerator_width(); | 87 int accel_width = parent_menu_item_->GetSubmenu()->max_accelerator_width(); | 
| 87 int width = this->width() - item_right_margin_ - label_start_ - accel_width; | 88 int width = this->width() - item_right_margin_ - label_start_ - accel_width; | 
| 88 gfx::Rect text_bounds(label_start_, top_margin, width, font.GetHeight()); | 89 int height = this->height() - GetTopMargin() - GetBottomMargin(); | 
| 90 int flags = gfx::Canvas::TEXT_VALIGN_MIDDLE | | |
| 91 GetRootMenuItem()->GetDrawStringFlags(); | |
| 92 gfx::Rect text_bounds(label_start_, top_margin, width, height); | |
| 89 text_bounds.set_x(GetMirroredXForRect(text_bounds)); | 93 text_bounds.set_x(GetMirroredXForRect(text_bounds)); | 
| 90 if (mode == PB_FOR_DRAG) { | 94 if (mode == PB_FOR_DRAG) { | 
| 91 // With different themes, it's difficult to tell what the correct | 95 // With different themes, it's difficult to tell what the correct | 
| 92 // foreground and background colors are for the text to draw the correct | 96 // foreground and background colors are for the text to draw the correct | 
| 93 // halo. Instead, just draw black on white, which will look good in most | 97 // halo. Instead, just draw black on white, which will look good in most | 
| 94 // cases. | 98 // cases. | 
| 95 canvas->DrawStringWithHalo(title(), font, 0x00000000, 0xFFFFFFFF, | 99 canvas->DrawStringWithHalo(title(), font, 0x00000000, 0xFFFFFFFF, | 
| 96 text_bounds.x(), text_bounds.y(), text_bounds.width(), | 100 text_bounds.x(), text_bounds.y(), text_bounds.width(), | 
| 97 text_bounds.height(), GetRootMenuItem()->GetDrawStringFlags()); | 101 text_bounds.height(), flags); | 
| 98 } else { | 102 } else { | 
| 99 canvas->DrawStringInt(title(), font, fg_color, | 103 canvas->DrawStringInt(title(), font, fg_color, | 
| 100 text_bounds.x(), text_bounds.y(), text_bounds.width(), | 104 text_bounds.x(), text_bounds.y(), text_bounds.width(), | 
| 101 text_bounds.height(), | 105 text_bounds.height(), flags); | 
| 102 GetRootMenuItem()->GetDrawStringFlags()); | |
| 103 } | 106 } | 
| 104 | 107 | 
| 105 PaintAccelerator(canvas); | 108 PaintAccelerator(canvas); | 
| 106 | 109 | 
| 107 if (icon_.width() > 0) { | |
| 108 gfx::Rect icon_bounds(config.item_left_margin, | |
| 109 top_margin + (height() - top_margin - | |
| 110 bottom_margin - icon_.height()) / 2, | |
| 111 icon_.width(), | |
| 112 icon_.height()); | |
| 113 icon_bounds.set_x(GetMirroredXForRect(icon_bounds)); | |
| 114 canvas->DrawImageInt(icon_, icon_bounds.x(), icon_bounds.y()); | |
| 115 } | |
| 116 | |
| 117 if (HasSubmenu()) { | 110 if (HasSubmenu()) { | 
| 118 int state_id = enabled() ? MSM_NORMAL : MSM_DISABLED; | 111 int state_id = enabled() ? MSM_NORMAL : MSM_DISABLED; | 
| 119 gfx::Rect arrow_bounds(this->width() - item_right_margin_ + | 112 gfx::Rect arrow_bounds(this->width() - item_right_margin_ + | 
| 120 config.label_to_arrow_padding, 0, | 113 config.label_to_arrow_padding, 0, | 
| 121 config.arrow_width, height()); | 114 config.arrow_width, this->height()); | 
| 
msw
2012/06/28 01:56:38
nit: remove unnecessary explicit "this->" from wid
 
yefimt
2012/06/28 16:53:34
There are width and height variables defined above
 
msw
2012/06/28 17:40:25
Gotcha, thanks.
 | |
| 122 AdjustBoundsForRTLUI(&arrow_bounds); | 115 AdjustBoundsForRTLUI(&arrow_bounds); | 
| 123 | 116 | 
| 124 // If our sub menus open from right to left (which is the case when the | 117 // If our sub menus open from right to left (which is the case when the | 
| 125 // locale is RTL) then we should make sure the menu arrow points to the | 118 // locale is RTL) then we should make sure the menu arrow points to the | 
| 126 // right direction. | 119 // right direction. | 
| 127 ui::NativeTheme::ExtraParams extra; | 120 ui::NativeTheme::ExtraParams extra; | 
| 128 extra.menu_arrow.pointing_right = !base::i18n::IsRTL(); | 121 extra.menu_arrow.pointing_right = !base::i18n::IsRTL(); | 
| 129 extra.menu_arrow.is_selected = render_selection; | 122 extra.menu_arrow.is_selected = render_selection; | 
| 130 ui::NativeTheme::instance()->Paint(canvas->sk_canvas(), | 123 ui::NativeTheme::instance()->Paint(canvas->sk_canvas(), | 
| 131 ui::NativeTheme::kMenuPopupArrow, control_state, arrow_bounds, extra); | 124 ui::NativeTheme::kMenuPopupArrow, control_state, arrow_bounds, extra); | 
| (...skipping 29 matching lines...) Expand all Loading... | |
| 161 NativeTheme::kMenuCheckBackground, state, bg_bounds, extra); | 154 NativeTheme::kMenuCheckBackground, state, bg_bounds, extra); | 
| 162 | 155 | 
| 163 // And the check. | 156 // And the check. | 
| 164 gfx::Rect icon_bounds(icon_x / 2, icon_y, icon_width, icon_height); | 157 gfx::Rect icon_bounds(icon_x / 2, icon_y, icon_width, icon_height); | 
| 165 AdjustBoundsForRTLUI(&icon_bounds); | 158 AdjustBoundsForRTLUI(&icon_bounds); | 
| 166 NativeTheme::instance()->Paint(canvas->sk_canvas(), | 159 NativeTheme::instance()->Paint(canvas->sk_canvas(), | 
| 167 NativeTheme::kMenuCheck, state, bg_bounds, extra); | 160 NativeTheme::kMenuCheck, state, bg_bounds, extra); | 
| 168 } | 161 } | 
| 169 | 162 | 
| 170 } // namespace views | 163 } // namespace views | 
| OLD | NEW |