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

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

Issue 3177034: Makes the download shelf auto-close after the user opens all downloads (Closed)
Patch Set: Have OnDownloadOpened invoked before opened to match old behavior Created 10 years, 3 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/views/download_shelf_view.h" 5 #include "chrome/browser/views/download_shelf_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "app/l10n_util.h" 9 #include "app/l10n_util.h"
10 #include "app/resource_bundle.h" 10 #include "app/resource_bundle.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 49
50 // Border color. 50 // Border color.
51 static const SkColor kBorderColor = SkColorSetRGB(214, 214, 214); 51 static const SkColor kBorderColor = SkColorSetRGB(214, 214, 214);
52 52
53 // New download item animation speed in milliseconds. 53 // New download item animation speed in milliseconds.
54 static const int kNewItemAnimationDurationMs = 800; 54 static const int kNewItemAnimationDurationMs = 800;
55 55
56 // Shelf show/hide speed. 56 // Shelf show/hide speed.
57 static const int kShelfAnimationDurationMs = 120; 57 static const int kShelfAnimationDurationMs = 120;
58 58
59 // Amount of time to delay if the mouse leaves the shelf by way of entering
60 // another window. This is much larger than the normal delay as openning a
61 // download is most likely going to trigger a new window to appear over the
62 // button. Delay the time so that the user has a chance to quickly close the
63 // other app and return to chrome with the download shelf still open.
64 static const int kNotifyOnExitTimeMS = 5000;
65
59 namespace { 66 namespace {
60 67
61 // Sets size->width() to view's preferred width + size->width().s 68 // Sets size->width() to view's preferred width + size->width().s
62 // Sets size->height() to the max of the view's preferred height and 69 // Sets size->height() to the max of the view's preferred height and
63 // size->height(); 70 // size->height();
64 void AdjustSize(views::View* view, gfx::Size* size) { 71 void AdjustSize(views::View* view, gfx::Size* size) {
65 gfx::Size view_preferred = view->GetPreferredSize(); 72 gfx::Size view_preferred = view->GetPreferredSize();
66 size->Enlarge(view_preferred.width(), 0); 73 size->Enlarge(view_preferred.width(), 0);
67 size->set_height(std::max(view_preferred.height(), size->height())); 74 size->set_height(std::max(view_preferred.height(), size->height()));
68 } 75 }
69 76
70 int CenterPosition(int size, int target_size) { 77 int CenterPosition(int size, int target_size) {
71 return std::max((target_size - size) / 2, kTopBottomPadding); 78 return std::max((target_size - size) / 2, kTopBottomPadding);
72 } 79 }
73 80
74 } // namespace 81 } // namespace
75 82
76 DownloadShelfView::DownloadShelfView(Browser* browser, BrowserView* parent) 83 DownloadShelfView::DownloadShelfView(Browser* browser, BrowserView* parent)
77 : browser_(browser), 84 : browser_(browser),
78 parent_(parent) { 85 parent_(parent),
86 ALLOW_THIS_IN_INITIALIZER_LIST(
87 mouse_watcher_(this, this, gfx::Insets())) {
88 mouse_watcher_.set_notify_on_exit_time_ms(kNotifyOnExitTimeMS);
79 SetID(VIEW_ID_DOWNLOAD_SHELF); 89 SetID(VIEW_ID_DOWNLOAD_SHELF);
80 parent->AddChildView(this); 90 parent->AddChildView(this);
81 Init(); 91 Init();
82 } 92 }
83 93
84 DownloadShelfView::~DownloadShelfView() { 94 DownloadShelfView::~DownloadShelfView() {
85 parent_->RemoveChildView(this); 95 parent_->RemoveChildView(this);
86 } 96 }
87 97
88 void DownloadShelfView::Init() { 98 void DownloadShelfView::Init() {
(...skipping 19 matching lines...) Expand all
108 118
109 new_item_animation_.reset(new SlideAnimation(this)); 119 new_item_animation_.reset(new SlideAnimation(this));
110 new_item_animation_->SetSlideDuration(kNewItemAnimationDurationMs); 120 new_item_animation_->SetSlideDuration(kNewItemAnimationDurationMs);
111 121
112 shelf_animation_.reset(new SlideAnimation(this)); 122 shelf_animation_.reset(new SlideAnimation(this));
113 shelf_animation_->SetSlideDuration(kShelfAnimationDurationMs); 123 shelf_animation_->SetSlideDuration(kShelfAnimationDurationMs);
114 Show(); 124 Show();
115 } 125 }
116 126
117 void DownloadShelfView::AddDownloadView(DownloadItemView* view) { 127 void DownloadShelfView::AddDownloadView(DownloadItemView* view) {
128 mouse_watcher_.Stop();
129
118 Show(); 130 Show();
119 131
120 DCHECK(view); 132 DCHECK(view);
121 download_views_.push_back(view); 133 download_views_.push_back(view);
122 AddChildView(view); 134 AddChildView(view);
123 if (download_views_.size() > kMaxDownloadViews) 135 if (download_views_.size() > kMaxDownloadViews)
124 RemoveDownloadView(*download_views_.begin()); 136 RemoveDownloadView(*download_views_.begin());
125 137
126 new_item_animation_->Reset(); 138 new_item_animation_->Reset();
127 new_item_animation_->Show(); 139 new_item_animation_->Show();
128 } 140 }
129 141
130 void DownloadShelfView::AddDownload(BaseDownloadItemModel* download_model) { 142 void DownloadShelfView::AddDownload(BaseDownloadItemModel* download_model) {
131 DownloadItemView* view = new DownloadItemView( 143 DownloadItemView* view = new DownloadItemView(
132 download_model->download(), this, download_model); 144 download_model->download(), this, download_model);
133 AddDownloadView(view); 145 AddDownloadView(view);
134 } 146 }
135 147
148 void DownloadShelfView::MouseMovedOutOfView() {
149 Close();
150 }
151
136 void DownloadShelfView::RemoveDownloadView(View* view) { 152 void DownloadShelfView::RemoveDownloadView(View* view) {
137 DCHECK(view); 153 DCHECK(view);
138 std::vector<DownloadItemView*>::iterator i = 154 std::vector<DownloadItemView*>::iterator i =
139 find(download_views_.begin(), download_views_.end(), view); 155 find(download_views_.begin(), download_views_.end(), view);
140 DCHECK(i != download_views_.end()); 156 DCHECK(i != download_views_.end());
141 download_views_.erase(i); 157 download_views_.erase(i);
142 RemoveChildView(view); 158 RemoveChildView(view);
143 delete view; 159 delete view;
144 if (download_views_.empty()) 160 if (download_views_.empty())
145 Close(); 161 Close();
162 else if (CanAutoClose())
163 mouse_watcher_.Start();
146 Layout(); 164 Layout();
147 SchedulePaint(); 165 SchedulePaint();
148 } 166 }
149 167
150 void DownloadShelfView::Paint(gfx::Canvas* canvas) { 168 void DownloadShelfView::Paint(gfx::Canvas* canvas) {
151 PaintBackground(canvas); 169 PaintBackground(canvas);
152 PaintBorder(canvas); 170 PaintBorder(canvas);
153 } 171 }
154 172
155 void DownloadShelfView::PaintBorder(gfx::Canvas* canvas) { 173 void DownloadShelfView::PaintBorder(gfx::Canvas* canvas) {
156 canvas->FillRectInt(kBorderColor, 0, 0, width(), 1); 174 canvas->FillRectInt(kBorderColor, 0, 0, width(), 1);
157 } 175 }
158 176
177 void DownloadShelfView::OpenedDownload(DownloadItemView* view) {
178 if (CanAutoClose())
179 mouse_watcher_.Start();
180 }
181
159 gfx::Size DownloadShelfView::GetPreferredSize() { 182 gfx::Size DownloadShelfView::GetPreferredSize() {
160 gfx::Size prefsize(kRightPadding + kLeftPadding + kCloseAndLinkPadding, 0); 183 gfx::Size prefsize(kRightPadding + kLeftPadding + kCloseAndLinkPadding, 0);
161 AdjustSize(close_button_, &prefsize); 184 AdjustSize(close_button_, &prefsize);
162 AdjustSize(show_all_view_, &prefsize); 185 AdjustSize(show_all_view_, &prefsize);
163 // Add one download view to the preferred size. 186 // Add one download view to the preferred size.
164 if (download_views_.size() > 0) { 187 if (download_views_.size() > 0) {
165 AdjustSize(*download_views_.begin(), &prefsize); 188 AdjustSize(*download_views_.begin(), &prefsize);
166 prefsize.Enlarge(kDownloadPadding, 0); 189 prefsize.Enlarge(kDownloadPadding, 0);
167 } 190 }
168 prefsize.Enlarge(0, kTopBottomPadding + kTopBottomPadding); 191 prefsize.Enlarge(0, kTopBottomPadding + kTopBottomPadding);
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 352
330 void DownloadShelfView::Close() { 353 void DownloadShelfView::Close() {
331 parent_->SetDownloadShelfVisible(false); 354 parent_->SetDownloadShelfVisible(false);
332 shelf_animation_->Hide(); 355 shelf_animation_->Hide();
333 } 356 }
334 357
335 void DownloadShelfView::Closed() { 358 void DownloadShelfView::Closed() {
336 // When the close animation is complete, remove all completed downloads. 359 // When the close animation is complete, remove all completed downloads.
337 size_t i = 0; 360 size_t i = 0;
338 while (i < download_views_.size()) { 361 while (i < download_views_.size()) {
339 DownloadItem* download = download_views_[i]->get_download(); 362 DownloadItem* download = download_views_[i]->download();
340 bool is_transfer_done = download->state() == DownloadItem::COMPLETE || 363 bool is_transfer_done = download->state() == DownloadItem::COMPLETE ||
341 download->state() == DownloadItem::CANCELLED; 364 download->state() == DownloadItem::CANCELLED;
342 if (is_transfer_done && 365 if (is_transfer_done &&
343 download->safety_state() != DownloadItem::DANGEROUS) { 366 download->safety_state() != DownloadItem::DANGEROUS) {
344 RemoveDownloadView(download_views_[i]); 367 RemoveDownloadView(download_views_[i]);
345 } else { 368 } else {
369 // Treat the item as opened when we close. This way if we get shown again
370 // the user need not open this item for the shelf to auto-close.
371 download->set_opened(true);
346 ++i; 372 ++i;
347 } 373 }
348 } 374 }
349 } 375 }
376
377 bool DownloadShelfView::CanAutoClose() {
378 for (size_t i = 0; i < download_views_.size(); ++i) {
379 if (!download_views_[i]->download()->opened())
380 return false;
381 }
382 return true;
383 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698