| 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 "ash/common/wm/dock/docked_window_layout_manager.h" | 5 #include "ash/common/wm/dock/docked_window_layout_manager.h" |
| 6 | 6 |
| 7 #include "ash/common/material_design/material_design_controller.h" | 7 #include "ash/common/material_design/material_design_controller.h" |
| 8 #include "ash/common/shelf/shelf_background_animator.h" | |
| 9 #include "ash/common/shelf/shelf_background_animator_observer.h" | |
| 10 #include "ash/common/shelf/shelf_constants.h" | 8 #include "ash/common/shelf/shelf_constants.h" |
| 11 #include "ash/common/shelf/wm_shelf.h" | 9 #include "ash/common/shelf/wm_shelf.h" |
| 12 #include "ash/common/shelf/wm_shelf_observer.h" | 10 #include "ash/common/shelf/wm_shelf_observer.h" |
| 13 #include "ash/common/shell_window_ids.h" | 11 #include "ash/common/shell_window_ids.h" |
| 14 #include "ash/common/wm/overview/window_selector_controller.h" | 12 #include "ash/common/wm/overview/window_selector_controller.h" |
| 15 #include "ash/common/wm/window_animation_types.h" | 13 #include "ash/common/wm/window_animation_types.h" |
| 16 #include "ash/common/wm/window_parenting_utils.h" | 14 #include "ash/common/wm/window_parenting_utils.h" |
| 17 #include "ash/common/wm/window_resizer.h" | 15 #include "ash/common/wm/window_resizer.h" |
| 18 #include "ash/common/wm/window_state.h" | 16 #include "ash/common/wm/window_state.h" |
| 19 #include "ash/common/wm_lookup.h" | 17 #include "ash/common/wm_lookup.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 43 // static | 41 // static |
| 44 const int DockedWindowLayoutManager::kMinDockGap = 2; | 42 const int DockedWindowLayoutManager::kMinDockGap = 2; |
| 45 // static | 43 // static |
| 46 const int DockedWindowLayoutManager::kIdealWidth = 250; | 44 const int DockedWindowLayoutManager::kIdealWidth = 250; |
| 47 const int kMinimumHeight = 250; | 45 const int kMinimumHeight = 250; |
| 48 const int kSlideDurationMs = 120; | 46 const int kSlideDurationMs = 120; |
| 49 const int kFadeDurationMs = 60; | 47 const int kFadeDurationMs = 60; |
| 50 const int kMinimizeDurationMs = 720; | 48 const int kMinimizeDurationMs = 720; |
| 51 | 49 |
| 52 class DockedBackgroundWidget : public views::Widget, | 50 class DockedBackgroundWidget : public views::Widget, |
| 53 public WmShelfObserver, | 51 public BackgroundAnimatorDelegate, |
| 54 public ShelfBackgroundAnimatorObserver { | 52 public WmShelfObserver { |
| 55 public: | 53 public: |
| 56 explicit DockedBackgroundWidget(DockedWindowLayoutManager* manager) | 54 explicit DockedBackgroundWidget(DockedWindowLayoutManager* manager) |
| 57 : manager_(manager), | 55 : manager_(manager), |
| 58 alignment_(DOCKED_ALIGNMENT_NONE), | 56 alignment_(DOCKED_ALIGNMENT_NONE), |
| 59 background_animator_(SHELF_BACKGROUND_DEFAULT, nullptr), | 57 background_animator_(this, 0, GetShelfConstant(SHELF_BACKGROUND_ALPHA)), |
| 60 asset_background_alpha_(0), | 58 alpha_(0), |
| 61 opaque_background_(ui::LAYER_SOLID_COLOR), | 59 opaque_background_(ui::LAYER_SOLID_COLOR), |
| 62 visible_background_type_(manager_->shelf()->GetBackgroundType()), | 60 visible_background_type_(manager_->shelf()->GetBackgroundType()), |
| 63 visible_background_change_type_(BACKGROUND_CHANGE_IMMEDIATE) { | 61 visible_background_change_type_(BACKGROUND_CHANGE_IMMEDIATE) { |
| 64 manager_->shelf()->AddObserver(this); | 62 manager_->shelf()->AddObserver(this); |
| 65 InitWidget(manager_->dock_container()); | 63 InitWidget(manager_->dock_container()); |
| 66 | |
| 67 background_animator_.AddObserver(this); | |
| 68 } | 64 } |
| 69 | 65 |
| 70 ~DockedBackgroundWidget() override { | 66 ~DockedBackgroundWidget() override { |
| 71 background_animator_.RemoveObserver(this); | |
| 72 manager_->shelf()->RemoveObserver(this); | 67 manager_->shelf()->RemoveObserver(this); |
| 73 } | 68 } |
| 74 | 69 |
| 75 // Sets widget bounds and sizes opaque background layer to fill the widget. | 70 // Sets widget bounds and sizes opaque background layer to fill the widget. |
| 76 void SetBackgroundBounds(const gfx::Rect& bounds, DockedAlignment alignment) { | 71 void SetBackgroundBounds(const gfx::Rect& bounds, DockedAlignment alignment) { |
| 77 SetBounds(bounds); | 72 SetBounds(bounds); |
| 78 opaque_background_.SetBounds(gfx::Rect(bounds.size())); | 73 opaque_background_.SetBounds(gfx::Rect(bounds.size())); |
| 79 alignment_ = alignment; | 74 alignment_ = alignment; |
| 80 } | 75 } |
| 81 | 76 |
| 82 private: | 77 private: |
| 83 // views::Widget: | 78 // views::Widget: |
| 84 void OnNativeWidgetVisibilityChanged(bool visible) override { | 79 void OnNativeWidgetVisibilityChanged(bool visible) override { |
| 85 views::Widget::OnNativeWidgetVisibilityChanged(visible); | 80 views::Widget::OnNativeWidgetVisibilityChanged(visible); |
| 86 UpdateBackground(); | 81 UpdateBackground(); |
| 87 } | 82 } |
| 88 | 83 |
| 89 void OnNativeWidgetPaint(const ui::PaintContext& context) override { | 84 void OnNativeWidgetPaint(const ui::PaintContext& context) override { |
| 90 gfx::Rect local_window_bounds(GetWindowBoundsInScreen().size()); | 85 gfx::Rect local_window_bounds(GetWindowBoundsInScreen().size()); |
| 91 ui::PaintRecorder recorder(context, local_window_bounds.size()); | 86 ui::PaintRecorder recorder(context, local_window_bounds.size()); |
| 92 | 87 |
| 93 if (!MaterialDesignController::IsShelfMaterial()) { | 88 if (MaterialDesignController::IsShelfMaterial()) { |
| 89 recorder.canvas()->FillRect(local_window_bounds, |
| 90 SkColorSetA(kShelfBaseColor, alpha_)); |
| 91 } else { |
| 94 const gfx::ImageSkia& shelf_background(alignment_ == DOCKED_ALIGNMENT_LEFT | 92 const gfx::ImageSkia& shelf_background(alignment_ == DOCKED_ALIGNMENT_LEFT |
| 95 ? shelf_background_left_ | 93 ? shelf_background_left_ |
| 96 : shelf_background_right_); | 94 : shelf_background_right_); |
| 97 SkPaint paint; | 95 SkPaint paint; |
| 98 paint.setAlpha(asset_background_alpha_); | 96 paint.setAlpha(alpha_); |
| 99 recorder.canvas()->DrawImageInt( | 97 recorder.canvas()->DrawImageInt( |
| 100 shelf_background, 0, 0, shelf_background.width(), | 98 shelf_background, 0, 0, shelf_background.width(), |
| 101 shelf_background.height(), | 99 shelf_background.height(), |
| 102 alignment_ == DOCKED_ALIGNMENT_LEFT | 100 alignment_ == DOCKED_ALIGNMENT_LEFT |
| 103 ? local_window_bounds.width() - shelf_background.width() | 101 ? local_window_bounds.width() - shelf_background.width() |
| 104 : 0, | 102 : 0, |
| 105 0, shelf_background.width(), local_window_bounds.height(), false, | 103 0, shelf_background.width(), local_window_bounds.height(), false, |
| 106 paint); | 104 paint); |
| 107 recorder.canvas()->DrawImageInt( | 105 recorder.canvas()->DrawImageInt( |
| 108 shelf_background, | 106 shelf_background, |
| 109 alignment_ == DOCKED_ALIGNMENT_LEFT ? 0 | 107 alignment_ == DOCKED_ALIGNMENT_LEFT ? 0 |
| 110 : shelf_background.width() - 1, | 108 : shelf_background.width() - 1, |
| 111 0, 1, shelf_background.height(), | 109 0, 1, shelf_background.height(), |
| 112 alignment_ == DOCKED_ALIGNMENT_LEFT ? 0 : shelf_background.width(), 0, | 110 alignment_ == DOCKED_ALIGNMENT_LEFT ? 0 : shelf_background.width(), 0, |
| 113 local_window_bounds.width() - shelf_background.width(), | 111 local_window_bounds.width() - shelf_background.width(), |
| 114 local_window_bounds.height(), false, paint); | 112 local_window_bounds.height(), false, paint); |
| 115 } | 113 } |
| 116 } | 114 } |
| 117 | 115 |
| 118 // ShelfBackgroundAnimatorObserver: | 116 // BackgroundAnimatorDelegate: |
| 119 void UpdateShelfOpaqueBackground(int alpha) override { | 117 void UpdateBackground(int alpha) override { |
| 120 const float kMaxAlpha = 255.0f; | 118 alpha_ = alpha; |
| 121 opaque_background_.SetOpacity(alpha / kMaxAlpha); | |
| 122 } | |
| 123 | |
| 124 void UpdateShelfAssetBackground(int alpha) override { | |
| 125 asset_background_alpha_ = alpha; | |
| 126 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size())); | 119 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size())); |
| 127 } | 120 } |
| 128 | 121 |
| 129 // WmShelfObserver: | 122 // ShelfLayoutManagerObserver: |
| 130 void OnBackgroundTypeChanged( | 123 void OnBackgroundUpdated(ShelfBackgroundType background_type, |
| 131 ShelfBackgroundType background_type, | 124 BackgroundAnimatorChangeType change_type) override { |
| 132 BackgroundAnimatorChangeType change_type) override { | |
| 133 // Sets the background type. Starts an animation to transition to | 125 // Sets the background type. Starts an animation to transition to |
| 134 // |background_type| if the widget is visible. If the widget is not visible, | 126 // |background_type| if the widget is visible. If the widget is not visible, |
| 135 // the animation is postponed till the widget becomes visible. | 127 // the animation is postponed till the widget becomes visible. |
| 136 visible_background_type_ = background_type; | 128 visible_background_type_ = background_type; |
| 137 visible_background_change_type_ = change_type; | 129 visible_background_change_type_ = change_type; |
| 138 if (IsVisible()) | 130 if (IsVisible()) |
| 139 UpdateBackground(); | 131 UpdateBackground(); |
| 140 } | 132 } |
| 141 | 133 |
| 142 void InitWidget(WmWindow* parent) { | 134 void InitWidget(WmWindow* parent) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 } | 168 } |
| 177 | 169 |
| 178 // Transitions to |visible_background_type_| if the widget is visible and to | 170 // Transitions to |visible_background_type_| if the widget is visible and to |
| 179 // SHELF_BACKGROUND_DEFAULT if it is not. | 171 // SHELF_BACKGROUND_DEFAULT if it is not. |
| 180 void UpdateBackground() { | 172 void UpdateBackground() { |
| 181 ShelfBackgroundType background_type = | 173 ShelfBackgroundType background_type = |
| 182 IsVisible() ? visible_background_type_ : SHELF_BACKGROUND_DEFAULT; | 174 IsVisible() ? visible_background_type_ : SHELF_BACKGROUND_DEFAULT; |
| 183 BackgroundAnimatorChangeType change_type = | 175 BackgroundAnimatorChangeType change_type = |
| 184 IsVisible() ? visible_background_change_type_ | 176 IsVisible() ? visible_background_change_type_ |
| 185 : BACKGROUND_CHANGE_IMMEDIATE; | 177 : BACKGROUND_CHANGE_IMMEDIATE; |
| 186 background_animator_.PaintBackground(background_type, change_type); | 178 |
| 179 float target_opacity = |
| 180 (background_type == SHELF_BACKGROUND_MAXIMIZED) ? 1.0f : 0.0f; |
| 181 std::unique_ptr<ui::ScopedLayerAnimationSettings> |
| 182 opaque_background_animation; |
| 183 if (change_type != BACKGROUND_CHANGE_IMMEDIATE) { |
| 184 opaque_background_animation.reset(new ui::ScopedLayerAnimationSettings( |
| 185 opaque_background_.GetAnimator())); |
| 186 opaque_background_animation->SetTransitionDuration( |
| 187 base::TimeDelta::FromMilliseconds(kTimeToSwitchBackgroundMs)); |
| 188 } |
| 189 opaque_background_.SetOpacity(target_opacity); |
| 190 |
| 191 // TODO(varkha): use ui::Layer on both opaque_background and normal |
| 192 // background retire background_animator_ at all. It would be simpler. |
| 193 // See also ShelfWidget::SetPaintsBackground. |
| 194 background_animator_.SetPaintsBackground( |
| 195 background_type != SHELF_BACKGROUND_DEFAULT, change_type); |
| 187 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size())); | 196 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size())); |
| 188 } | 197 } |
| 189 | 198 |
| 190 DockedWindowLayoutManager* manager_; | 199 DockedWindowLayoutManager* manager_; |
| 191 | 200 |
| 192 DockedAlignment alignment_; | 201 DockedAlignment alignment_; |
| 193 | 202 |
| 194 // The animator for the background transitions. | 203 // The animator for the background transitions. |
| 195 ShelfBackgroundAnimator background_animator_; | 204 BackgroundAnimator background_animator_; |
| 196 | 205 |
| 197 // The alpha to use for drawing image assets covering the docked background. | 206 // The alpha to use for drawing image assets covering the docked background. |
| 198 int asset_background_alpha_; | 207 int alpha_; |
| 199 | 208 |
| 200 // TODO(bruthig): Remove opaque_background_ (see https://crbug.com/621551). | |
| 201 // Solid black background that can be made fully opaque. | 209 // Solid black background that can be made fully opaque. |
| 202 ui::Layer opaque_background_; | 210 ui::Layer opaque_background_; |
| 203 | 211 |
| 204 // Backgrounds created from shelf background by 90 or 270 degree rotation. | 212 // Backgrounds created from shelf background by 90 or 270 degree rotation. |
| 205 // TODO(tdanderson): These members can be removed once the material design | 213 // TODO(tdanderson): These members can be removed once the material design |
| 206 // shelf is enabled by default. See crbug.com/614453. | 214 // shelf is enabled by default. See crbug.com/614453. |
| 207 gfx::ImageSkia shelf_background_left_; | 215 gfx::ImageSkia shelf_background_left_; |
| 208 gfx::ImageSkia shelf_background_right_; | 216 gfx::ImageSkia shelf_background_right_; |
| 209 | 217 |
| 210 // The background type to use when the widget is visible. When not visible, | 218 // The background type to use when the widget is visible. When not visible, |
| (...skipping 1153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1364 | 1372 |
| 1365 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( | 1373 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( |
| 1366 const gfx::Rect& keyboard_bounds) { | 1374 const gfx::Rect& keyboard_bounds) { |
| 1367 // This bounds change will have caused a change to the Shelf which does not | 1375 // This bounds change will have caused a change to the Shelf which does not |
| 1368 // propagate automatically to this class, so manually recalculate bounds. | 1376 // propagate automatically to this class, so manually recalculate bounds. |
| 1369 Relayout(); | 1377 Relayout(); |
| 1370 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); | 1378 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); |
| 1371 } | 1379 } |
| 1372 | 1380 |
| 1373 } // namespace ash | 1381 } // namespace ash |
| OLD | NEW |