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

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

Issue 1236463002: Vectorize download shelf progress indicators (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: typo fix Created 5 years, 5 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_item_view.h" 5 #include "chrome/browser/ui/views/download/download_item_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 89
90 // How long we keep the item disabled after the user clicked it to open the 90 // How long we keep the item disabled after the user clicked it to open the
91 // downloaded item. 91 // downloaded item.
92 static const int kDisabledOnOpenDuration = 3000; 92 static const int kDisabledOnOpenDuration = 3000;
93 93
94 // Darken light-on-dark download status text by 20% before drawing, thus 94 // Darken light-on-dark download status text by 20% before drawing, thus
95 // creating a "muted" version of title text for both dark-on-light and 95 // creating a "muted" version of title text for both dark-on-light and
96 // light-on-dark themes. 96 // light-on-dark themes.
97 static const double kDownloadItemLuminanceMod = 0.8; 97 static const double kDownloadItemLuminanceMod = 0.8;
98 98
99 namespace {
100
101 // Callback for DownloadShelf paint functions to mirror the progress animation
102 // in RTL locales.
103 void RTLMirrorXForView(views::View* containing_view, gfx::Rect* bounds) {
104 bounds->set_x(containing_view->GetMirroredXForRect(*bounds));
105 }
106
107 } // namespace
108
109 DownloadItemView::DownloadItemView(DownloadItem* download_item, 99 DownloadItemView::DownloadItemView(DownloadItem* download_item,
110 DownloadShelfView* parent) 100 DownloadShelfView* parent)
111 : warning_icon_(NULL), 101 : warning_icon_(NULL),
112 shelf_(parent), 102 shelf_(parent),
113 status_text_(l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_STARTING)), 103 status_text_(l10n_util::GetStringUTF16(IDS_DOWNLOAD_STATUS_STARTING)),
114 body_state_(NORMAL), 104 body_state_(NORMAL),
115 drop_down_state_(NORMAL), 105 drop_down_state_(NORMAL),
116 mode_(NORMAL_MODE), 106 mode_(NORMAL_MODE),
117 progress_angle_(DownloadShelf::kStartAngleDegrees),
118 drop_down_pressed_(false), 107 drop_down_pressed_(false),
119 dragging_(false), 108 dragging_(false),
120 starting_drag_(false), 109 starting_drag_(false),
121 model_(download_item), 110 model_(download_item),
122 save_button_(NULL), 111 save_button_(NULL),
123 discard_button_(NULL), 112 discard_button_(NULL),
124 dangerous_download_label_(NULL), 113 dangerous_download_label_(NULL),
125 dangerous_download_label_sized_(false), 114 dangerous_download_label_sized_(false),
126 disabled_while_opening_(false), 115 disabled_while_opening_(false),
127 creation_time_(base::Time::Now()), 116 creation_time_(base::Time::Now()),
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 226
238 // ExperienceSampling: If the user took no action to remove the warning 227 // ExperienceSampling: If the user took no action to remove the warning
239 // before it disappeared, then the user effectively dismissed the download 228 // before it disappeared, then the user effectively dismissed the download
240 // without keeping it. 229 // without keeping it.
241 if (sampling_event_.get()) 230 if (sampling_event_.get())
242 sampling_event_->CreateUserDecisionEvent(ExperienceSamplingEvent::kIgnore); 231 sampling_event_->CreateUserDecisionEvent(ExperienceSamplingEvent::kIgnore);
243 } 232 }
244 233
245 // Progress animation handlers. 234 // Progress animation handlers.
246 235
247 void DownloadItemView::UpdateDownloadProgress() {
248 progress_angle_ =
249 (progress_angle_ + DownloadShelf::kUnknownIncrementDegrees) %
250 DownloadShelf::kMaxDegrees;
251 SchedulePaint();
252 }
253
254 void DownloadItemView::StartDownloadProgress() { 236 void DownloadItemView::StartDownloadProgress() {
255 if (progress_timer_.IsRunning()) 237 if (progress_timer_.IsRunning())
256 return; 238 return;
257 progress_timer_.Start(FROM_HERE, 239 progress_start_time_ = base::TimeTicks::Now();
258 base::TimeDelta::FromMilliseconds(DownloadShelf::kProgressRateMs), this, 240 progress_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(
259 &DownloadItemView::UpdateDownloadProgress); 241 DownloadShelf::kProgressRateMs),
242 this, &DownloadItemView::SchedulePaint);
260 } 243 }
261 244
262 void DownloadItemView::StopDownloadProgress() { 245 void DownloadItemView::StopDownloadProgress() {
263 progress_timer_.Stop(); 246 progress_timer_.Stop();
264 } 247 }
265 248
266 void DownloadItemView::OnExtractIconComplete(gfx::Image* icon_bitmap) { 249 void DownloadItemView::OnExtractIconComplete(gfx::Image* icon_bitmap) {
267 if (icon_bitmap) 250 if (icon_bitmap)
268 shelf_->SchedulePaint(); 251 shelf_->SchedulePaint();
269 } 252 }
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 icon = image->ToImageSkia(); 846 icon = image->ToImageSkia();
864 847
865 // We count on the fact that the icon manager will cache the icons and if one 848 // We count on the fact that the icon manager will cache the icons and if one
866 // is available, it will be cached here. We *don't* want to request the icon 849 // is available, it will be cached here. We *don't* want to request the icon
867 // to be loaded here, since this will also get called if the icon can't be 850 // to be loaded here, since this will also get called if the icon can't be
868 // loaded, in which case LookupIcon will always be NULL. The loading will be 851 // loaded, in which case LookupIcon will always be NULL. The loading will be
869 // triggered only when we think the status might change. 852 // triggered only when we think the status might change.
870 if (icon) { 853 if (icon) {
871 if (!IsShowingWarningDialog()) { 854 if (!IsShowingWarningDialog()) {
872 DownloadItem::DownloadState state = download()->GetState(); 855 DownloadItem::DownloadState state = download()->GetState();
873 DownloadShelf::BoundsAdjusterCallback rtl_mirror = 856 canvas->Save();
874 base::Bind(&RTLMirrorXForView, base::Unretained(this)); 857 if (base::i18n::IsRTL())
858 canvas->Translate(
859 gfx::Vector2d(width() - DownloadShelf::kSmallProgressIconSize, 0));
860
875 if (state == DownloadItem::IN_PROGRESS) { 861 if (state == DownloadItem::IN_PROGRESS) {
876 DownloadShelf::PaintDownloadProgress(canvas, rtl_mirror, 0, 0, 862 DownloadShelf::PaintDownloadProgress(canvas, progress_start_time_,
877 progress_angle_,
878 model_.PercentComplete()); 863 model_.PercentComplete());
879 } else if (complete_animation_.get() && 864 } else if (complete_animation_.get() &&
880 complete_animation_->is_animating()) { 865 complete_animation_->is_animating()) {
881 if (state == DownloadItem::INTERRUPTED) { 866 if (state == DownloadItem::INTERRUPTED) {
882 DownloadShelf::PaintDownloadInterrupted( 867 DownloadShelf::PaintDownloadInterrupted(
883 canvas, rtl_mirror, 0, 0, complete_animation_->GetCurrentValue()); 868 canvas, complete_animation_->GetCurrentValue());
884 } else { 869 } else {
885 DCHECK_EQ(DownloadItem::COMPLETE, state); 870 DCHECK_EQ(DownloadItem::COMPLETE, state);
886 DownloadShelf::PaintDownloadComplete( 871 DownloadShelf::PaintDownloadComplete(
887 canvas, rtl_mirror, 0, 0, complete_animation_->GetCurrentValue()); 872 canvas, complete_animation_->GetCurrentValue());
888 } 873 }
889 } 874 }
875 canvas->Restore();
890 } 876 }
891 877
892 // Draw the icon image. 878 // Draw the icon image.
893 int icon_x, icon_y; 879 int icon_x, icon_y;
894 880
895 if (IsShowingWarningDialog()) { 881 if (IsShowingWarningDialog()) {
896 icon_x = kLeftPadding + body_image_set->top_left->width(); 882 icon_x = kLeftPadding + body_image_set->top_left->width();
897 icon_y = (height() - icon->height()) / 2; 883 icon_y = (height() - icon->height()) / 2;
898 } else { 884 } else {
899 icon_x = DownloadShelf::kSmallProgressIconOffset; 885 icon_x = DownloadShelf::kSmallProgressIconOffset;
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
1382 void DownloadItemView::AnimateStateTransition(State from, State to, 1368 void DownloadItemView::AnimateStateTransition(State from, State to,
1383 gfx::SlideAnimation* animation) { 1369 gfx::SlideAnimation* animation) {
1384 if (from == NORMAL && to == HOT) { 1370 if (from == NORMAL && to == HOT) {
1385 animation->Show(); 1371 animation->Show();
1386 } else if (from == HOT && to == NORMAL) { 1372 } else if (from == HOT && to == NORMAL) {
1387 animation->Hide(); 1373 animation->Hide();
1388 } else if (from != to) { 1374 } else if (from != to) {
1389 animation->Reset((to == HOT) ? 1.0 : 0.0); 1375 animation->Reset((to == HOT) ? 1.0 : 0.0);
1390 } 1376 }
1391 } 1377 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698