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

Side by Side Diff: chrome/browser/ui/views/download/download_shelf_view.cc

Issue 1367083002: Download bar MD overhaul, part 3 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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 (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 "chrome/browser/ui/views/download/download_shelf_view.h" 5 #include "chrome/browser/ui/views/download/download_shelf_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 11 matching lines...) Expand all
22 #include "content/public/browser/download_item.h" 22 #include "content/public/browser/download_item.h"
23 #include "content/public/browser/download_manager.h" 23 #include "content/public/browser/download_manager.h"
24 #include "content/public/browser/page_navigator.h" 24 #include "content/public/browser/page_navigator.h"
25 #include "grit/theme_resources.h" 25 #include "grit/theme_resources.h"
26 #include "ui/base/l10n/l10n_util.h" 26 #include "ui/base/l10n/l10n_util.h"
27 #include "ui/base/resource/material_design/material_design_controller.h" 27 #include "ui/base/resource/material_design/material_design_controller.h"
28 #include "ui/base/resource/resource_bundle.h" 28 #include "ui/base/resource/resource_bundle.h"
29 #include "ui/base/theme_provider.h" 29 #include "ui/base/theme_provider.h"
30 #include "ui/gfx/animation/slide_animation.h" 30 #include "ui/gfx/animation/slide_animation.h"
31 #include "ui/gfx/canvas.h" 31 #include "ui/gfx/canvas.h"
32 #include "ui/gfx/color_palette.h"
33 #include "ui/gfx/paint_vector_icon.h"
34 #include "ui/gfx/vector_icons_public.h"
32 #include "ui/resources/grit/ui_resources.h" 35 #include "ui/resources/grit/ui_resources.h"
33 #include "ui/views/background.h" 36 #include "ui/views/background.h"
37 #include "ui/views/border.h"
34 #include "ui/views/controls/button/image_button.h" 38 #include "ui/views/controls/button/image_button.h"
35 #include "ui/views/controls/image_view.h" 39 #include "ui/views/controls/image_view.h"
36 #include "ui/views/controls/link.h" 40 #include "ui/views/controls/link.h"
37 #include "ui/views/mouse_watcher_view_host.h" 41 #include "ui/views/mouse_watcher_view_host.h"
38 42
39 using content::DownloadItem; 43 using content::DownloadItem;
40 44
41 namespace { 45 namespace {
42 46
43 // Max number of download views we'll contain. Any time a view is added and 47 // Max number of download views we'll contain. Any time a view is added and
44 // we already have this many download views, one is removed. 48 // we already have this many download views, one is removed.
45 const size_t kMaxDownloadViews = 15; 49 const size_t kMaxDownloadViews = 15;
46 50
47 // Padding from left edge and first download view. 51 // Padding from left edge and first download view.
48 const int kLeftPadding = 2; 52 const int kLeftPadding = 2;
49 const int kStartPaddingMd = 4; 53 const int kStartPaddingMd = 4;
50 54
51 // Padding from right edge and close button/show downloads link. 55 // Padding from right edge and close button/show downloads link.
52 const int kRightPadding = 10; 56 const int kRightPadding = 10;
53 const int kEndPaddingMd = 6; 57 const int kEndPaddingMd = 6;
54 58
55 // Padding between the show all link and close button. 59 // Padding between the show all link and close button.
56 const int kCloseAndLinkPadding = 14; 60 const int kCloseAndLinkPadding = 14;
61 const int kCloseAndLinkPaddingMd = 6;
57 62
58 // Padding between the download views. 63 // Padding between the download views.
59 const int kDownloadPadding = 10; 64 const int kDownloadPadding = 10;
60 65
61 // Padding between the top/bottom and the content. 66 // Padding between the top/bottom and the content.
62 const int kTopBottomPadding = 2; 67 const int kTopBottomPadding = 2;
63 const int kTopBottomPaddingMd = 6;
64 68
65 // Padding between the icon and 'show all downloads' link 69 // Padding between the icon and 'show all downloads' link
66 const int kDownloadsTitlePadding = 4; 70 const int kDownloadsTitlePadding = 4;
67 71
68 // Border color. 72 // Border color.
69 const SkColor kBorderColor = SkColorSetRGB(214, 214, 214); 73 const SkColor kBorderColor = SkColorSetRGB(214, 214, 214);
70 74
71 // New download item animation speed in milliseconds. 75 // New download item animation speed in milliseconds.
72 const int kNewItemAnimationDurationMs = 800; 76 const int kNewItemAnimationDurationMs = 800;
73 77
(...skipping 10 matching lines...) Expand all
84 int GetStartPadding() { 88 int GetStartPadding() {
85 return ui::MaterialDesignController::IsModeMaterial() ? kStartPaddingMd 89 return ui::MaterialDesignController::IsModeMaterial() ? kStartPaddingMd
86 : kLeftPadding; 90 : kLeftPadding;
87 } 91 }
88 92
89 int GetEndPadding() { 93 int GetEndPadding() {
90 return ui::MaterialDesignController::IsModeMaterial() ? kEndPaddingMd 94 return ui::MaterialDesignController::IsModeMaterial() ? kEndPaddingMd
91 : kRightPadding; 95 : kRightPadding;
92 } 96 }
93 97
98 int GetCloseAndLinkPadding() {
99 return ui::MaterialDesignController::IsModeMaterial() ? kCloseAndLinkPaddingMd
100 : kCloseAndLinkPadding;
101 }
102
94 int GetBetweenItemPadding() { 103 int GetBetweenItemPadding() {
95 return ui::MaterialDesignController::IsModeMaterial() ? 0 : kDownloadPadding; 104 return ui::MaterialDesignController::IsModeMaterial() ? 0 : kDownloadPadding;
96 } 105 }
97 106
98 int GetTopBottomPadding() { 107 int GetTopBottomPadding() {
99 return ui::MaterialDesignController::IsModeMaterial() ? kTopBottomPaddingMd 108 return ui::MaterialDesignController::IsModeMaterial() ? 0 : kTopBottomPadding;
100 : kTopBottomPadding;
101 } 109 }
102 110
103 // Sets size->width() to view's preferred width + size->width().s 111 // Sets size->width() to view's preferred width + size->width().s
104 // Sets size->height() to the max of the view's preferred height and 112 // Sets size->height() to the max of the view's preferred height and
105 // size->height(); 113 // size->height();
106 void AdjustSize(views::View* view, gfx::Size* size) { 114 void AdjustSize(views::View* view, gfx::Size* size) {
107 gfx::Size view_preferred = view->GetPreferredSize(); 115 gfx::Size view_preferred = view->GetPreferredSize();
108 size->Enlarge(view_preferred.width(), 0); 116 size->Enlarge(view_preferred.width(), 0);
109 size->set_height(std::max(view_preferred.height(), size->height())); 117 size->set_height(std::max(view_preferred.height(), size->height()));
110 } 118 }
111 119
112 int CenterPosition(int size, int target_size) { 120 int CenterPosition(int size, int target_size) {
113 return std::max((target_size - size) / 2, GetTopBottomPadding()); 121 return std::max((target_size - size) / 2, GetTopBottomPadding());
114 } 122 }
115 123
116 } // namespace 124 } // namespace
117 125
118 DownloadShelfView::DownloadShelfView(Browser* browser, BrowserView* parent) 126 DownloadShelfView::DownloadShelfView(Browser* browser, BrowserView* parent)
119 : browser_(browser), 127 : browser_(browser),
120 arrow_image_(NULL), 128 new_item_animation_(this),
121 show_all_view_(NULL), 129 shelf_animation_(this),
122 close_button_(NULL), 130 arrow_image_(nullptr),
131 show_all_view_(nullptr),
132 close_button_(nullptr),
123 parent_(parent), 133 parent_(parent),
124 mouse_watcher_(new views::MouseWatcherViewHost(this, gfx::Insets()), 134 mouse_watcher_(new views::MouseWatcherViewHost(this, gfx::Insets()),
125 this) { 135 this) {
126 mouse_watcher_.set_notify_on_exit_time( 136 mouse_watcher_.set_notify_on_exit_time(
127 base::TimeDelta::FromMilliseconds(kNotifyOnExitTimeMS)); 137 base::TimeDelta::FromMilliseconds(kNotifyOnExitTimeMS));
128 set_id(VIEW_ID_DOWNLOAD_SHELF); 138 set_id(VIEW_ID_DOWNLOAD_SHELF);
129 parent->AddChildView(this); 139 parent->AddChildView(this);
140
141 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
142
143 arrow_image_ = new views::ImageView();
Evan Stade 2015/09/25 00:48:08 I moved this code because of pkasting's comment he
144 AddChildView(arrow_image_);
145 close_button_ = new views::ImageButton(this);
146 close_button_->SetAccessibleName(
147 l10n_util::GetStringUTF16(IDS_ACCNAME_CLOSE));
148 if (!ui::MaterialDesignController::IsModeMaterial()) {
149 arrow_image_->SetImage(rb.GetImageSkiaNamed(IDR_DOWNLOADS_FAVICON));
150
151 views::Link* show_all_view =
152 new views::Link(l10n_util::GetStringUTF16(IDS_SHOW_ALL_DOWNLOADS));
153 show_all_view->set_listener(this);
154 show_all_view_ = show_all_view;
155
156 close_button_->SetImage(views::CustomButton::STATE_NORMAL,
157 rb.GetImageSkiaNamed(IDR_CLOSE_1));
158 close_button_->SetImage(views::CustomButton::STATE_HOVERED,
159 rb.GetImageSkiaNamed(IDR_CLOSE_1_H));
160 close_button_->SetImage(views::CustomButton::STATE_PRESSED,
161 rb.GetImageSkiaNamed(IDR_CLOSE_1_P));
162 } else {
163 views::LabelButton* show_all_view = new views::LabelButton(
164 this, l10n_util::GetStringUTF16(IDS_SHOW_ALL_DOWNLOADS_MD));
165 show_all_view->SetFocusable(true);
166 show_all_view->SetStyle(views::Button::STYLE_BUTTON);
167 show_all_view_ = show_all_view;
168
169 // TODO(estade): share this button init code with the find in page bar;
170 // also fix theming.
171 close_button_->SetBorder(views::Border::CreateEmptyBorder(4, 4, 4, 4));
172 close_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
173 views::ImageButton::ALIGN_MIDDLE);
174 gfx::ImageSkia image = gfx::CreateVectorIcon(gfx::VectorIconId::BAR_CLOSE,
175 16, gfx::kChromeIconGrey);
176 close_button_->SetImage(views::CustomButton::STATE_NORMAL, &image);
177 }
178 AddChildView(show_all_view_);
179 AddChildView(close_button_);
180
181 new_item_animation_.SetSlideDuration(kNewItemAnimationDurationMs);
182 shelf_animation_.SetSlideDuration(kShelfAnimationDurationMs);
130 } 183 }
131 184
132 DownloadShelfView::~DownloadShelfView() { 185 DownloadShelfView::~DownloadShelfView() {
133 parent_->RemoveChildView(this); 186 parent_->RemoveChildView(this);
134 } 187 }
135 188
136 void DownloadShelfView::AddDownloadView(views::View* view) { 189 void DownloadShelfView::AddDownloadView(views::View* view) {
137 mouse_watcher_.Stop(); 190 mouse_watcher_.Stop();
138 191
139 DCHECK(view); 192 DCHECK(view);
140 download_views_.push_back(view); 193 download_views_.push_back(view);
141 194
142 // Insert the new view as the first child, so the logical child order matches 195 // Insert the new view as the first child, so the logical child order matches
143 // the visual order. This ensures that tabbing through downloads happens in 196 // the visual order. This ensures that tabbing through downloads happens in
144 // the order users would expect. 197 // the order users would expect.
145 AddChildViewAt(view, 0); 198 AddChildViewAt(view, 0);
146 if (download_views_.size() > kMaxDownloadViews) 199 if (download_views_.size() > kMaxDownloadViews)
147 RemoveDownloadView(*download_views_.begin()); 200 RemoveDownloadView(*download_views_.begin());
148 201
149 new_item_animation_->Reset(); 202 new_item_animation_.Reset();
150 new_item_animation_->Show(); 203 new_item_animation_.Show();
151 } 204 }
152 205
153 void DownloadShelfView::DoAddDownload(DownloadItem* download) { 206 void DownloadShelfView::DoAddDownload(DownloadItem* download) {
154 if (ui::MaterialDesignController::IsModeMaterial()) 207 if (ui::MaterialDesignController::IsModeMaterial())
155 AddDownloadView(new DownloadItemViewMd(download, this)); 208 AddDownloadView(new DownloadItemViewMd(download, this));
156 else 209 else
157 AddDownloadView(new DownloadItemView(download, this)); 210 AddDownloadView(new DownloadItemView(download, this));
158 } 211 }
159 212
160 void DownloadShelfView::MouseMovedOutOfHost() { 213 void DownloadShelfView::MouseMovedOutOfHost() {
161 Close(AUTOMATIC); 214 Close(AUTOMATIC);
162 } 215 }
163 216
164 void DownloadShelfView::RemoveDownloadView(View* view) { 217 void DownloadShelfView::RemoveDownloadView(View* view) {
165 DCHECK(view); 218 DCHECK(view);
166 auto i = find(download_views_.begin(), download_views_.end(), view); 219 auto i = find(download_views_.begin(), download_views_.end(), view);
167 DCHECK(i != download_views_.end()); 220 DCHECK(i != download_views_.end());
168 download_views_.erase(i); 221 download_views_.erase(i);
169 RemoveChildView(view); 222 RemoveChildView(view);
170 delete view; 223 delete view;
171 if (download_views_.empty()) 224 if (download_views_.empty())
172 Close(AUTOMATIC); 225 Close(AUTOMATIC);
173 else if (CanAutoClose()) 226 else if (CanAutoClose())
174 mouse_watcher_.Start(); 227 mouse_watcher_.Start();
175 Layout(); 228 Layout();
176 SchedulePaint(); 229 SchedulePaint();
177 } 230 }
178 231
179 views::View* DownloadShelfView::GetDefaultFocusableChild() { 232 views::View* DownloadShelfView::GetDefaultFocusableChild() {
180 return download_views_.empty() ? 233 return download_views_.empty() ? show_all_view_ : download_views_.back();
181 static_cast<View*>(show_all_view_) : download_views_.back();
182 } 234 }
183 235
184 void DownloadShelfView::OnPaintBorder(gfx::Canvas* canvas) { 236 void DownloadShelfView::OnPaintBorder(gfx::Canvas* canvas) {
185 canvas->FillRect(gfx::Rect(0, 0, width(), 1), kBorderColor); 237 canvas->FillRect(gfx::Rect(0, 0, width(), 1), kBorderColor);
186 } 238 }
187 239
188 void DownloadShelfView::OpenedDownload() { 240 void DownloadShelfView::OpenedDownload() {
189 if (CanAutoClose()) 241 if (CanAutoClose())
190 mouse_watcher_.Start(); 242 mouse_watcher_.Start();
191 } 243 }
192 244
193 content::PageNavigator* DownloadShelfView::GetNavigator() { 245 content::PageNavigator* DownloadShelfView::GetNavigator() {
194 return browser_; 246 return browser_;
195 } 247 }
196 248
197 gfx::Size DownloadShelfView::GetPreferredSize() const { 249 gfx::Size DownloadShelfView::GetPreferredSize() const {
198 gfx::Size prefsize(GetEndPadding() + GetStartPadding() + kCloseAndLinkPadding, 250 gfx::Size prefsize(
199 0); 251 GetEndPadding() + GetStartPadding() + GetCloseAndLinkPadding(), 0);
200 AdjustSize(close_button_, &prefsize); 252 AdjustSize(close_button_, &prefsize);
201 AdjustSize(show_all_view_, &prefsize); 253 AdjustSize(show_all_view_, &prefsize);
202 // Add one download view to the preferred size. 254 // Add one download view to the preferred size.
203 if (!download_views_.empty()) { 255 if (!download_views_.empty()) {
204 AdjustSize(*download_views_.begin(), &prefsize); 256 AdjustSize(*download_views_.begin(), &prefsize);
205 prefsize.Enlarge(GetBetweenItemPadding(), 0); 257 prefsize.Enlarge(GetBetweenItemPadding(), 0);
206 } 258 }
207 prefsize.Enlarge(0, 2 * GetTopBottomPadding()); 259 prefsize.Enlarge(0, 2 * GetTopBottomPadding());
208 if (shelf_animation_->is_animating()) { 260 if (shelf_animation_.is_animating()) {
209 prefsize.set_height(static_cast<int>( 261 prefsize.set_height(
210 static_cast<double>(prefsize.height()) * 262 static_cast<int>(static_cast<double>(prefsize.height()) *
211 shelf_animation_->GetCurrentValue())); 263 shelf_animation_.GetCurrentValue()));
212 } 264 }
213 return prefsize; 265 return prefsize;
214 } 266 }
215 267
216 void DownloadShelfView::AnimationProgressed(const gfx::Animation *animation) { 268 void DownloadShelfView::AnimationProgressed(const gfx::Animation* animation) {
217 if (animation == new_item_animation_.get()) { 269 if (animation == &new_item_animation_) {
218 Layout(); 270 Layout();
219 SchedulePaint(); 271 SchedulePaint();
220 } else if (animation == shelf_animation_.get()) { 272 } else if (animation == &shelf_animation_) {
221 // Force a re-layout of the parent, which will call back into 273 // Force a re-layout of the parent, which will call back into
222 // GetPreferredSize, where we will do our animation. In the case where the 274 // GetPreferredSize, where we will do our animation. In the case where the
223 // animation is hiding, we do a full resize - the fast resizing would 275 // animation is hiding, we do a full resize - the fast resizing would
224 // otherwise leave blank white areas where the shelf was and where the 276 // otherwise leave blank white areas where the shelf was and where the
225 // user's eye is. Thankfully bottom-resizing is a lot faster than 277 // user's eye is. Thankfully bottom-resizing is a lot faster than
226 // top-resizing. 278 // top-resizing.
227 parent_->ToolbarSizeChanged(shelf_animation_->IsShowing()); 279 parent_->ToolbarSizeChanged(shelf_animation_.IsShowing());
228 } 280 }
229 } 281 }
230 282
231 void DownloadShelfView::AnimationEnded(const gfx::Animation *animation) { 283 void DownloadShelfView::AnimationEnded(const gfx::Animation *animation) {
232 if (animation == shelf_animation_.get()) { 284 if (animation == &shelf_animation_) {
233 parent_->SetDownloadShelfVisible(shelf_animation_->IsShowing()); 285 parent_->SetDownloadShelfVisible(shelf_animation_.IsShowing());
234 if (!shelf_animation_->IsShowing()) 286 if (!shelf_animation_.IsShowing())
235 Closed(); 287 Closed();
236 } 288 }
237 } 289 }
238 290
239 void DownloadShelfView::Layout() { 291 void DownloadShelfView::Layout() {
240 // Let our base class layout our child views 292 // Let our base class layout our child views
241 views::View::Layout(); 293 views::View::Layout();
242 294
243 // If there is not enough room to show the first download item, show the 295 // If there is not enough room to show the first download item, show the
244 // "Show all downloads" link to the left to make it more visible that there is 296 // "Show all downloads" link to the left to make it more visible that there is
245 // something to see. 297 // something to see.
246 bool show_link_only = !CanFitFirstDownloadItem(); 298 bool show_link_only = !CanFitFirstDownloadItem();
247 299
248 gfx::Size image_size = arrow_image_->GetPreferredSize(); 300 gfx::Size image_size = arrow_image_->GetPreferredSize();
249 gfx::Size close_button_size = close_button_->GetPreferredSize(); 301 gfx::Size close_button_size = close_button_->GetPreferredSize();
250 gfx::Size show_all_size = show_all_view_->GetPreferredSize(); 302 gfx::Size show_all_size = show_all_view_->GetPreferredSize();
251 int max_download_x = 303 int max_download_x =
252 std::max<int>(0, width() - GetEndPadding() - close_button_size.width() - 304 std::max<int>(0, width() - GetEndPadding() - close_button_size.width() -
253 kCloseAndLinkPadding - show_all_size.width() - 305 GetCloseAndLinkPadding() - show_all_size.width() -
254 kDownloadsTitlePadding - image_size.width() - 306 kDownloadsTitlePadding - image_size.width() -
255 GetBetweenItemPadding()); 307 GetBetweenItemPadding());
256 int next_x = show_link_only ? GetStartPadding() 308 int next_x = show_link_only ? GetStartPadding()
257 : max_download_x + GetBetweenItemPadding(); 309 : max_download_x + GetBetweenItemPadding();
258 // Align vertically with show_all_view_. 310 // Align vertically with show_all_view_.
259 arrow_image_->SetBounds(next_x, 311 arrow_image_->SetBounds(next_x,
260 CenterPosition(image_size.height(), height()), 312 CenterPosition(image_size.height(), height()),
261 image_size.width(), image_size.height()); 313 image_size.width(), image_size.height());
262 next_x += image_size.width() + kDownloadsTitlePadding; 314 next_x += image_size.width() + kDownloadsTitlePadding;
263 show_all_view_->SetBounds(next_x, 315 show_all_view_->SetBounds(next_x,
264 CenterPosition(show_all_size.height(), height()), 316 CenterPosition(show_all_size.height(), height()),
265 show_all_size.width(), 317 show_all_size.width(),
266 show_all_size.height()); 318 show_all_size.height());
267 next_x += show_all_size.width() + kCloseAndLinkPadding; 319 next_x += show_all_size.width() + GetCloseAndLinkPadding();
268 // If the window is maximized, we want to expand the hitbox of the close 320 // If the window is maximized, we want to expand the hitbox of the close
269 // button to the right and bottom to make it easier to click. 321 // button to the right and bottom to make it easier to click.
270 bool is_maximized = browser_->window()->IsMaximized(); 322 bool is_maximized = browser_->window()->IsMaximized();
271 int y = CenterPosition(close_button_size.height(), height()); 323 int y = CenterPosition(close_button_size.height(), height());
272 close_button_->SetBounds(next_x, y, 324 close_button_->SetBounds(next_x, y,
273 is_maximized ? width() - next_x : close_button_size.width(), 325 is_maximized ? width() - next_x : close_button_size.width(),
274 is_maximized ? height() - y : close_button_size.height()); 326 is_maximized ? height() - y : close_button_size.height());
275 if (show_link_only) { 327 if (show_link_only) {
276 // Let's hide all the items. 328 // Let's hide all the items.
277 for (auto ri = download_views_.rbegin(); ri != download_views_.rend(); ++ri) 329 for (auto ri = download_views_.rbegin(); ri != download_views_.rend(); ++ri)
278 (*ri)->SetVisible(false); 330 (*ri)->SetVisible(false);
279 return; 331 return;
280 } 332 }
281 333
282 next_x = GetStartPadding(); 334 next_x = GetStartPadding();
283 for (auto ri = download_views_.rbegin(); ri != download_views_.rend(); ++ri) { 335 for (auto ri = download_views_.rbegin(); ri != download_views_.rend(); ++ri) {
284 gfx::Size view_size = (*ri)->GetPreferredSize(); 336 gfx::Size view_size = (*ri)->GetPreferredSize();
285 337
286 int x = next_x; 338 int x = next_x;
287 339
288 // Figure out width of item. 340 // Figure out width of item.
289 int item_width = view_size.width(); 341 int item_width = view_size.width();
290 if (new_item_animation_->is_animating() && ri == download_views_.rbegin()) { 342 if (new_item_animation_.is_animating() && ri == download_views_.rbegin()) {
291 item_width = static_cast<int>(static_cast<double>(view_size.width()) * 343 item_width = static_cast<int>(static_cast<double>(view_size.width()) *
292 new_item_animation_->GetCurrentValue()); 344 new_item_animation_.GetCurrentValue());
293 } 345 }
294 346
295 next_x += item_width; 347 next_x += item_width;
296 348
297 // Make sure our item can be contained within the shelf. 349 // Make sure our item can be contained within the shelf.
298 if (next_x < max_download_x) { 350 if (next_x < max_download_x) {
299 (*ri)->SetVisible(true); 351 (*ri)->SetVisible(true);
300 (*ri)->SetBounds(x, CenterPosition(view_size.height(), height()), 352 (*ri)->SetBounds(x, CenterPosition(view_size.height(), height()),
301 item_width, view_size.height()); 353 item_width, view_size.height());
302 } else { 354 } else {
303 (*ri)->SetVisible(false); 355 (*ri)->SetVisible(false);
304 } 356 }
305 } 357 }
306 } 358 }
307 359
308 void DownloadShelfView::ViewHierarchyChanged( 360 void DownloadShelfView::ViewHierarchyChanged(
309 const ViewHierarchyChangedDetails& details) { 361 const ViewHierarchyChangedDetails& details) {
310 View::ViewHierarchyChanged(details); 362 View::ViewHierarchyChanged(details);
311 363 if (details.is_add)
312 if (details.is_add && (details.child == this)) {
313 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
314 arrow_image_ = new views::ImageView();
315 arrow_image_->SetImage(rb.GetImageSkiaNamed(IDR_DOWNLOADS_FAVICON));
316 AddChildView(arrow_image_);
317
318 show_all_view_ = new views::Link(
319 l10n_util::GetStringUTF16(IDS_SHOW_ALL_DOWNLOADS));
320 show_all_view_->set_listener(this);
321 AddChildView(show_all_view_);
322
323 close_button_ = new views::ImageButton(this);
324 close_button_->SetImage(views::CustomButton::STATE_NORMAL,
325 rb.GetImageSkiaNamed(IDR_CLOSE_1));
326 close_button_->SetImage(views::CustomButton::STATE_HOVERED,
327 rb.GetImageSkiaNamed(IDR_CLOSE_1_H));
328 close_button_->SetImage(views::CustomButton::STATE_PRESSED,
329 rb.GetImageSkiaNamed(IDR_CLOSE_1_P));
330 close_button_->SetAccessibleName(
331 l10n_util::GetStringUTF16(IDS_ACCNAME_CLOSE));
332 AddChildView(close_button_);
333
334 UpdateColorsFromTheme(); 364 UpdateColorsFromTheme();
335
336 new_item_animation_.reset(new gfx::SlideAnimation(this));
337 new_item_animation_->SetSlideDuration(kNewItemAnimationDurationMs);
338
339 shelf_animation_.reset(new gfx::SlideAnimation(this));
340 shelf_animation_->SetSlideDuration(kShelfAnimationDurationMs);
341 }
342 } 365 }
343 366
344 bool DownloadShelfView::CanFitFirstDownloadItem() { 367 bool DownloadShelfView::CanFitFirstDownloadItem() {
345 if (download_views_.empty()) 368 if (download_views_.empty())
346 return true; 369 return true;
347 370
348 gfx::Size image_size = arrow_image_->GetPreferredSize(); 371 gfx::Size image_size = arrow_image_->GetPreferredSize();
349 gfx::Size close_button_size = close_button_->GetPreferredSize(); 372 gfx::Size close_button_size = close_button_->GetPreferredSize();
350 gfx::Size show_all_size = show_all_view_->GetPreferredSize(); 373 gfx::Size show_all_size = show_all_view_->GetPreferredSize();
351 374
352 // Let's compute the width available for download items, which is the width 375 // Let's compute the width available for download items, which is the width
353 // of the shelf minus the "Show all downloads" link, arrow and close button 376 // of the shelf minus the "Show all downloads" link, arrow and close button
354 // and the padding. 377 // and the padding.
355 int available_width = width() - GetEndPadding() - close_button_size.width() - 378 int available_width = width() - GetEndPadding() - close_button_size.width() -
356 kCloseAndLinkPadding - show_all_size.width() - 379 GetCloseAndLinkPadding() - show_all_size.width() -
357 kDownloadsTitlePadding - image_size.width() - 380 kDownloadsTitlePadding - image_size.width() -
358 GetBetweenItemPadding() - GetStartPadding(); 381 GetBetweenItemPadding() - GetStartPadding();
359 if (available_width <= 0) 382 if (available_width <= 0)
360 return false; 383 return false;
361 384
362 gfx::Size item_size = (*download_views_.rbegin())->GetPreferredSize(); 385 gfx::Size item_size = (*download_views_.rbegin())->GetPreferredSize();
363 return item_size.width() < available_width; 386 return item_size.width() < available_width;
364 } 387 }
365 388
366 void DownloadShelfView::UpdateColorsFromTheme() { 389 void DownloadShelfView::UpdateColorsFromTheme() {
367 if (show_all_view_ && close_button_ && GetThemeProvider()) { 390 if (show_all_view_ && close_button_ && GetThemeProvider()) {
391 set_background(views::Background::CreateSolidBackground(
392 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR)));
393
394 if (!ui::MaterialDesignController::IsModeMaterial()) {
395 views::Link* show_all_view = static_cast<views::Link*>(show_all_view_);
396 show_all_view->SetBackgroundColor(background()->get_color());
397 show_all_view->SetEnabledColor(
398 GetThemeProvider()->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT));
399 }
400
368 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 401 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
369 set_background(views::Background::CreateSolidBackground( 402 set_background(views::Background::CreateSolidBackground(
370 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR))); 403 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR)));
371 show_all_view_->SetBackgroundColor(background()->get_color());
372 show_all_view_->SetEnabledColor(
373 GetThemeProvider()->GetColor(ThemeProperties::COLOR_BOOKMARK_TEXT));
374 close_button_->SetBackground( 404 close_button_->SetBackground(
375 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TAB_TEXT), 405 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TAB_TEXT),
376 rb.GetImageSkiaNamed(IDR_CLOSE_1), 406 rb.GetImageSkiaNamed(IDR_CLOSE_1),
377 rb.GetImageSkiaNamed(IDR_CLOSE_1_MASK)); 407 rb.GetImageSkiaNamed(IDR_CLOSE_1_MASK));
378 } 408 }
379 } 409 }
380 410
381 void DownloadShelfView::OnThemeChanged() { 411 void DownloadShelfView::OnThemeChanged() {
382 UpdateColorsFromTheme(); 412 UpdateColorsFromTheme();
383 } 413 }
384 414
385 void DownloadShelfView::LinkClicked(views::Link* source, int event_flags) { 415 void DownloadShelfView::LinkClicked(views::Link* source, int event_flags) {
386 chrome::ShowDownloads(browser_); 416 chrome::ShowDownloads(browser_);
387 } 417 }
388 418
389 void DownloadShelfView::ButtonPressed( 419 void DownloadShelfView::ButtonPressed(
390 views::Button* button, const ui::Event& event) { 420 views::Button* button, const ui::Event& event) {
391 Close(USER_ACTION); 421 if (button == close_button_)
422 Close(USER_ACTION);
423 else if (button == show_all_view_)
424 chrome::ShowDownloads(browser_);
425 else
426 NOTREACHED();
392 } 427 }
393 428
394 bool DownloadShelfView::IsShowing() const { 429 bool DownloadShelfView::IsShowing() const {
395 return visible() && shelf_animation_->IsShowing(); 430 return visible() && shelf_animation_.IsShowing();
396 } 431 }
397 432
398 bool DownloadShelfView::IsClosing() const { 433 bool DownloadShelfView::IsClosing() const {
399 return shelf_animation_->IsClosing(); 434 return shelf_animation_.IsClosing();
400 } 435 }
401 436
402 void DownloadShelfView::DoShow() { 437 void DownloadShelfView::DoShow() {
403 SetVisible(true); 438 SetVisible(true);
404 shelf_animation_->Show(); 439 shelf_animation_.Show();
405 } 440 }
406 441
407 void DownloadShelfView::DoClose(CloseReason reason) { 442 void DownloadShelfView::DoClose(CloseReason reason) {
408 int num_in_progress = 0; 443 int num_in_progress = 0;
409 for (size_t i = 0; i < download_views_.size(); ++i) { 444 for (size_t i = 0; i < download_views_.size(); ++i) {
410 if (GetDownloadItemForView(i)->GetState() == DownloadItem::IN_PROGRESS) 445 if (GetDownloadItemForView(i)->GetState() == DownloadItem::IN_PROGRESS)
411 ++num_in_progress; 446 ++num_in_progress;
412 } 447 }
413 RecordDownloadShelfClose( 448 RecordDownloadShelfClose(
414 download_views_.size(), num_in_progress, reason == AUTOMATIC); 449 download_views_.size(), num_in_progress, reason == AUTOMATIC);
415 parent_->SetDownloadShelfVisible(false); 450 parent_->SetDownloadShelfVisible(false);
416 shelf_animation_->Hide(); 451 shelf_animation_.Hide();
417 } 452 }
418 453
419 Browser* DownloadShelfView::browser() const { 454 Browser* DownloadShelfView::browser() const {
420 return browser_; 455 return browser_;
421 } 456 }
422 457
423 void DownloadShelfView::Closed() { 458 void DownloadShelfView::Closed() {
424 // Don't remove completed downloads if the shelf is just being auto-hidden 459 // Don't remove completed downloads if the shelf is just being auto-hidden
425 // rather than explicitly closed by the user. 460 // rather than explicitly closed by the user.
426 if (is_hidden()) 461 if (is_hidden())
(...skipping 24 matching lines...) Expand all
451 return false; 486 return false;
452 } 487 }
453 return true; 488 return true;
454 } 489 }
455 490
456 content::DownloadItem* DownloadShelfView::GetDownloadItemForView(size_t i) { 491 content::DownloadItem* DownloadShelfView::GetDownloadItemForView(size_t i) {
457 if (ui::MaterialDesignController::IsModeMaterial()) 492 if (ui::MaterialDesignController::IsModeMaterial())
458 return static_cast<DownloadItemViewMd*>(download_views_[i])->download(); 493 return static_cast<DownloadItemViewMd*>(download_views_[i])->download();
459 return static_cast<DownloadItemView*>(download_views_[i])->download(); 494 return static_cast<DownloadItemView*>(download_views_[i])->download();
460 } 495 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698