Index: chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc |
diff --git a/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc b/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc |
index 94adeb1244953afc78f2fb0e638595674f5bb20c..5686558fb8ed4de41cfbaf57fa4c401ae95f0f05 100644 |
--- a/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc |
+++ b/chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.cc |
@@ -9,13 +9,16 @@ |
#include "chrome/browser/ui/views/toolbar/toolbar_view.h" |
#include "chrome/browser/ui/views/toolbar/wrench_menu.h" |
#include "ui/views/controls/menu/menu_item_view.h" |
+#include "ui/views/controls/menu/submenu_view.h" |
ExtensionToolbarMenuView::ExtensionToolbarMenuView(Browser* browser, |
WrenchMenu* wrench_menu) |
: browser_(browser), |
wrench_menu_(wrench_menu), |
container_(NULL), |
- browser_actions_container_observer_(this) { |
+ browser_actions_container_observer_(this), |
+ start_padding_(0), |
+ end_padding_(0) { |
BrowserActionsContainer* main = |
BrowserView::GetBrowserViewForBrowser(browser_) |
->toolbar()->browser_actions(); |
@@ -25,7 +28,6 @@ ExtensionToolbarMenuView::ExtensionToolbarMenuView(Browser* browser, |
main); |
container_->Init(); |
AddChildView(container_); |
- |
// If we were opened for a drop command, we have to wait for the drop to |
// finish so we can close the wrench menu. |
if (wrench_menu_->for_drop()) { |
@@ -37,15 +39,47 @@ ExtensionToolbarMenuView::ExtensionToolbarMenuView(Browser* browser, |
ExtensionToolbarMenuView::~ExtensionToolbarMenuView() { |
} |
+void ExtensionToolbarMenuView::Init(views::MenuItemView* menu_root) { |
sky
2014/09/11 19:42:27
Can't you do this in Layout()? At Layout() time yo
Devlin
2014/09/11 20:32:13
The problem is that we need to not just know the w
|
+ // We should pad on the left enough so that the first icon starts at the same |
+ // point as the labels, and enough on the right so that the final icon ends |
+ // at the same point as the arrows in the menu. However, there is outer |
+ // padding on the container (so we can see the drop indicator), so we need to |
+ // compensate. |
+ // We subtract one from label_start because we want the pixel *before* the |
+ // label. |
+ start_padding_ = views::MenuItemView::label_start() - 1 - |
+ BrowserActionsContainer::kItemSpacing; |
+ end_padding_ = menu_root->GetMenuConfig().arrow_to_edge_padding - |
+ BrowserActionsContainer::kItemSpacing; |
+ |
+ // Find the width we have for possible content. |
+ int content_width = menu_root->GetSubmenu()->GetPreferredSize().width() - |
+ start_padding_ - end_padding_; |
+ // We subtract an extra padding from the content width to make division easy. |
+ content_width -= BrowserActionsContainer::kItemSpacing; |
+ |
+ int icons_per_row = content_width / BrowserActionsContainer::IconWidth(true); |
+ // If it's not a perfect fit (which is very likely), we add another icon and |
+ // increase the menu size. |
+ if (content_width % BrowserActionsContainer::IconWidth(true)) |
+ ++icons_per_row; |
+ |
+ // We should definitely have more than 0 icons per row. |
+ DCHECK_NE(0, icons_per_row); |
+ BrowserActionsContainer::icons_per_overflow_menu_row = icons_per_row; |
+ PreferredSizeChanged(); |
+} |
+ |
gfx::Size ExtensionToolbarMenuView::GetPreferredSize() const { |
- return container_->GetPreferredSize(); |
+ gfx::Size size = container_->GetPreferredSize(); |
+ size.set_width(size.width() + start_padding_ + end_padding_); |
+ return size; |
} |
void ExtensionToolbarMenuView::Layout() { |
- // All buttons are given the same width. |
gfx::Size sz = GetPreferredSize(); |
- SetBounds(views::MenuItemView::label_start(), 0, sz.width(), sz.height()); |
- container_->SetBounds(0, 0, sz.width(), sz.height()); |
+ container_->SetBounds( |
+ start_padding_ + 1, 0, sz.width() - end_padding_, sz.height()); |
} |
void ExtensionToolbarMenuView::OnBrowserActionDragDone() { |