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

Side by Side Diff: chrome/browser/ui/views/notifications/balloon_view_views.cc

Issue 11189002: Makes notifications animate from the bottom of the screen (as was (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/views/notifications/balloon_view_views.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/notifications/balloon_view_views.h" 5 #include "chrome/browser/ui/views/notifications/balloon_view_views.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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 // Menu commands 80 // Menu commands
81 const int kRevokePermissionCommand = 0; 81 const int kRevokePermissionCommand = 0;
82 82
83 // Colors 83 // Colors
84 const SkColor kControlBarBackgroundColor = SkColorSetRGB(245, 245, 245); 84 const SkColor kControlBarBackgroundColor = SkColorSetRGB(245, 245, 245);
85 const SkColor kControlBarTextColor = SkColorSetRGB(125, 125, 125); 85 const SkColor kControlBarTextColor = SkColorSetRGB(125, 125, 125);
86 const SkColor kControlBarSeparatorLineColor = SkColorSetRGB(180, 180, 180); 86 const SkColor kControlBarSeparatorLineColor = SkColorSetRGB(180, 180, 180);
87 87
88 } // namespace 88 } // namespace
89 89
90 // static
91 int BalloonView::GetHorizontalMargin() {
92 return kLeftMargin + kRightMargin + kLeftShadowWidth + kRightShadowWidth;
93 }
94
90 BalloonViewImpl::BalloonViewImpl(BalloonCollection* collection) 95 BalloonViewImpl::BalloonViewImpl(BalloonCollection* collection)
91 : balloon_(NULL), 96 : balloon_(NULL),
92 collection_(collection), 97 collection_(collection),
93 frame_container_(NULL), 98 frame_container_(NULL),
94 html_container_(NULL), 99 html_container_(NULL),
95 html_contents_(NULL), 100 html_contents_(NULL),
96 method_factory_(this), 101 method_factory_(this),
97 close_button_(NULL), 102 close_button_(NULL),
98 animation_(NULL), 103 animation_(NULL),
99 options_menu_model_(NULL), 104 options_menu_model_(NULL),
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 options_menu_button_->SetBoundsRect(GetOptionsButtonBounds()); 205 options_menu_button_->SetBoundsRect(GetOptionsButtonBounds());
201 source_label_->SetBoundsRect(GetLabelBounds()); 206 source_label_->SetBoundsRect(GetLabelBounds());
202 } 207 }
203 208
204 void BalloonViewImpl::RepositionToBalloon() { 209 void BalloonViewImpl::RepositionToBalloon() {
205 DCHECK(frame_container_); 210 DCHECK(frame_container_);
206 DCHECK(html_container_); 211 DCHECK(html_container_);
207 DCHECK(balloon_); 212 DCHECK(balloon_);
208 213
209 if (!kAnimateEnabled) { 214 if (!kAnimateEnabled) {
210 frame_container_->SetBounds( 215 frame_container_->SetBounds(GetBoundsForFrameContainer());
211 gfx::Rect(balloon_->GetPosition().x(), balloon_->GetPosition().y(),
212 GetTotalWidth(), GetTotalHeight()));
213 gfx::Rect contents_rect = GetContentsRectangle(); 216 gfx::Rect contents_rect = GetContentsRectangle();
214 html_container_->SetBounds(contents_rect); 217 html_container_->SetBounds(contents_rect);
215 html_contents_->SetPreferredSize(contents_rect.size()); 218 html_contents_->SetPreferredSize(contents_rect.size());
216 content::RenderWidgetHostView* view = 219 content::RenderWidgetHostView* view =
217 html_contents_->web_contents()->GetRenderWidgetHostView(); 220 html_contents_->web_contents()->GetRenderWidgetHostView();
218 if (view) 221 if (view)
219 view->SetSize(contents_rect.size()); 222 view->SetSize(contents_rect.size());
220 return; 223 return;
221 } 224 }
222 225
223 anim_frame_end_ = gfx::Rect( 226 anim_frame_end_ = GetBoundsForFrameContainer();
224 balloon_->GetPosition().x(), balloon_->GetPosition().y(),
225 GetTotalWidth(), GetTotalHeight());
226 anim_frame_start_ = frame_container_->GetClientAreaBoundsInScreen(); 227 anim_frame_start_ = frame_container_->GetClientAreaBoundsInScreen();
227 animation_.reset(new ui::SlideAnimation(this)); 228 animation_.reset(new ui::SlideAnimation(this));
228 animation_->Show(); 229 animation_->Show();
229 } 230 }
230 231
231 void BalloonViewImpl::Update() { 232 void BalloonViewImpl::Update() {
232 DCHECK(html_contents_.get()) << "BalloonView::Update called before Show"; 233 DCHECK(html_contents_.get()) << "BalloonView::Update called before Show";
233 if (!html_contents_->web_contents()) 234 if (!html_contents_->web_contents())
234 return; 235 return;
235 html_contents_->web_contents()->GetController().LoadURL( 236 html_contents_->web_contents()->GetController().LoadURL(
236 balloon_->notification().content_url(), content::Referrer(), 237 balloon_->notification().content_url(), content::Referrer(),
237 content::PAGE_TRANSITION_LINK, std::string()); 238 content::PAGE_TRANSITION_LINK, std::string());
238 } 239 }
239 240
240 void BalloonViewImpl::AnimationProgressed(const ui::Animation* animation) { 241 void BalloonViewImpl::AnimationProgressed(const ui::Animation* animation) {
241 DCHECK(animation == animation_.get()); 242 DCHECK(animation == animation_.get());
242 243
243 // Linear interpolation from start to end position. 244 // Linear interpolation from start to end position.
244 double e = animation->GetCurrentValue(); 245 gfx::Rect frame_position(animation_->CurrentValueBetween(
245 double s = (1.0 - e); 246 anim_frame_start_, anim_frame_end_));
246
247 gfx::Rect frame_position(
248 static_cast<int>(s * anim_frame_start_.x() +
249 e * anim_frame_end_.x()),
250 static_cast<int>(s * anim_frame_start_.y() +
251 e * anim_frame_end_.y()),
252 static_cast<int>(s * anim_frame_start_.width() +
253 e * anim_frame_end_.width()),
254 static_cast<int>(s * anim_frame_start_.height() +
255 e * anim_frame_end_.height()));
256 frame_container_->SetBounds(frame_position); 247 frame_container_->SetBounds(frame_position);
257 248
258 gfx::Path path; 249 gfx::Path path;
259 gfx::Rect contents_rect = GetContentsRectangle(); 250 gfx::Rect contents_rect = GetContentsRectangle();
260 html_container_->SetBounds(contents_rect); 251 html_container_->SetBounds(contents_rect);
261 GetContentsMask(contents_rect, &path); 252 GetContentsMask(contents_rect, &path);
262 html_container_->SetShape(path.CreateNativeRegion()); 253 html_container_->SetShape(path.CreateNativeRegion());
263 254
264 html_contents_->SetPreferredSize(contents_rect.size()); 255 html_contents_->SetPreferredSize(contents_rect.size());
265 content::RenderWidgetHostView* view = 256 content::RenderWidgetHostView* view =
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 // corners using alpha blending (and we may do other alpha blending 320 // corners using alpha blending (and we may do other alpha blending
330 // effects). 321 // effects).
331 // Unfortunately, layered windows cannot have child windows. (Well, they can 322 // Unfortunately, layered windows cannot have child windows. (Well, they can
332 // but the child windows don't render). 323 // but the child windows don't render).
333 // 324 //
334 // We carefully keep these two windows in sync to present the illusion of 325 // We carefully keep these two windows in sync to present the illusion of
335 // one window to the user. 326 // one window to the user.
336 // 327 //
337 // We don't let the OS manage the RTL layout of these widgets, because 328 // We don't let the OS manage the RTL layout of these widgets, because
338 // this code is already taking care of correctly reversing the layout. 329 // this code is already taking care of correctly reversing the layout.
339 gfx::Rect contents_rect = GetContentsRectangle();
340 #if defined(OS_CHROMEOS) && defined(USE_AURA) 330 #if defined(OS_CHROMEOS) && defined(USE_AURA)
341 html_contents_.reset(new chromeos::BalloonViewHost(balloon)); 331 html_contents_.reset(new chromeos::BalloonViewHost(balloon));
342 #else 332 #else
343 html_contents_.reset(new BalloonViewHost(balloon)); 333 html_contents_.reset(new BalloonViewHost(balloon));
344 #endif 334 #endif
345 html_contents_->SetPreferredSize(gfx::Size(10000, 10000)); 335 html_contents_->SetPreferredSize(gfx::Size(10000, 10000));
346 if (enable_web_ui_) 336 if (enable_web_ui_)
347 html_contents_->EnableWebUI(); 337 html_contents_->EnableWebUI();
348 338
349 html_container_ = new views::Widget; 339 html_container_ = new views::Widget;
350 views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); 340 views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
351 params.bounds = contents_rect;
352 html_container_->Init(params); 341 html_container_->Init(params);
353 html_container_->SetContentsView(html_contents_->view()); 342 html_container_->SetContentsView(html_contents_->view());
354 343
355 gfx::Rect balloon_rect(x(), y(), GetTotalWidth(), GetTotalHeight());
356 frame_container_ = new views::Widget; 344 frame_container_ = new views::Widget;
357 params.delegate = this; 345 params.delegate = this;
358 params.transparent = true; 346 params.transparent = true;
359 params.bounds = balloon_rect; 347 params.bounds = GetBoundsForFrameContainer();
360 frame_container_->Init(params); 348 frame_container_->Init(params);
361 frame_container_->SetContentsView(this); 349 frame_container_->SetContentsView(this);
362 frame_container_->StackAboveWidget(html_container_); 350 frame_container_->StackAboveWidget(html_container_);
363 351
352 // GetContentsRectangle() is calculated relative to |frame_container_|. Make
353 // sure |frame_container_| has bounds before we ask for
354 // GetContentsRectangle().
355 html_container_->SetBounds(GetContentsRectangle());
356
364 // SetAlwaysOnTop should be called after StackAboveWidget because otherwise 357 // SetAlwaysOnTop should be called after StackAboveWidget because otherwise
365 // the top-most flag will be removed. 358 // the top-most flag will be removed.
366 html_container_->SetAlwaysOnTop(true); 359 html_container_->SetAlwaysOnTop(true);
367 frame_container_->SetAlwaysOnTop(true); 360 frame_container_->SetAlwaysOnTop(true);
368 361
369 close_button_->SetImage(views::CustomButton::BS_NORMAL, 362 close_button_->SetImage(views::CustomButton::BS_NORMAL,
370 rb.GetImageSkiaNamed(IDR_TAB_CLOSE)); 363 rb.GetImageSkiaNamed(IDR_TAB_CLOSE));
371 close_button_->SetImage(views::CustomButton::BS_HOT, 364 close_button_->SetImage(views::CustomButton::BS_HOT,
372 rb.GetImageSkiaNamed(IDR_TAB_CLOSE_H)); 365 rb.GetImageSkiaNamed(IDR_TAB_CLOSE_H));
373 close_button_->SetImage(views::CustomButton::BS_PUSHED, 366 close_button_->SetImage(views::CustomButton::BS_PUSHED,
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 path->lineTo(right, bottom); 449 path->lineTo(right, bottom);
457 path->lineTo(left, bottom); 450 path->lineTo(left, bottom);
458 path->close(); 451 path->close();
459 } 452 }
460 453
461 gfx::Point BalloonViewImpl::GetContentsOffset() const { 454 gfx::Point BalloonViewImpl::GetContentsOffset() const {
462 return gfx::Point(kLeftShadowWidth + kLeftMargin, 455 return gfx::Point(kLeftShadowWidth + kLeftMargin,
463 kTopShadowWidth + kTopMargin); 456 kTopShadowWidth + kTopMargin);
464 } 457 }
465 458
459 gfx::Rect BalloonViewImpl::GetBoundsForFrameContainer() const {
460 return gfx::Rect(balloon_->GetPosition().x(), balloon_->GetPosition().y(),
461 GetTotalWidth(), GetTotalHeight());
462 }
463
466 int BalloonViewImpl::GetShelfHeight() const { 464 int BalloonViewImpl::GetShelfHeight() const {
467 // TODO(johnnyg): add scaling here. 465 // TODO(johnnyg): add scaling here.
468 int max_button_height = std::max(std::max( 466 int max_button_height = std::max(std::max(
469 close_button_->GetPreferredSize().height(), 467 close_button_->GetPreferredSize().height(),
470 options_menu_button_->GetPreferredSize().height()), 468 options_menu_button_->GetPreferredSize().height()),
471 source_label_->GetPreferredSize().height()); 469 source_label_->GetPreferredSize().height());
472 return max_button_height + kShelfMargin * 2; 470 return max_button_height + kShelfMargin * 2;
473 } 471 }
474 472
475 int BalloonViewImpl::GetBalloonFrameHeight() const { 473 int BalloonViewImpl::GetBalloonFrameHeight() const {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 return; 531 return;
534 } 532 }
535 533
536 // If the renderer process attached to this balloon is disconnected 534 // If the renderer process attached to this balloon is disconnected
537 // (e.g., because of a crash), we want to close the balloon. 535 // (e.g., because of a crash), we want to close the balloon.
538 notification_registrar_.Remove( 536 notification_registrar_.Remove(
539 this, chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED, 537 this, chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED,
540 content::Source<Balloon>(balloon_)); 538 content::Source<Balloon>(balloon_));
541 Close(false); 539 Close(false);
542 } 540 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/notifications/balloon_view_views.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698