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

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 Created 4 years, 10 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
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,
138 }; 139 };
139 140
140 explicit InMenuButtonBackground(ButtonType type) 141 explicit InMenuButtonBackground(ButtonType type)
141 : type_(type), left_button_(NULL), right_button_(NULL) {} 142 : type_(type), left_button_(NULL), right_button_(NULL),
143 corner_radius_(ui::MaterialDesignController::IsModeMaterial() ? 2 : 0) {
144 }
142 145
143 // Used when the type is CENTER_BUTTON to determine if the left/right edge 146 // Used when the type is CENTER_BUTTON to determine if the left/right edge
144 // needs to be rendered selected. 147 // needs to be rendered selected.
145 void SetOtherButtons(const CustomButton* left_button, 148 void SetOtherButtons(const CustomButton* left_button,
146 const CustomButton* right_button) { 149 const CustomButton* right_button) {
147 if (base::i18n::IsRTL()) { 150 if (base::i18n::IsRTL()) {
148 left_button_ = right_button; 151 left_button_ = right_button;
149 right_button_ = left_button; 152 right_button_ = left_button;
150 } else { 153 } else {
151 left_button_ = left_button; 154 left_button_ = left_button;
152 right_button_ = right_button; 155 right_button_ = right_button;
153 } 156 }
154 } 157 }
155 158
156 // Overridden from views::Background. 159 // Overridden from views::Background.
157 void Paint(gfx::Canvas* canvas, View* view) const override { 160 void Paint(gfx::Canvas* canvas, View* view) const override {
158 CustomButton* button = CustomButton::AsCustomButton(view); 161 CustomButton* button = CustomButton::AsCustomButton(view);
159 views::Button::ButtonState state = 162 views::Button::ButtonState state =
160 button ? button->state() : views::Button::STATE_NORMAL; 163 button ? button->state() : views::Button::STATE_NORMAL;
161 int h = view->height(); 164 int h = view->height();
162 165
163 // Normal buttons get a border drawn on the right side and the rest gets 166 // 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 167 // filled in. The left button however does not get a line to combine
165 // buttons. 168 // buttons.
169 gfx::Rect bounds(view->GetLocalBounds());
166 if (type_ != RIGHT_BUTTON) { 170 if (type_ != RIGHT_BUTTON) {
167 canvas->FillRect(gfx::Rect(0, 0, 1, h), 171 canvas->FillRect(gfx::Rect(0, 0, 1, h),
168 BorderColor(view, views::Button::STATE_NORMAL)); 172 BorderColor(view, views::Button::STATE_NORMAL));
173 bounds.Inset(gfx::Insets(0, 1, 0, 0));
varkha 2016/02/06 00:51:21 This small bug was causing a left border vertical
169 } 174 }
170 175
171 gfx::Rect bounds(view->GetLocalBounds());
172 bounds.set_x(view->GetMirroredXForRect(bounds)); 176 bounds.set_x(view->GetMirroredXForRect(bounds));
173 DrawBackground(canvas, view, bounds, state); 177 DrawBackground(canvas, view, bounds, state);
174 } 178 }
175 179
176 private: 180 private:
177 static SkColor BorderColor(View* view, views::Button::ButtonState state) { 181 static SkColor BorderColor(View* view, views::Button::ButtonState state) {
178 ui::NativeTheme* theme = view->GetNativeTheme(); 182 ui::NativeTheme* theme = view->GetNativeTheme();
179 switch (state) { 183 switch (state) {
180 case views::Button::STATE_HOVERED: 184 case views::Button::STATE_HOVERED:
181 return theme->GetSystemColor( 185 return theme->GetSystemColor(
(...skipping 24 matching lines...) Expand all
206 ui::NativeTheme::kColorId_MenuBackgroundColor); 210 ui::NativeTheme::kColorId_MenuBackgroundColor);
207 } 211 }
208 } 212 }
209 213
210 void DrawBackground(gfx::Canvas* canvas, 214 void DrawBackground(gfx::Canvas* canvas,
211 const views::View* view, 215 const views::View* view,
212 const gfx::Rect& bounds, 216 const gfx::Rect& bounds,
213 views::Button::ButtonState state) const { 217 views::Button::ButtonState state) const {
214 if (state == views::Button::STATE_HOVERED || 218 if (state == views::Button::STATE_HOVERED ||
215 state == views::Button::STATE_PRESSED) { 219 state == views::Button::STATE_PRESSED) {
220 ui::NativeTheme::ExtraParams params = ui::NativeTheme::ExtraParams();
221 if (view->GetClassName() == views::MenuButton::kViewClassName)
222 params.menu_item.corner_radius = corner_radius_;
216 view->GetNativeTheme()->Paint(canvas->sk_canvas(), 223 view->GetNativeTheme()->Paint(canvas->sk_canvas(),
217 ui::NativeTheme::kMenuItemBackground, 224 ui::NativeTheme::kMenuItemBackground,
218 ui::NativeTheme::kHovered, 225 ui::NativeTheme::kHovered,
219 bounds, 226 bounds,
220 ui::NativeTheme::ExtraParams()); 227 params);
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;
231 default: break; 238 default: break;
232 } 239 }
233 return type_; 240 return type_;
234 } 241 }
235 242
236 const ButtonType type_; 243 const ButtonType type_;
237 244
238 // See description above setter for details. 245 // See description above setter for details.
239 const CustomButton* left_button_; 246 const CustomButton* left_button_;
240 const CustomButton* right_button_; 247 const CustomButton* right_button_;
241 248
249 // Show rounded button background for extension buttons with Material Design.
250 int corner_radius_;
251
242 DISALLOW_COPY_AND_ASSIGN(InMenuButtonBackground); 252 DISALLOW_COPY_AND_ASSIGN(InMenuButtonBackground);
243 }; 253 };
244 254
245 base::string16 GetAccessibleNameForAppMenuItem(ButtonMenuItemModel* model, 255 base::string16 GetAccessibleNameForAppMenuItem(ButtonMenuItemModel* model,
246 int item_index, 256 int item_index,
247 int accessible_string_id) { 257 int accessible_string_id) {
248 base::string16 accessible_name = 258 base::string16 accessible_name =
249 l10n_util::GetStringUTF16(accessible_string_id); 259 l10n_util::GetStringUTF16(accessible_string_id);
250 base::string16 accelerator_text; 260 base::string16 accelerator_text;
251 261
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 } 1141 }
1132 1142
1133 if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU) 1143 if (model->GetTypeAt(i) == MenuModel::TYPE_SUBMENU)
1134 PopulateMenu(item, model->GetSubmenuModelAt(i)); 1144 PopulateMenu(item, model->GetSubmenuModelAt(i));
1135 1145
1136 switch (model->GetCommandIdAt(i)) { 1146 switch (model->GetCommandIdAt(i)) {
1137 case IDC_EXTENSIONS_OVERFLOW_MENU: { 1147 case IDC_EXTENSIONS_OVERFLOW_MENU: {
1138 scoped_ptr<ExtensionToolbarMenuView> extension_toolbar( 1148 scoped_ptr<ExtensionToolbarMenuView> extension_toolbar(
1139 new ExtensionToolbarMenuView(browser_, this)); 1149 new ExtensionToolbarMenuView(browser_, this));
1140 extension_toolbar_ = extension_toolbar.get(); 1150 extension_toolbar_ = extension_toolbar.get();
1141 if (extension_toolbar->ShouldShow()) 1151 if (!extension_toolbar->ShouldShow()) {
1142 item->AddChildView(extension_toolbar.release());
1143 else
1144 item->SetVisible(false); 1152 item->SetVisible(false);
1153 break;
1154 }
1155 for (int i = 0; i < extension_toolbar->contents()->child_count(); ++i) {
1156 View* action_view = extension_toolbar->contents()->child_at(i);
1157 InMenuButtonBackground* in_menu_background =
1158 new InMenuButtonBackground(InMenuButtonBackground::RIGHT_BUTTON);
1159 action_view->set_background(in_menu_background);
1160 DCHECK(action_view->IsFocusable());
1161 }
1162 item->AddChildView(extension_toolbar.release());
1145 break; 1163 break;
1146 } 1164 }
1147 1165
1148 case IDC_EDIT_MENU: { 1166 case IDC_EDIT_MENU: {
1149 ui::ButtonMenuItemModel* submodel = model->GetButtonMenuItemAt(i); 1167 ui::ButtonMenuItemModel* submodel = model->GetButtonMenuItemAt(i);
1150 DCHECK_EQ(IDC_CUT, submodel->GetCommandIdAt(0)); 1168 DCHECK_EQ(IDC_CUT, submodel->GetCommandIdAt(0));
1151 DCHECK_EQ(IDC_COPY, submodel->GetCommandIdAt(1)); 1169 DCHECK_EQ(IDC_COPY, submodel->GetCommandIdAt(1));
1152 DCHECK_EQ(IDC_PASTE, submodel->GetCommandIdAt(2)); 1170 DCHECK_EQ(IDC_PASTE, submodel->GetCommandIdAt(2));
1153 item->SetTitle(l10n_util::GetStringUTF16(IDS_EDIT2)); 1171 item->SetTitle(l10n_util::GetStringUTF16(IDS_EDIT2));
1154 item->AddChildView(new CutCopyPasteView(this, submodel, 0, 1, 2)); 1172 item->AddChildView(new CutCopyPasteView(this, submodel, 0, 1, 2));
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1266 0, 1284 0,
1267 BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS, 1285 BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS,
1268 BOOKMARK_LAUNCH_LOCATION_WRENCH_MENU); 1286 BOOKMARK_LAUNCH_LOCATION_WRENCH_MENU);
1269 } 1287 }
1270 1288
1271 int AppMenu::ModelIndexFromCommandId(int command_id) const { 1289 int AppMenu::ModelIndexFromCommandId(int command_id) const {
1272 CommandIDToEntry::const_iterator ix = command_id_to_entry_.find(command_id); 1290 CommandIDToEntry::const_iterator ix = command_id_to_entry_.find(command_id);
1273 DCHECK(ix != command_id_to_entry_.end()); 1291 DCHECK(ix != command_id_to_entry_.end());
1274 return ix->second.second; 1292 return ix->second.second;
1275 } 1293 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698