Chromium Code Reviews| Index: ash/wm/overview/window_selector_item.cc |
| diff --git a/ash/wm/overview/window_selector_item.cc b/ash/wm/overview/window_selector_item.cc |
| index 0ec1a02858752cb7a358b6ae436ae0cf3de6a6fa..2440605d6762de9107d53ef5a3d37d9e467813f6 100644 |
| --- a/ash/wm/overview/window_selector_item.cc |
| +++ b/ash/wm/overview/window_selector_item.cc |
| @@ -35,6 +35,19 @@ namespace ash { |
| namespace { |
| +// The minimum opacity used during touch scroll gestures. |
| +const float kMinimumOpacity = 0.2f; |
|
flackr
2014/11/07 19:10:52
0.f seems like a decent close opacity. If you drag
bruthig
2015/01/02 16:49:17
I consulted with stevet@ with the 0.2f value. If w
|
| + |
| +// The distance at which the minimum opacity should take effect. |
| +const float kMinimumOpacityDistance = 200.0f; |
|
flackr
2014/11/07 19:10:52
Shouldn't this be the same as the close distance?
bruthig
2015/01/02 16:49:17
I agree, this should be in sync with the actual cl
|
| + |
| +// Calculates the window opacity from the given scroll |distance|. |
| +float CalculateOpacityFromScrollDistance(int distance) { |
| + float opacity = |
| + 1.0 - static_cast<float>(abs(distance)) / kMinimumOpacityDistance; |
| + return std::min(1.0f, std::max(kMinimumOpacity, opacity)); |
| +} |
| + |
| gfx::Rect GetTransformedBounds(aura::Window* window) { |
| gfx::RectF bounds(ScreenUtil::ConvertRectToScreen(window->GetRootWindow(), |
| window->layer()->bounds())); |
| @@ -147,6 +160,38 @@ WindowSelectorItem::WindowListItem::WindowListItem(aura::Window* window) |
| WindowSelectorItem::WindowListItem::~WindowListItem() { |
| } |
| +void WindowSelectorItem::WindowListItem::Scroll(int delta_x) { |
| + const float opacity = CalculateOpacityFromScrollDistance(delta_x); |
| + ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
| + transform_window_->BeginScopedAnimation( |
| + OverviewAnimationSettingsProvider::AnimationType::SELECTOR_ITEM_SCROLL, |
| + &animation_settings); |
| + |
| + gfx::Transform new_transform; |
| + new_transform.Translate(delta_x, 0); |
| + new_transform.PreconcatTransform(transform_window_->get_overview_transform()); |
| + transform_window_->SetTransform(transform_window_->window()->GetRootWindow(), |
| + new_transform); |
| + |
| + transform_window_->SetOpacity(opacity); |
| +} |
| + |
| +void WindowSelectorItem::WindowListItem::CancelScroll() { |
| + aura::Window* window = transform_window_->window(); |
| + ScopedTransformOverviewWindow::ScopedAnimationSettings animation_settings; |
| + transform_window_->BeginScopedAnimation( |
| + OverviewAnimationSettingsProvider::AnimationType:: |
| + SELECTOR_ITEM_SCROLL_CANCEL, |
| + &animation_settings); |
| + // The target opacity is set before the transform so that the |
| + // WindowSelectorItem::OnWindowTransformed handler can properly |
| + // update the opacity of the close button to the window's target |
| + // opacity. |
| + transform_window_->SetOpacity(1.0); |
| + transform_window_->SetTransform(window->GetRootWindow(), |
| + transform_window_->get_overview_transform()); |
| +} |
| + |
| void WindowSelectorItem::WindowListItem::Select() { |
| aura::Window* window = transform_window_->window(); |
| wm::GetWindowState(window)->Activate(); |
| @@ -332,6 +377,7 @@ void WindowSelectorItem::SetBounds(aura::Window* root_window, |
| // SetItemBounds is called before UpdateCloseButtonLayout so the close button |
| // can properly use the updated windows bounds. |
| UpdateCloseButtonLayout(animate); |
| + SetCloseWindowDistanceMinimum(target_bounds_.size().width() / 2); |
| UpdateSelectorButtons(); |
| } |
| @@ -400,12 +446,36 @@ void WindowSelectorItem::OnWindowTransformed(aura::Window* window) { |
| } |
| } |
| +void WindowSelectorItem::Scroll(int delta_x) { |
| + for (WindowList::iterator iter = window_list_.begin(); |
| + iter != window_list_.end(); |
| + iter++) { |
| + (*iter)->Scroll(delta_x); |
| + } |
| +} |
| + |
| +void WindowSelectorItem::CancelScroll() { |
| + for (WindowList::iterator iter = window_list_.begin(); |
| + iter != window_list_.end(); |
| + iter++) { |
| + (*iter)->CancelScroll(); |
| + } |
| +} |
| + |
| void WindowSelectorItem::Select() { |
| aura::Window* selection_window = SelectionWindow(); |
| if (selection_window) |
| wm::GetWindowState(selection_window)->Activate(); |
| } |
| +void WindowSelectorItem::Close() { |
| + for (WindowList::iterator iter = window_list_.begin(); |
| + iter != window_list_.end(); |
| + iter++) { |
| + (*iter)->Close(); |
| + } |
| +} |
| + |
| void WindowSelectorItem::SetItemBounds(aura::Window* root_window, |
| const gfx::Rect& target_bounds, |
| bool animate) { |
| @@ -556,6 +626,16 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { |
| window_label_->Show(); |
| } |
| +void WindowSelectorItem::SetCloseWindowDistanceMinimum(int distance) { |
| + selector_item_activate_window_button_->SetCloseWindowDistanceMinimum( |
| + distance); |
| + for (WindowList::iterator iter = window_list_.begin(); |
| + iter != window_list_.end(); |
| + ++iter) { |
| + (*iter)->activate_button()->SetCloseWindowDistanceMinimum(distance); |
| + } |
| +} |
| + |
| void WindowSelectorItem::UpdateSelectorButtons() { |
| selector_item_activate_window_button_->SetBounds(target_bounds()); |