| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "ui/message_center/views/toast_contents_view.h" | 5 #include "ui/message_center/views/toast_contents_view.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| 11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
| 12 #include "base/timer/timer.h" | 12 #include "base/timer/timer.h" |
| 13 #include "ui/base/accessibility/accessible_view_state.h" | 13 #include "ui/base/accessibility/accessible_view_state.h" |
| 14 #include "ui/base/animation/animation_delegate.h" | 14 #include "ui/gfx/animation/animation_delegate.h" |
| 15 #include "ui/base/animation/slide_animation.h" | 15 #include "ui/gfx/animation/slide_animation.h" |
| 16 #include "ui/gfx/display.h" | 16 #include "ui/gfx/display.h" |
| 17 #include "ui/gfx/screen.h" | 17 #include "ui/gfx/screen.h" |
| 18 #include "ui/message_center/message_center.h" | 18 #include "ui/message_center/message_center.h" |
| 19 #include "ui/message_center/message_center_style.h" | 19 #include "ui/message_center/message_center_style.h" |
| 20 #include "ui/message_center/notification.h" | 20 #include "ui/message_center/notification.h" |
| 21 #include "ui/message_center/views/message_popup_collection.h" | 21 #include "ui/message_center/views/message_popup_collection.h" |
| 22 #include "ui/message_center/views/message_view.h" | 22 #include "ui/message_center/views/message_view.h" |
| 23 #include "ui/views/view.h" | 23 #include "ui/views/view.h" |
| 24 #include "ui/views/widget/widget.h" | 24 #include "ui/views/widget/widget.h" |
| 25 #include "ui/views/widget/widget_delegate.h" | 25 #include "ui/views/widget/widget_delegate.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 52 is_closing_(false), | 52 is_closing_(false), |
| 53 closing_animation_(NULL) { | 53 closing_animation_(NULL) { |
| 54 DCHECK(collection_); | 54 DCHECK(collection_); |
| 55 | 55 |
| 56 set_notify_enter_exit_on_child(true); | 56 set_notify_enter_exit_on_child(true); |
| 57 // Sets the transparent background. Then, when the message view is slid out, | 57 // Sets the transparent background. Then, when the message view is slid out, |
| 58 // the whole toast seems to slide although the actual bound of the widget | 58 // the whole toast seems to slide although the actual bound of the widget |
| 59 // remains. This is hacky but easier to keep the consistency. | 59 // remains. This is hacky but easier to keep the consistency. |
| 60 set_background(views::Background::CreateSolidBackground(0, 0, 0, 0)); | 60 set_background(views::Background::CreateSolidBackground(0, 0, 0, 0)); |
| 61 | 61 |
| 62 fade_animation_.reset(new ui::SlideAnimation(this)); | 62 fade_animation_.reset(new gfx::SlideAnimation(this)); |
| 63 fade_animation_->SetSlideDuration(kFadeInOutDuration); | 63 fade_animation_->SetSlideDuration(kFadeInOutDuration); |
| 64 } | 64 } |
| 65 | 65 |
| 66 // This is destroyed when the toast window closes. | 66 // This is destroyed when the toast window closes. |
| 67 ToastContentsView::~ToastContentsView() { | 67 ToastContentsView::~ToastContentsView() { |
| 68 } | 68 } |
| 69 | 69 |
| 70 views::Widget* ToastContentsView::CreateWidget(gfx::NativeView parent) { | 70 views::Widget* ToastContentsView::CreateWidget(gfx::NativeView parent) { |
| 71 views::Widget::InitParams params( | 71 views::Widget::InitParams params( |
| 72 views::Widget::InitParams::TYPE_POPUP); | 72 views::Widget::InitParams::TYPE_POPUP); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 // on screen, the rest should refer to the bounds_. | 160 // on screen, the rest should refer to the bounds_. |
| 161 animated_bounds_start_ = GetWidget()->GetWindowBoundsInScreen(); | 161 animated_bounds_start_ = GetWidget()->GetWindowBoundsInScreen(); |
| 162 animated_bounds_end_ = new_bounds; | 162 animated_bounds_end_ = new_bounds; |
| 163 | 163 |
| 164 if (collection_) | 164 if (collection_) |
| 165 collection_->IncrementDeferCounter(); | 165 collection_->IncrementDeferCounter(); |
| 166 | 166 |
| 167 if (bounds_animation_.get()) | 167 if (bounds_animation_.get()) |
| 168 bounds_animation_->Stop(); | 168 bounds_animation_->Stop(); |
| 169 | 169 |
| 170 bounds_animation_.reset(new ui::SlideAnimation(this)); | 170 bounds_animation_.reset(new gfx::SlideAnimation(this)); |
| 171 bounds_animation_->Show(); | 171 bounds_animation_->Show(); |
| 172 } | 172 } |
| 173 | 173 |
| 174 void ToastContentsView::StartFadeIn() { | 174 void ToastContentsView::StartFadeIn() { |
| 175 // The decrement is done in OnBoundsAnimationEndedOrCancelled callback. | 175 // The decrement is done in OnBoundsAnimationEndedOrCancelled callback. |
| 176 if (collection_) | 176 if (collection_) |
| 177 collection_->IncrementDeferCounter(); | 177 collection_->IncrementDeferCounter(); |
| 178 fade_animation_->Stop(); | 178 fade_animation_->Stop(); |
| 179 | 179 |
| 180 GetWidget()->SetOpacity(0); | 180 GetWidget()->SetOpacity(0); |
| 181 GetWidget()->Show(); | 181 GetWidget()->Show(); |
| 182 fade_animation_->Reset(0); | 182 fade_animation_->Reset(0); |
| 183 fade_animation_->Show(); | 183 fade_animation_->Show(); |
| 184 } | 184 } |
| 185 | 185 |
| 186 void ToastContentsView::StartFadeOut() { | 186 void ToastContentsView::StartFadeOut() { |
| 187 // The decrement is done in OnBoundsAnimationEndedOrCancelled callback. | 187 // The decrement is done in OnBoundsAnimationEndedOrCancelled callback. |
| 188 if (collection_) | 188 if (collection_) |
| 189 collection_->IncrementDeferCounter(); | 189 collection_->IncrementDeferCounter(); |
| 190 fade_animation_->Stop(); | 190 fade_animation_->Stop(); |
| 191 | 191 |
| 192 closing_animation_ = (is_closing_ ? fade_animation_.get() : NULL); | 192 closing_animation_ = (is_closing_ ? fade_animation_.get() : NULL); |
| 193 fade_animation_->Reset(1); | 193 fade_animation_->Reset(1); |
| 194 fade_animation_->Hide(); | 194 fade_animation_->Hide(); |
| 195 } | 195 } |
| 196 | 196 |
| 197 void ToastContentsView::OnBoundsAnimationEndedOrCancelled( | 197 void ToastContentsView::OnBoundsAnimationEndedOrCancelled( |
| 198 const ui::Animation* animation) { | 198 const gfx::Animation* animation) { |
| 199 if (is_closing_ && closing_animation_ == animation && GetWidget()) { | 199 if (is_closing_ && closing_animation_ == animation && GetWidget()) { |
| 200 views::Widget* widget = GetWidget(); | 200 views::Widget* widget = GetWidget(); |
| 201 #if defined(USE_AURA) | 201 #if defined(USE_AURA) |
| 202 // TODO(dewittj): This is a workaround to prevent a nasty bug where | 202 // TODO(dewittj): This is a workaround to prevent a nasty bug where |
| 203 // closing a transparent widget doesn't actually remove the window, | 203 // closing a transparent widget doesn't actually remove the window, |
| 204 // causing entire areas of the screen to become unresponsive to clicks. | 204 // causing entire areas of the screen to become unresponsive to clicks. |
| 205 // See crbug.com/243469 | 205 // See crbug.com/243469 |
| 206 widget->Hide(); | 206 widget->Hide(); |
| 207 # if defined(OS_WIN) | 207 # if defined(OS_WIN) |
| 208 widget->SetOpacity(0xFF); | 208 widget->SetOpacity(0xFF); |
| 209 # endif | 209 # endif |
| 210 #endif | 210 #endif |
| 211 widget->Close(); | 211 widget->Close(); |
| 212 } | 212 } |
| 213 | 213 |
| 214 // This cannot be called before GetWidget()->Close(). Decrementing defer count | 214 // This cannot be called before GetWidget()->Close(). Decrementing defer count |
| 215 // will invoke update, which may invoke another close animation with | 215 // will invoke update, which may invoke another close animation with |
| 216 // incrementing defer counter. Close() after such process will cause a | 216 // incrementing defer counter. Close() after such process will cause a |
| 217 // mismatch between increment/decrement. See crbug.com/238477 | 217 // mismatch between increment/decrement. See crbug.com/238477 |
| 218 if (collection_) | 218 if (collection_) |
| 219 collection_->DecrementDeferCounter(); | 219 collection_->DecrementDeferCounter(); |
| 220 } | 220 } |
| 221 | 221 |
| 222 // ui::AnimationDelegate | 222 // gfx::AnimationDelegate |
| 223 void ToastContentsView::AnimationProgressed(const ui::Animation* animation) { | 223 void ToastContentsView::AnimationProgressed(const gfx::Animation* animation) { |
| 224 if (animation == bounds_animation_.get()) { | 224 if (animation == bounds_animation_.get()) { |
| 225 gfx::Rect current(animation->CurrentValueBetween( | 225 gfx::Rect current(animation->CurrentValueBetween( |
| 226 animated_bounds_start_, animated_bounds_end_)); | 226 animated_bounds_start_, animated_bounds_end_)); |
| 227 GetWidget()->SetBounds(current); | 227 GetWidget()->SetBounds(current); |
| 228 } else if (animation == fade_animation_.get()) { | 228 } else if (animation == fade_animation_.get()) { |
| 229 unsigned char opacity = | 229 unsigned char opacity = |
| 230 static_cast<unsigned char>(fade_animation_->GetCurrentValue() * 255); | 230 static_cast<unsigned char>(fade_animation_->GetCurrentValue() * 255); |
| 231 GetWidget()->SetOpacity(opacity); | 231 GetWidget()->SetOpacity(opacity); |
| 232 } | 232 } |
| 233 } | 233 } |
| 234 | 234 |
| 235 void ToastContentsView::AnimationEnded(const ui::Animation* animation) { | 235 void ToastContentsView::AnimationEnded(const gfx::Animation* animation) { |
| 236 OnBoundsAnimationEndedOrCancelled(animation); | 236 OnBoundsAnimationEndedOrCancelled(animation); |
| 237 } | 237 } |
| 238 | 238 |
| 239 void ToastContentsView::AnimationCanceled( | 239 void ToastContentsView::AnimationCanceled( |
| 240 const ui::Animation* animation) { | 240 const gfx::Animation* animation) { |
| 241 OnBoundsAnimationEndedOrCancelled(animation); | 241 OnBoundsAnimationEndedOrCancelled(animation); |
| 242 } | 242 } |
| 243 | 243 |
| 244 // views::WidgetDelegate | 244 // views::WidgetDelegate |
| 245 views::View* ToastContentsView::GetContentsView() { | 245 views::View* ToastContentsView::GetContentsView() { |
| 246 return this; | 246 return this; |
| 247 } | 247 } |
| 248 | 248 |
| 249 void ToastContentsView::WindowClosing() { | 249 void ToastContentsView::WindowClosing() { |
| 250 if (!is_closing_ && collection_) | 250 if (!is_closing_ && collection_) |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 } | 314 } |
| 315 | 315 |
| 316 gfx::Rect ToastContentsView::GetClosedToastBounds(gfx::Rect bounds) { | 316 gfx::Rect ToastContentsView::GetClosedToastBounds(gfx::Rect bounds) { |
| 317 return gfx::Rect(bounds.x() + bounds.width() - kClosedToastWidth, | 317 return gfx::Rect(bounds.x() + bounds.width() - kClosedToastWidth, |
| 318 bounds.y(), | 318 bounds.y(), |
| 319 kClosedToastWidth, | 319 kClosedToastWidth, |
| 320 bounds.height()); | 320 bounds.height()); |
| 321 } | 321 } |
| 322 | 322 |
| 323 } // namespace message_center | 323 } // namespace message_center |
| OLD | NEW |