| 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 "content/browser/web_contents/aura/window_slider.h" | 5 #include "content/browser/web_contents/aura/window_slider.h" |
| 6 | 6 |
| 7 #include <algorithm> |
| 8 |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/callback.h" | 10 #include "base/callback.h" |
| 9 #include "content/browser/web_contents/aura/shadow_layer_delegate.h" | 11 #include "content/browser/web_contents/aura/shadow_layer_delegate.h" |
| 10 #include "content/public/browser/overscroll_configuration.h" | 12 #include "content/public/browser/overscroll_configuration.h" |
| 11 #include "ui/aura/window.h" | 13 #include "ui/aura/window.h" |
| 12 #include "ui/base/events/event.h" | 14 #include "ui/base/events/event.h" |
| 13 #include "ui/compositor/layer_animation_observer.h" | 15 #include "ui/compositor/layer_animation_observer.h" |
| 14 #include "ui/compositor/scoped_layer_animation_settings.h" | 16 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 15 | 17 |
| 16 namespace content { | 18 namespace content { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 void WindowSlider::ChangeOwner(aura::Window* new_owner) { | 81 void WindowSlider::ChangeOwner(aura::Window* new_owner) { |
| 80 if (owner_) | 82 if (owner_) |
| 81 owner_->RemoveObserver(this); | 83 owner_->RemoveObserver(this); |
| 82 owner_ = new_owner; | 84 owner_ = new_owner; |
| 83 if (owner_) { | 85 if (owner_) { |
| 84 owner_->AddObserver(this); | 86 owner_->AddObserver(this); |
| 85 UpdateForScroll(0.f, 0.f); | 87 UpdateForScroll(0.f, 0.f); |
| 86 } | 88 } |
| 87 } | 89 } |
| 88 | 90 |
| 91 bool WindowSlider::SlideIsInProgress() const { |
| 92 return fabs(delta_x_) >= min_start_threshold_ || weak_factory_.HasWeakPtrs(); |
| 93 } |
| 94 |
| 89 void WindowSlider::SetupSliderLayer() { | 95 void WindowSlider::SetupSliderLayer() { |
| 90 ui::Layer* parent = owner_->layer()->parent(); | 96 ui::Layer* parent = owner_->layer()->parent(); |
| 91 parent->Add(slider_.get()); | 97 parent->Add(slider_.get()); |
| 92 if (delta_x_ < 0) | 98 if (delta_x_ < 0) |
| 93 parent->StackAbove(slider_.get(), owner_->layer()); | 99 parent->StackAbove(slider_.get(), owner_->layer()); |
| 94 else | 100 else |
| 95 parent->StackBelow(slider_.get(), owner_->layer()); | 101 parent->StackBelow(slider_.get(), owner_->layer()); |
| 96 slider_->SetBounds(owner_->layer()->bounds()); | 102 slider_->SetBounds(owner_->layer()->bounds()); |
| 97 slider_->SetVisible(true); | 103 slider_->SetVisible(true); |
| 98 } | 104 } |
| 99 | 105 |
| 100 void WindowSlider::UpdateForScroll(float x_offset, float y_offset) { | 106 void WindowSlider::UpdateForScroll(float x_offset, float y_offset) { |
| 101 float old_delta = delta_x_; | 107 float old_delta = delta_x_; |
| 102 delta_x_ += x_offset; | 108 delta_x_ += x_offset; |
| 103 if (fabs(delta_x_) < min_start_threshold_) { | 109 if (fabs(delta_x_) < min_start_threshold_ && !slider_.get()) |
| 104 ResetScroll(); | |
| 105 return; | 110 return; |
| 106 } | |
| 107 | 111 |
| 108 if ((old_delta < 0 && delta_x_ > 0) || | 112 if ((old_delta < 0 && delta_x_ > 0) || |
| 109 (old_delta > 0 && delta_x_ < 0)) { | 113 (old_delta > 0 && delta_x_ < 0)) { |
| 110 slider_.reset(); | 114 slider_.reset(); |
| 111 shadow_.reset(); | 115 shadow_.reset(); |
| 112 } | 116 } |
| 113 | 117 |
| 114 float translate = 0.f; | 118 float translate = 0.f; |
| 115 ui::Layer* translate_layer = NULL; | 119 ui::Layer* translate_layer = NULL; |
| 116 | 120 |
| 117 if (delta_x_ <= -min_start_threshold_) { | 121 if (delta_x_ <= -min_start_threshold_) { |
| 118 if (!slider_.get()) { | 122 if (!slider_.get()) { |
| 119 slider_.reset(delegate_->CreateFrontLayer()); | 123 slider_.reset(delegate_->CreateFrontLayer()); |
| 124 if (!slider_.get()) |
| 125 return; |
| 120 SetupSliderLayer(); | 126 SetupSliderLayer(); |
| 121 } | 127 } |
| 122 translate = event_window_->bounds().width() - | 128 translate = owner_->bounds().width() + |
| 123 fabs(delta_x_ - min_start_threshold_); | 129 std::max(delta_x_ + min_start_threshold_, |
| 130 static_cast<float>(-owner_->bounds().width())); |
| 124 translate_layer = slider_.get(); | 131 translate_layer = slider_.get(); |
| 125 } else if (delta_x_ >= min_start_threshold_) { | 132 } else if (delta_x_ >= min_start_threshold_) { |
| 126 if (!slider_.get()) { | 133 if (!slider_.get()) { |
| 127 slider_.reset(delegate_->CreateBackLayer()); | 134 slider_.reset(delegate_->CreateBackLayer()); |
| 135 if (!slider_.get()) |
| 136 return; |
| 128 SetupSliderLayer(); | 137 SetupSliderLayer(); |
| 129 } | 138 } |
| 130 translate = delta_x_ - min_start_threshold_; | 139 translate = std::min(delta_x_ - min_start_threshold_, |
| 140 static_cast<float>(owner_->bounds().width())); |
| 131 translate_layer = owner_->layer(); | 141 translate_layer = owner_->layer(); |
| 132 } else { | 142 } else { |
| 133 NOTREACHED(); | 143 NOTREACHED(); |
| 134 } | 144 } |
| 135 | 145 |
| 136 if (!shadow_.get()) | 146 if (!shadow_.get()) |
| 137 shadow_.reset(new ShadowLayerDelegate(translate_layer)); | 147 shadow_.reset(new ShadowLayerDelegate(translate_layer)); |
| 138 | 148 |
| 139 gfx::Transform transform; | 149 gfx::Transform transform; |
| 140 transform.Translate(translate, 0); | 150 transform.Translate(translate, 0); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 } | 217 } |
| 208 | 218 |
| 209 delta_x_ = 0.f; | 219 delta_x_ = 0.f; |
| 210 } | 220 } |
| 211 | 221 |
| 212 void WindowSlider::CancelScroll() { | 222 void WindowSlider::CancelScroll() { |
| 213 ResetScroll(); | 223 ResetScroll(); |
| 214 } | 224 } |
| 215 | 225 |
| 216 void WindowSlider::CompleteWindowSlideAfterAnimation() { | 226 void WindowSlider::CompleteWindowSlideAfterAnimation() { |
| 227 // The delegate may delete the |owner_| from the |OnWindowSlideComplete()| |
| 228 // callback, which would trigger the |
| 229 // |WindowSlider::OnWindowRemovingFromRootWindow()| callback, which would try |
| 230 // to delete itself again. So avoid that by resetting |owner_| before calling |
| 231 // the |OnWindowSlideComplete()| callback on the delegate. |
| 232 owner_->RemoveObserver(this); |
| 233 owner_ = NULL; |
| 234 |
| 217 delegate_->OnWindowSlideComplete(); | 235 delegate_->OnWindowSlideComplete(); |
| 218 delete this; | 236 delete this; |
| 219 } | 237 } |
| 220 | 238 |
| 221 void WindowSlider::AbortWindowSlideAfterAnimation() { | 239 void WindowSlider::AbortWindowSlideAfterAnimation() { |
| 222 delegate_->OnWindowSlideAborted(); | 240 delegate_->OnWindowSlideAborted(); |
| 223 } | 241 } |
| 224 | 242 |
| 225 void WindowSlider::OnKeyEvent(ui::KeyEvent* event) { | 243 void WindowSlider::OnKeyEvent(ui::KeyEvent* event) { |
| 226 CancelScroll(); | 244 CancelScroll(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 window->RemoveObserver(this); | 300 window->RemoveObserver(this); |
| 283 owner_ = NULL; | 301 owner_ = NULL; |
| 284 if (!slider_.get()) | 302 if (!slider_.get()) |
| 285 delete this; | 303 delete this; |
| 286 } else { | 304 } else { |
| 287 NOTREACHED(); | 305 NOTREACHED(); |
| 288 } | 306 } |
| 289 } | 307 } |
| 290 | 308 |
| 291 } // namespace content | 309 } // namespace content |
| OLD | NEW |