Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: chrome/browser/ui/views/toolbar/app_menu.cc

Issue 1661673004: Enables hot-tracking for overflow extension buttons in the app menu (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Restores hot-tracking of extension buttons in app menu with MD (comments) Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "chrome/browser/ui/views/toolbar/app_menu.h" 5 #include "chrome/browser/ui/views/toolbar/app_menu.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
(...skipping 28 matching lines...) Expand all
39 #include "content/public/browser/notification_source.h" 39 #include "content/public/browser/notification_source.h"
40 #include "content/public/browser/notification_types.h" 40 #include "content/public/browser/notification_types.h"
41 #include "content/public/browser/user_metrics.h" 41 #include "content/public/browser/user_metrics.h"
42 #include "content/public/browser/web_contents.h" 42 #include "content/public/browser/web_contents.h"
43 #include "extensions/common/feature_switch.h" 43 #include "extensions/common/feature_switch.h"
44 #include "grit/theme_resources.h" 44 #include "grit/theme_resources.h"
45 #include "third_party/skia/include/core/SkCanvas.h" 45 #include "third_party/skia/include/core/SkCanvas.h"
46 #include "third_party/skia/include/core/SkPaint.h" 46 #include "third_party/skia/include/core/SkPaint.h"
47 #include "ui/base/l10n/l10n_util.h" 47 #include "ui/base/l10n/l10n_util.h"
48 #include "ui/base/layout.h" 48 #include "ui/base/layout.h"
49 #include "ui/base/material_design/material_design_controller.h"
49 #include "ui/base/resource/resource_bundle.h" 50 #include "ui/base/resource/resource_bundle.h"
50 #include "ui/gfx/canvas.h" 51 #include "ui/gfx/canvas.h"
51 #include "ui/gfx/font_list.h" 52 #include "ui/gfx/font_list.h"
52 #include "ui/gfx/image/image.h" 53 #include "ui/gfx/image/image.h"
53 #include "ui/gfx/image/image_skia_source.h" 54 #include "ui/gfx/image/image_skia_source.h"
54 #include "ui/gfx/skia_util.h" 55 #include "ui/gfx/skia_util.h"
55 #include "ui/gfx/text_utils.h" 56 #include "ui/gfx/text_utils.h"
56 #include "ui/views/background.h" 57 #include "ui/views/background.h"
57 #include "ui/views/controls/button/image_button.h" 58 #include "ui/views/controls/button/image_button.h"
58 #include "ui/views/controls/button/label_button.h" 59 #include "ui/views/controls/button/label_button.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 // Combination border/background for the buttons contained in the menu. The 129 // Combination border/background for the buttons contained in the menu. The
129 // painting of the border/background is done here as LabelButton does not always 130 // painting of the border/background is done here as LabelButton does not always
130 // paint the border. 131 // paint the border.
131 class InMenuButtonBackground : public views::Background { 132 class InMenuButtonBackground : public views::Background {
132 public: 133 public:
133 enum ButtonType { 134 enum ButtonType {
134 LEFT_BUTTON, 135 LEFT_BUTTON,
135 CENTER_BUTTON, 136 CENTER_BUTTON,
136 RIGHT_BUTTON, 137 RIGHT_BUTTON,
137 SINGLE_BUTTON, 138 SINGLE_BUTTON,
139 ROUNDED_BUTTON,
Peter Kasting 2016/02/24 02:04:48 Nit: These probably deserve comments, as it's not
varkha 2016/02/24 05:52:09 Done.
138 }; 140 };
139 141
140 explicit InMenuButtonBackground(ButtonType type) 142 explicit InMenuButtonBackground(ButtonType type)
141 : type_(type), left_button_(NULL), right_button_(NULL) {} 143 : type_(type), left_button_(NULL), right_button_(NULL) {}
142 144
143 // Used when the type is CENTER_BUTTON to determine if the left/right edge 145 // Used when the type is CENTER_BUTTON to determine if the left/right edge
144 // needs to be rendered selected. 146 // needs to be rendered selected.
145 void SetOtherButtons(const CustomButton* left_button, 147 void SetOtherButtons(const CustomButton* left_button,
146 const CustomButton* right_button) { 148 const CustomButton* right_button) {
147 if (base::i18n::IsRTL()) { 149 if (base::i18n::IsRTL()) {
148 left_button_ = right_button; 150 left_button_ = right_button;
149 right_button_ = left_button; 151 right_button_ = left_button;
150 } else { 152 } else {
151 left_button_ = left_button; 153 left_button_ = left_button;
152 right_button_ = right_button; 154 right_button_ = right_button;
153 } 155 }
154 } 156 }
155 157
156 // Overridden from views::Background. 158 // Overridden from views::Background.
157 void Paint(gfx::Canvas* canvas, View* view) const override { 159 void Paint(gfx::Canvas* canvas, View* view) const override {
158 CustomButton* button = CustomButton::AsCustomButton(view); 160 CustomButton* button = CustomButton::AsCustomButton(view);
159 views::Button::ButtonState state = 161 views::Button::ButtonState state =
160 button ? button->state() : views::Button::STATE_NORMAL; 162 button ? button->state() : views::Button::STATE_NORMAL;
161 int h = view->height(); 163 int h = view->height();
162 164
163 // Normal buttons get a border drawn on the right side and the rest gets 165 // Normal buttons get a border drawn on the right side and the rest gets
164 // filled in. The left button however does not get a line to combine 166 // filled in. The left or rounded buttons however do not get a line to
165 // buttons. 167 // combine buttons.
166 if (type_ != RIGHT_BUTTON) { 168 gfx::Rect bounds(view->GetLocalBounds());
169 if (type_ != RIGHT_BUTTON && type_ != ROUNDED_BUTTON) {
167 canvas->FillRect(gfx::Rect(0, 0, 1, h), 170 canvas->FillRect(gfx::Rect(0, 0, 1, h),
168 BorderColor(view, views::Button::STATE_NORMAL)); 171 BorderColor(view, views::Button::STATE_NORMAL));
172 bounds.Inset(gfx::Insets(0, 1, 0, 0));
169 } 173 }
170 174
171 gfx::Rect bounds(view->GetLocalBounds());
172 bounds.set_x(view->GetMirroredXForRect(bounds)); 175 bounds.set_x(view->GetMirroredXForRect(bounds));
173 DrawBackground(canvas, view, bounds, state); 176 DrawBackground(canvas, view, bounds, state);
174 } 177 }
175 178
176 private: 179 private:
177 static SkColor BorderColor(View* view, views::Button::ButtonState state) { 180 static SkColor BorderColor(View* view, views::Button::ButtonState state) {
178 ui::NativeTheme* theme = view->GetNativeTheme(); 181 ui::NativeTheme* theme = view->GetNativeTheme();
179 switch (state) { 182 switch (state) {
180 case views::Button::STATE_HOVERED: 183 case views::Button::STATE_HOVERED:
181 return theme->GetSystemColor( 184 return theme->GetSystemColor(
(...skipping 24 matching lines...) Expand all
206 ui::NativeTheme::kColorId_MenuBackgroundColor); 209 ui::NativeTheme::kColorId_MenuBackgroundColor);
207 } 210 }
208 } 211 }
209 212
210 void DrawBackground(gfx::Canvas* canvas, 213 void DrawBackground(gfx::Canvas* canvas,
211 const views::View* view, 214 const views::View* view,
212 const gfx::Rect& bounds, 215 const gfx::Rect& bounds,
213 views::Button::ButtonState state) const { 216 views::Button::ButtonState state) const {
214 if (state == views::Button::STATE_HOVERED || 217 if (state == views::Button::STATE_HOVERED ||
215 state == views::Button::STATE_PRESSED) { 218 state == views::Button::STATE_PRESSED) {
219 ui::NativeTheme::ExtraParams params;
220 if (type_ == ROUNDED_BUTTON) {
221 // Consistent with a hover corner radius (kInkDropSmallCornerRadius).
222 const int kBackgroundCornerRadius = 2;
223 params.menu_item.corner_radius = kBackgroundCornerRadius;
224 }
216 view->GetNativeTheme()->Paint(canvas->sk_canvas(), 225 view->GetNativeTheme()->Paint(canvas->sk_canvas(),
217 ui::NativeTheme::kMenuItemBackground, 226 ui::NativeTheme::kMenuItemBackground,
218 ui::NativeTheme::kHovered, 227 ui::NativeTheme::kHovered, bounds, params);
219 bounds,
220 ui::NativeTheme::ExtraParams());
221 } 228 }
222 } 229 }
223 230
224 ButtonType TypeAdjustedForRTL() const { 231 ButtonType TypeAdjustedForRTL() const {
225 if (!base::i18n::IsRTL()) 232 if (!base::i18n::IsRTL())
226 return type_; 233 return type_;
227 234
228 switch (type_) { 235 switch (type_) {
229 case LEFT_BUTTON: return RIGHT_BUTTON; 236 case LEFT_BUTTON: return RIGHT_BUTTON;
230 case RIGHT_BUTTON: return LEFT_BUTTON; 237 case RIGHT_BUTTON: return LEFT_BUTTON;
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 item->SetMargins(top_margin, bottom_margin); 1137 item->SetMargins(top_margin, bottom_margin);
1131 } 1138 }
1132 1139
1133 if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) 1140 if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU)
1134 PopulateMenu(item, model->GetSubmenuModelAt(i)); 1141 PopulateMenu(item, model->GetSubmenuModelAt(i));
1135 1142
1136 switch (model->GetCommandIdAt(i)) { 1143 switch (model->GetCommandIdAt(i)) {
1137 case IDC_EXTENSIONS_OVERFLOW_MENU: { 1144 case IDC_EXTENSIONS_OVERFLOW_MENU: {
1138 scoped_ptr<ExtensionToolbarMenuView> extension_toolbar( 1145 scoped_ptr<ExtensionToolbarMenuView> extension_toolbar(
1139 new ExtensionToolbarMenuView(browser_, this)); 1146 new ExtensionToolbarMenuView(browser_, this));
1147 if (!extension_toolbar->ShouldShow()) {
1148 item->SetVisible(false);
1149 extension_toolbar_ = nullptr;
1150 break;
1151 }
1152 if (ui::MaterialDesignController::IsModeMaterial()) {
1153 for (int i = 0; i < extension_toolbar->contents()->child_count();
1154 ++i) {
1155 View* action_view = extension_toolbar->contents()->child_at(i);
1156 action_view->set_background(new InMenuButtonBackground(
1157 InMenuButtonBackground::ROUNDED_BUTTON));
1158 }
1159 }
1140 extension_toolbar_ = extension_toolbar.get(); 1160 extension_toolbar_ = extension_toolbar.get();
1141 if (extension_toolbar->ShouldShow()) 1161 item->AddChildView(extension_toolbar.release());
1142 item->AddChildView(extension_toolbar.release());
1143 else
1144 item->SetVisible(false);
1145 break; 1162 break;
1146 } 1163 }
1147 1164
1148 case IDC_EDIT_MENU: { 1165 case IDC_EDIT_MENU: {
1149 ui::ButtonMenuItemModel* submodel = model->GetButtonMenuItemAt(i); 1166 ui::ButtonMenuItemModel* submodel = model->GetButtonMenuItemAt(i);
1150 DCHECK_EQ(IDC_CUT, submodel->GetCommandIdAt(0)); 1167 DCHECK_EQ(IDC_CUT, submodel->GetCommandIdAt(0));
1151 DCHECK_EQ(IDC_COPY, submodel->GetCommandIdAt(1)); 1168 DCHECK_EQ(IDC_COPY, submodel->GetCommandIdAt(1));
1152 DCHECK_EQ(IDC_PASTE, submodel->GetCommandIdAt(2)); 1169 DCHECK_EQ(IDC_PASTE, submodel->GetCommandIdAt(2));
1153 item->SetTitle(l10n_util::GetStringUTF16(IDS_EDIT2)); 1170 item->SetTitle(l10n_util::GetStringUTF16(IDS_EDIT2));
1154 item->AddChildView(new CutCopyPasteView(this, submodel, 0, 1, 2)); 1171 item->AddChildView(new CutCopyPasteView(this, submodel, 0, 1, 2));
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1266 0, 1283 0,
1267 BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS, 1284 BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS,
1268 BOOKMARK_LAUNCH_LOCATION_WRENCH_MENU); 1285 BOOKMARK_LAUNCH_LOCATION_WRENCH_MENU);
1269 } 1286 }
1270 1287
1271 int AppMenu::ModelIndexFromCommandId(int command_id) const { 1288 int AppMenu::ModelIndexFromCommandId(int command_id) const {
1272 CommandIDToEntry::const_iterator ix = command_id_to_entry_.find(command_id); 1289 CommandIDToEntry::const_iterator ix = command_id_to_entry_.find(command_id);
1273 DCHECK(ix != command_id_to_entry_.end()); 1290 DCHECK(ix != command_id_to_entry_.end());
1274 return ix->second.second; 1291 return ix->second.second;
1275 } 1292 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698