| Index: ui/views/controls/menu/menu_item_view.cc
|
| diff --git a/ui/views/controls/menu/menu_item_view.cc b/ui/views/controls/menu/menu_item_view.cc
|
| index b5f81117e569010cab74e08c60ef3a17419eb70f..296738e32c3dc2f606d9224da89cceb1803bc4f5 100644
|
| --- a/ui/views/controls/menu/menu_item_view.cc
|
| +++ b/ui/views/controls/menu/menu_item_view.cc
|
| @@ -13,6 +13,7 @@
|
| #include "ui/base/models/menu_model.h"
|
| #include "ui/gfx/canvas.h"
|
| #include "ui/views/controls/button/menu_button.h"
|
| +#include "ui/views/controls/image_view.h"
|
| #include "ui/views/controls/menu/menu_config.h"
|
| #include "ui/views/controls/menu/menu_controller.h"
|
| #include "ui/views/controls/menu/menu_separator.h"
|
| @@ -63,6 +64,9 @@ const int MenuItemView::kEmptyMenuItemViewID =
|
| MenuItemView::kMenuItemViewID + 1;
|
|
|
| // static
|
| +int MenuItemView::icon_area_width_ = 0;
|
| +
|
| +// static
|
| int MenuItemView::label_start_;
|
|
|
| // static
|
| @@ -86,6 +90,7 @@ MenuItemView::MenuItemView(MenuDelegate* delegate)
|
| has_mnemonics_(false),
|
| show_mnemonics_(false),
|
| has_icons_(false),
|
| + icon_view_(NULL),
|
| top_margin_(-1),
|
| bottom_margin_(-1),
|
| requested_menu_position_(POSITION_BEST_FIT),
|
| @@ -219,7 +224,8 @@ MenuItemView* MenuItemView::AddMenuItemAt(int index,
|
| item->SetTitle(GetDelegate()->GetLabel(item_id));
|
| else
|
| item->SetTitle(label);
|
| - item->SetIcon(icon);
|
| + if (!icon.empty())
|
| + item->SetIcon(icon);
|
| if (type == SUBMENU)
|
| item->CreateSubmenu();
|
| submenu_->AddChildViewAt(item, index);
|
| @@ -360,7 +366,26 @@ void MenuItemView::SetIcon(const gfx::ImageSkia& icon, int item_id) {
|
| }
|
|
|
| void MenuItemView::SetIcon(const gfx::ImageSkia& icon) {
|
| - icon_ = icon;
|
| + if (icon.empty()) {
|
| + SetIconView(NULL);
|
| + return;
|
| + }
|
| +
|
| + ImageView* icon_view = new ImageView();
|
| + icon_view->SetImage(&icon);
|
| + SetIconView(icon_view);
|
| +}
|
| +
|
| +void MenuItemView::SetIconView(View* icon_view) {
|
| + if (icon_view_) {
|
| + RemoveChildView(icon_view_);
|
| + delete icon_view_;
|
| + icon_view_ = NULL;
|
| + }
|
| + if (icon_view) {
|
| + AddChildView(icon_view);
|
| + icon_view_ = icon_view;
|
| + }
|
| SchedulePaint();
|
| }
|
|
|
| @@ -481,10 +506,22 @@ void MenuItemView::Layout() {
|
| int x = width() - (use_right_margin_ ? item_right_margin_ : 0);
|
| for (int i = child_count() - 1; i >= 0; --i) {
|
| View* child = child_at(i);
|
| + if (icon_view_ && (icon_view_ == child))
|
| + continue;
|
| int width = child->GetPreferredSize().width();
|
| child->SetBounds(x - width, 0, width, height());
|
| x -= width - kChildXPadding;
|
| }
|
| + // Position |icon_view|.
|
| + const MenuConfig& config = MenuConfig::instance();
|
| + if (icon_view_) {
|
| + icon_view_->SizeToPreferredSize();
|
| + gfx::Size size = icon_view_->GetPreferredSize();
|
| + int x = config.item_left_margin + (icon_area_width_ - size.width()) / 2;
|
| + int y =
|
| + (height() + GetTopMargin() - GetBottomMargin() - size.height()) / 2;
|
| + icon_view_->SetPosition(gfx::Point(x, y));
|
| + }
|
| }
|
| }
|
|
|
| @@ -515,6 +552,7 @@ MenuItemView::MenuItemView(MenuItemView* parent,
|
| has_mnemonics_(false),
|
| show_mnemonics_(false),
|
| has_icons_(false),
|
| + icon_view_(NULL),
|
| top_margin_(-1),
|
| bottom_margin_(-1),
|
| requested_menu_position_(POSITION_BEST_FIT),
|
| @@ -534,21 +572,24 @@ std::string MenuItemView::GetClassName() const {
|
| // Calculates all sizes that we can from the OS.
|
| //
|
| // This is invoked prior to Running a menu.
|
| -void MenuItemView::UpdateMenuPartSizes(bool has_icons) {
|
| +void MenuItemView::UpdateMenuPartSizes() {
|
| MenuConfig::Reset();
|
| const MenuConfig& config = MenuConfig::instance();
|
|
|
| item_right_margin_ = config.label_to_arrow_padding + config.arrow_width +
|
| config.arrow_to_edge_padding;
|
| + icon_area_width_ = config.check_width;
|
| + if (has_icons_)
|
| + icon_area_width_ = std::max(icon_area_width_, GetMaxIconViewWidth());
|
|
|
| if (config.always_use_icon_to_label_padding)
|
| - label_start_ = config.item_left_margin + config.check_width +
|
| + label_start_ = config.item_left_margin + icon_area_width_ +
|
| config.icon_to_label_padding;
|
| else
|
| // If there are no icons don't pad by the icon to label padding. This
|
| // makes us look close to system menus.
|
| - label_start_ = config.item_left_margin + config.check_width +
|
| - (has_icons ? config.icon_to_label_padding : 0);
|
| + label_start_ = config.item_left_margin + icon_area_width_ +
|
| + (has_icons_ ? config.icon_to_label_padding : 0);
|
|
|
| if (config.render_gutter)
|
| label_start_ += config.gutter_width + config.gutter_to_label;
|
| @@ -599,7 +640,7 @@ void MenuItemView::PrepareForRun(bool has_mnemonics, bool show_mnemonics) {
|
| if (!MenuController::GetActiveInstance()) {
|
| // Only update the menu size if there are no menus showing, otherwise
|
| // things may shift around.
|
| - UpdateMenuPartSizes(has_icons_);
|
| + UpdateMenuPartSizes();
|
| }
|
| }
|
|
|
| @@ -735,13 +776,20 @@ gfx::Size MenuItemView::GetChildPreferredSize() {
|
|
|
| int width = 0;
|
| for (int i = 0; i < child_count(); ++i) {
|
| + View* child = child_at(i);
|
| + if (icon_view_ && (icon_view_ == child))
|
| + continue;
|
| if (i)
|
| width += kChildXPadding;
|
| - width += child_at(i)->GetPreferredSize().width();
|
| + width += child->GetPreferredSize().width();
|
| }
|
| - // Return a height of 0 to indicate that we should use the title height
|
| - // instead.
|
| - return gfx::Size(width, 0);
|
| + int height = 0;
|
| + if (icon_view_)
|
| + height = icon_view_->GetPreferredSize().height();
|
| +
|
| + // If there is no icon view it returns a height of 0 to indicate that
|
| + // we should use the title height instead.
|
| + return gfx::Size(width, height);
|
| }
|
|
|
| gfx::Size MenuItemView::CalculatePreferredSize() {
|
| @@ -778,9 +826,29 @@ string16 MenuItemView::GetAcceleratorText() {
|
|
|
| bool MenuItemView::IsContainer() const {
|
| // Let the first child take over |this| when we only have one child and no
|
| - // title. Note that what child_count() returns is the number of children,
|
| + // title.
|
| + return (NonIconChildViewsCount() == 1) && title_.empty();
|
| +}
|
| +
|
| +int MenuItemView::NonIconChildViewsCount() const {
|
| + // Note that what child_count() returns is the number of children,
|
| // not the number of menu items.
|
| - return child_count() == 1 && title_.empty();
|
| + return child_count() - (icon_view_ ? 1 : 0);
|
| +}
|
| +
|
| +int MenuItemView::GetMaxIconViewWidth() const {
|
| + int width = 0;
|
| + for (int i = 0; i < submenu_->GetMenuItemCount(); ++i) {
|
| + MenuItemView* menu_item = submenu_->GetMenuItemAt(i);
|
| + int temp_width = 0;
|
| + if (menu_item->HasSubmenu()) {
|
| + temp_width = menu_item->GetMaxIconViewWidth();
|
| + } else if (menu_item->icon_view()) {
|
| + temp_width = menu_item->icon_view()->GetPreferredSize().width();
|
| + }
|
| + width = std::max(width, temp_width);
|
| + }
|
| + return width;
|
| }
|
|
|
| } // namespace views
|
|
|