| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "ash/shelf/shelf_widget.h" | 5 #include "ash/shelf/shelf_widget.h" |
| 6 | 6 |
| 7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
| 8 #include "ash/focus_cycler.h" | 8 #include "ash/focus_cycler.h" |
| 9 #include "ash/root_window_controller.h" | 9 #include "ash/root_window_controller.h" |
| 10 #include "ash/session/session_state_delegate.h" | 10 #include "ash/session/session_state_delegate.h" |
| 11 #include "ash/shelf/shelf_constants.h" | 11 #include "ash/shelf/shelf_constants.h" |
| 12 #include "ash/shelf/shelf_delegate.h" | 12 #include "ash/shelf/shelf_delegate.h" |
| 13 #include "ash/shelf/shelf_layout_manager.h" | 13 #include "ash/shelf/shelf_layout_manager.h" |
| 14 #include "ash/shelf/shelf_model.h" | 14 #include "ash/shelf/shelf_model.h" |
| 15 #include "ash/shelf/shelf_navigator.h" | 15 #include "ash/shelf/shelf_navigator.h" |
| 16 #include "ash/shelf/shelf_util.h" |
| 16 #include "ash/shelf/shelf_view.h" | 17 #include "ash/shelf/shelf_view.h" |
| 17 #include "ash/shelf/shelf_widget.h" | 18 #include "ash/shelf/shelf_widget.h" |
| 18 #include "ash/shell.h" | 19 #include "ash/shell.h" |
| 19 #include "ash/shell_window_ids.h" | 20 #include "ash/shell_window_ids.h" |
| 20 #include "ash/system/tray/system_tray_delegate.h" | 21 #include "ash/system/tray/system_tray_delegate.h" |
| 21 #include "ash/wm/status_area_layout_manager.h" | 22 #include "ash/wm/status_area_layout_manager.h" |
| 22 #include "ash/wm/window_properties.h" | 23 #include "ash/wm/window_properties.h" |
| 23 #include "ash/wm/workspace_controller.h" | 24 #include "ash/wm/workspace_controller.h" |
| 24 #include "grit/ash_resources.h" | 25 #include "grit/ash_resources.h" |
| 25 #include "ui/aura/window.h" | 26 #include "ui/aura/window.h" |
| 26 #include "ui/aura/window_event_dispatcher.h" | 27 #include "ui/aura/window_event_dispatcher.h" |
| 27 #include "ui/aura/window_observer.h" | 28 #include "ui/aura/window_observer.h" |
| 28 #include "ui/base/resource/resource_bundle.h" | 29 #include "ui/base/resource/resource_bundle.h" |
| 29 #include "ui/compositor/layer.h" | 30 #include "ui/compositor/layer.h" |
| 30 #include "ui/compositor/scoped_layer_animation_settings.h" | 31 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 31 #include "ui/events/event_constants.h" | 32 #include "ui/events/event_constants.h" |
| 32 #include "ui/gfx/canvas.h" | 33 #include "ui/gfx/canvas.h" |
| 33 #include "ui/gfx/image/image.h" | 34 #include "ui/gfx/image/image.h" |
| 34 #include "ui/gfx/image/image_skia_operations.h" | 35 #include "ui/gfx/image/image_skia_operations.h" |
| 35 #include "ui/gfx/skbitmap_operations.h" | 36 #include "ui/gfx/skbitmap_operations.h" |
| 36 #include "ui/views/accessible_pane_view.h" | 37 #include "ui/views/accessible_pane_view.h" |
| 37 #include "ui/views/layout/fill_layout.h" | 38 #include "ui/views/layout/fill_layout.h" |
| 38 #include "ui/views/widget/widget.h" | 39 #include "ui/views/widget/widget.h" |
| 39 #include "ui/views/widget/widget_delegate.h" | 40 #include "ui/views/widget/widget_delegate.h" |
| 40 #include "ui/wm/core/coordinate_conversion.h" | 41 #include "ui/wm/core/coordinate_conversion.h" |
| 41 #include "ui/wm/core/easy_resize_window_targeter.h" | 42 #include "ui/wm/core/easy_resize_window_targeter.h" |
| 42 #include "ui/wm/public/activation_client.h" | 43 #include "ui/wm/public/activation_client.h" |
| 43 | 44 |
| 45 namespace ash { |
| 46 |
| 44 namespace { | 47 namespace { |
| 45 // Size of black border at bottom (or side) of shelf. | 48 // Size of black border at bottom (or side) of shelf. |
| 46 const int kNumBlackPixels = 3; | 49 const int kNumBlackPixels = 3; |
| 47 // Alpha to paint dimming image with. | 50 // Alpha to paint dimming image with. |
| 48 const int kDimAlpha = 128; | 51 const int kDimAlpha = 128; |
| 49 | 52 |
| 50 // The time to dim and un-dim. | 53 // The time to dim and un-dim. |
| 51 const int kTimeToDimMs = 3000; // Slow in dimming. | 54 const int kTimeToDimMs = 3000; // Slow in dimming. |
| 52 const int kTimeToUnDimMs = 200; // Fast in activating. | 55 const int kTimeToUnDimMs = 200; // Fast in activating. |
| 53 | 56 |
| 54 // Class used to slightly dim shelf items when maximized and visible. | 57 // Class used to slightly dim shelf items when maximized and visible. |
| 55 class DimmerView : public views::View, | 58 class DimmerView : public views::View, |
| 56 public views::WidgetDelegate, | 59 public views::WidgetDelegate, |
| 57 ash::BackgroundAnimatorDelegate { | 60 BackgroundAnimatorDelegate { |
| 58 public: | 61 public: |
| 59 // If |disable_dimming_animations_for_test| is set, all alpha animations will | 62 // If |disable_dimming_animations_for_test| is set, all alpha animations will |
| 60 // be performed instantly. | 63 // be performed instantly. |
| 61 DimmerView(ash::ShelfWidget* shelf_widget, | 64 DimmerView(ShelfWidget* shelf_widget, |
| 62 bool disable_dimming_animations_for_test); | 65 bool disable_dimming_animations_for_test); |
| 63 ~DimmerView() override; | 66 ~DimmerView() override; |
| 64 | 67 |
| 65 // Called by |DimmerEventFilter| when the mouse |hovered| state changes. | 68 // Called by |DimmerEventFilter| when the mouse |hovered| state changes. |
| 66 void SetHovered(bool hovered); | 69 void SetHovered(bool hovered); |
| 67 | 70 |
| 68 // Force the dimmer to be undimmed. | 71 // Force the dimmer to be undimmed. |
| 69 void ForceUndimming(bool force); | 72 void ForceUndimming(bool force); |
| 70 | 73 |
| 71 // views::WidgetDelegate overrides: | 74 // views::WidgetDelegate overrides: |
| 72 views::Widget* GetWidget() override { return View::GetWidget(); } | 75 views::Widget* GetWidget() override { return View::GetWidget(); } |
| 73 const views::Widget* GetWidget() const override { return View::GetWidget(); } | 76 const views::Widget* GetWidget() const override { return View::GetWidget(); } |
| 74 | 77 |
| 75 // ash::BackgroundAnimatorDelegate overrides: | 78 // BackgroundAnimatorDelegate overrides: |
| 76 void UpdateBackground(int alpha) override { | 79 void UpdateBackground(int alpha) override { |
| 77 alpha_ = alpha; | 80 alpha_ = alpha; |
| 78 SchedulePaint(); | 81 SchedulePaint(); |
| 79 } | 82 } |
| 80 | 83 |
| 81 // views::View overrides: | 84 // views::View overrides: |
| 82 void OnPaintBackground(gfx::Canvas* canvas) override; | 85 void OnPaintBackground(gfx::Canvas* canvas) override; |
| 83 | 86 |
| 84 // A function to test the current alpha used. | 87 // A function to test the current alpha used. |
| 85 int get_dimming_alpha_for_test() { return alpha_; } | 88 int get_dimming_alpha_for_test() { return alpha_; } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 101 | 104 |
| 102 // TRUE if the mouse is inside the shelf. | 105 // TRUE if the mouse is inside the shelf. |
| 103 bool mouse_inside_; | 106 bool mouse_inside_; |
| 104 | 107 |
| 105 // TRUE if a touch event is inside the shelf. | 108 // TRUE if a touch event is inside the shelf. |
| 106 bool touch_inside_; | 109 bool touch_inside_; |
| 107 | 110 |
| 108 DISALLOW_COPY_AND_ASSIGN(DimmerEventFilter); | 111 DISALLOW_COPY_AND_ASSIGN(DimmerEventFilter); |
| 109 }; | 112 }; |
| 110 | 113 |
| 111 // The owning shelf. | 114 // The owning shelf widget. |
| 112 ash::ShelfWidget* shelf_; | 115 ShelfWidget* shelf_; |
| 113 | 116 |
| 114 // The alpha to use for covering the shelf. | 117 // The alpha to use for covering the shelf. |
| 115 int alpha_; | 118 int alpha_; |
| 116 | 119 |
| 117 // True if the event filter claims that we should not be dimmed. | 120 // True if the event filter claims that we should not be dimmed. |
| 118 bool is_hovered_; | 121 bool is_hovered_; |
| 119 | 122 |
| 120 // True if someone forces us not to be dimmed (e.g. a menu is open). | 123 // True if someone forces us not to be dimmed (e.g. a menu is open). |
| 121 bool force_hovered_; | 124 bool force_hovered_; |
| 122 | 125 |
| 123 // True if animations should be suppressed for a test. | 126 // True if animations should be suppressed for a test. |
| 124 bool disable_dimming_animations_for_test_; | 127 bool disable_dimming_animations_for_test_; |
| 125 | 128 |
| 126 // The animator for the background transitions. | 129 // The animator for the background transitions. |
| 127 ash::BackgroundAnimator background_animator_; | 130 BackgroundAnimator background_animator_; |
| 128 | 131 |
| 129 // Notification of entering / exiting of the shelf area by mouse. | 132 // Notification of entering / exiting of the shelf area by mouse. |
| 130 std::unique_ptr<DimmerEventFilter> event_filter_; | 133 std::unique_ptr<DimmerEventFilter> event_filter_; |
| 131 | 134 |
| 132 DISALLOW_COPY_AND_ASSIGN(DimmerView); | 135 DISALLOW_COPY_AND_ASSIGN(DimmerView); |
| 133 }; | 136 }; |
| 134 | 137 |
| 135 DimmerView::DimmerView(ash::ShelfWidget* shelf_widget, | 138 DimmerView::DimmerView(ShelfWidget* shelf_widget, |
| 136 bool disable_dimming_animations_for_test) | 139 bool disable_dimming_animations_for_test) |
| 137 : shelf_(shelf_widget), | 140 : shelf_(shelf_widget), |
| 138 alpha_(kDimAlpha), | 141 alpha_(kDimAlpha), |
| 139 is_hovered_(false), | 142 is_hovered_(false), |
| 140 force_hovered_(false), | 143 force_hovered_(false), |
| 141 disable_dimming_animations_for_test_(disable_dimming_animations_for_test), | 144 disable_dimming_animations_for_test_(disable_dimming_animations_for_test), |
| 142 background_animator_(this, 0, kDimAlpha) { | 145 background_animator_(this, 0, kDimAlpha) { |
| 143 event_filter_.reset(new DimmerEventFilter(this)); | 146 event_filter_.reset(new DimmerEventFilter(this)); |
| 144 // Make sure it is undimmed at the beginning and then fire off the dimming | 147 // Make sure it is undimmed at the beginning and then fire off the dimming |
| 145 // animation. | 148 // animation. |
| 146 background_animator_.SetPaintsBackground(false, | 149 background_animator_.SetPaintsBackground(false, BACKGROUND_CHANGE_IMMEDIATE); |
| 147 ash::BACKGROUND_CHANGE_IMMEDIATE); | |
| 148 SetHovered(false); | 150 SetHovered(false); |
| 149 } | 151 } |
| 150 | 152 |
| 151 DimmerView::~DimmerView() { | 153 DimmerView::~DimmerView() { |
| 152 } | 154 } |
| 153 | 155 |
| 154 void DimmerView::SetHovered(bool hovered) { | 156 void DimmerView::SetHovered(bool hovered) { |
| 155 // Remember the hovered state so that we can correct the state once a | 157 // Remember the hovered state so that we can correct the state once a |
| 156 // possible force state has disappeared. | 158 // possible force state has disappeared. |
| 157 is_hovered_ = hovered; | 159 is_hovered_ = hovered; |
| 158 // Undimm also if we were forced to by e.g. an open menu. | 160 // Undimm also if we were forced to by e.g. an open menu. |
| 159 hovered |= force_hovered_; | 161 hovered |= force_hovered_; |
| 160 background_animator_.SetDuration(hovered ? kTimeToUnDimMs : kTimeToDimMs); | 162 background_animator_.SetDuration(hovered ? kTimeToUnDimMs : kTimeToDimMs); |
| 161 background_animator_.SetPaintsBackground(!hovered, | 163 background_animator_.SetPaintsBackground(!hovered, |
| 162 disable_dimming_animations_for_test_ ? | 164 disable_dimming_animations_for_test_ |
| 163 ash::BACKGROUND_CHANGE_IMMEDIATE : ash::BACKGROUND_CHANGE_ANIMATE); | 165 ? BACKGROUND_CHANGE_IMMEDIATE |
| 166 : BACKGROUND_CHANGE_ANIMATE); |
| 164 } | 167 } |
| 165 | 168 |
| 166 void DimmerView::ForceUndimming(bool force) { | 169 void DimmerView::ForceUndimming(bool force) { |
| 167 bool previous = force_hovered_; | 170 bool previous = force_hovered_; |
| 168 force_hovered_ = force; | 171 force_hovered_ = force; |
| 169 // If the forced change does change the result we apply the change. | 172 // If the forced change does change the result we apply the change. |
| 170 if (is_hovered_ || force_hovered_ != is_hovered_ || previous) | 173 if (is_hovered_ || force_hovered_ != is_hovered_ || previous) |
| 171 SetHovered(is_hovered_); | 174 SetHovered(is_hovered_); |
| 172 } | 175 } |
| 173 | 176 |
| 174 void DimmerView::OnPaintBackground(gfx::Canvas* canvas) { | 177 void DimmerView::OnPaintBackground(gfx::Canvas* canvas) { |
| 175 SkPaint paint; | 178 SkPaint paint; |
| 176 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); | 179 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
| 177 gfx::ImageSkia shelf_background = | 180 gfx::ImageSkia shelf_background = |
| 178 *rb->GetImageNamed(IDR_ASH_SHELF_DIMMING).ToImageSkia(); | 181 *rb->GetImageNamed(IDR_ASH_SHELF_DIMMING).ToImageSkia(); |
| 179 | 182 |
| 180 if (shelf_->GetAlignment() != ash::SHELF_ALIGNMENT_BOTTOM) { | 183 if (!IsHorizontalAlignment(shelf_->GetAlignment())) { |
| 181 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( | 184 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( |
| 182 shelf_background, | 185 shelf_background, shelf_->GetAlignment() == SHELF_ALIGNMENT_LEFT |
| 183 shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( | 186 ? SkBitmapOperations::ROTATION_90_CW |
| 184 SkBitmapOperations::ROTATION_90_CW, | 187 : SkBitmapOperations::ROTATION_270_CW); |
| 185 SkBitmapOperations::ROTATION_90_CW, | |
| 186 SkBitmapOperations::ROTATION_270_CW)); | |
| 187 } | 188 } |
| 188 paint.setAlpha(alpha_); | 189 paint.setAlpha(alpha_); |
| 189 canvas->DrawImageInt(shelf_background, | 190 canvas->DrawImageInt(shelf_background, 0, 0, shelf_background.width(), |
| 190 0, | 191 shelf_background.height(), 0, 0, width(), height(), |
| 191 0, | 192 false, paint); |
| 192 shelf_background.width(), | |
| 193 shelf_background.height(), | |
| 194 0, | |
| 195 0, | |
| 196 width(), | |
| 197 height(), | |
| 198 false, | |
| 199 paint); | |
| 200 } | 193 } |
| 201 | 194 |
| 202 DimmerView::DimmerEventFilter::DimmerEventFilter(DimmerView* owner) | 195 DimmerView::DimmerEventFilter::DimmerEventFilter(DimmerView* owner) |
| 203 : owner_(owner), | 196 : owner_(owner), |
| 204 mouse_inside_(false), | 197 mouse_inside_(false), |
| 205 touch_inside_(false) { | 198 touch_inside_(false) { |
| 206 ash::Shell::GetInstance()->AddPreTargetHandler(this); | 199 Shell::GetInstance()->AddPreTargetHandler(this); |
| 207 } | 200 } |
| 208 | 201 |
| 209 DimmerView::DimmerEventFilter::~DimmerEventFilter() { | 202 DimmerView::DimmerEventFilter::~DimmerEventFilter() { |
| 210 ash::Shell::GetInstance()->RemovePreTargetHandler(this); | 203 Shell::GetInstance()->RemovePreTargetHandler(this); |
| 211 } | 204 } |
| 212 | 205 |
| 213 void DimmerView::DimmerEventFilter::OnMouseEvent(ui::MouseEvent* event) { | 206 void DimmerView::DimmerEventFilter::OnMouseEvent(ui::MouseEvent* event) { |
| 214 if (event->type() != ui::ET_MOUSE_MOVED && | 207 if (event->type() != ui::ET_MOUSE_MOVED && |
| 215 event->type() != ui::ET_MOUSE_DRAGGED) | 208 event->type() != ui::ET_MOUSE_DRAGGED) |
| 216 return; | 209 return; |
| 217 | 210 |
| 218 gfx::Point screen_point(event->location()); | 211 gfx::Point screen_point(event->location()); |
| 219 ::wm::ConvertPointToScreen(static_cast<aura::Window*>(event->target()), | 212 ::wm::ConvertPointToScreen(static_cast<aura::Window*>(event->target()), |
| 220 &screen_point); | 213 &screen_point); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 232 ::wm::ConvertPointToScreen(static_cast<aura::Window*>(event->target()), | 225 ::wm::ConvertPointToScreen(static_cast<aura::Window*>(event->target()), |
| 233 &screen_point); | 226 &screen_point); |
| 234 touch_inside = owner_->GetBoundsInScreen().Contains(screen_point); | 227 touch_inside = owner_->GetBoundsInScreen().Contains(screen_point); |
| 235 } | 228 } |
| 236 | 229 |
| 237 if (mouse_inside_ || touch_inside_ != mouse_inside_ || touch_inside) | 230 if (mouse_inside_ || touch_inside_ != mouse_inside_ || touch_inside) |
| 238 owner_->SetHovered(mouse_inside_ || touch_inside); | 231 owner_->SetHovered(mouse_inside_ || touch_inside); |
| 239 touch_inside_ = touch_inside; | 232 touch_inside_ = touch_inside; |
| 240 } | 233 } |
| 241 | 234 |
| 242 using ash::ShelfLayoutManager; | |
| 243 | |
| 244 // ShelfWindowTargeter makes it easier to resize windows with the mouse when the | 235 // ShelfWindowTargeter makes it easier to resize windows with the mouse when the |
| 245 // window-edge slightly overlaps with the shelf edge. The targeter also makes it | 236 // window-edge slightly overlaps with the shelf edge. The targeter also makes it |
| 246 // easier to drag the shelf out with touch while it is hidden. | 237 // easier to drag the shelf out with touch while it is hidden. |
| 247 class ShelfWindowTargeter : public wm::EasyResizeWindowTargeter, | 238 class ShelfWindowTargeter : public ::wm::EasyResizeWindowTargeter, |
| 248 public ash::ShelfLayoutManagerObserver { | 239 public ShelfLayoutManagerObserver { |
| 249 public: | 240 public: |
| 250 ShelfWindowTargeter(aura::Window* container, | 241 ShelfWindowTargeter(aura::Window* container, ShelfLayoutManager* shelf) |
| 251 ShelfLayoutManager* shelf) | 242 : ::wm::EasyResizeWindowTargeter(container, gfx::Insets(), gfx::Insets()), |
| 252 : wm::EasyResizeWindowTargeter(container, gfx::Insets(), gfx::Insets()), | |
| 253 shelf_(shelf) { | 243 shelf_(shelf) { |
| 254 WillChangeVisibilityState(shelf_->visibility_state()); | 244 WillChangeVisibilityState(shelf_->visibility_state()); |
| 255 shelf_->AddObserver(this); | 245 shelf_->AddObserver(this); |
| 256 } | 246 } |
| 257 | 247 |
| 258 ~ShelfWindowTargeter() override { | 248 ~ShelfWindowTargeter() override { |
| 259 // |shelf_| may have been destroyed by this time. | 249 // |shelf_| may have been destroyed by this time. |
| 260 if (shelf_) | 250 if (shelf_) |
| 261 shelf_->RemoveObserver(this); | 251 shelf_->RemoveObserver(this); |
| 262 } | 252 } |
| 263 | 253 |
| 264 private: | 254 private: |
| 265 gfx::Insets GetInsetsForAlignment(int distance, | 255 gfx::Insets GetInsetsForAlignment(int distance, ShelfAlignment alignment) { |
| 266 ash::ShelfAlignment alignment) { | 256 if (alignment == SHELF_ALIGNMENT_LEFT) |
| 267 switch (alignment) { | 257 return gfx::Insets(0, 0, 0, distance); |
| 268 case ash::SHELF_ALIGNMENT_BOTTOM: | 258 if (alignment == SHELF_ALIGNMENT_RIGHT) |
| 269 return gfx::Insets(distance, 0, 0, 0); | 259 return gfx::Insets(0, distance, 0, 0); |
| 270 case ash::SHELF_ALIGNMENT_LEFT: | 260 return gfx::Insets(distance, 0, 0, 0); |
| 271 return gfx::Insets(0, 0, 0, distance); | |
| 272 case ash::SHELF_ALIGNMENT_RIGHT: | |
| 273 return gfx::Insets(0, distance, 0, 0); | |
| 274 } | |
| 275 NOTREACHED(); | |
| 276 return gfx::Insets(); | |
| 277 } | 261 } |
| 278 | 262 |
| 279 // ash::ShelfLayoutManagerObserver: | 263 // ShelfLayoutManagerObserver: |
| 280 void WillDeleteShelf() override { | 264 void WillDeleteShelf() override { |
| 281 shelf_->RemoveObserver(this); | 265 shelf_->RemoveObserver(this); |
| 282 shelf_ = NULL; | 266 shelf_ = NULL; |
| 283 } | 267 } |
| 284 | 268 |
| 285 void WillChangeVisibilityState(ash::ShelfVisibilityState new_state) override { | 269 void WillChangeVisibilityState(ShelfVisibilityState new_state) override { |
| 286 gfx::Insets mouse_insets; | 270 gfx::Insets mouse_insets; |
| 287 gfx::Insets touch_insets; | 271 gfx::Insets touch_insets; |
| 288 if (new_state == ash::SHELF_VISIBLE) { | 272 if (new_state == SHELF_VISIBLE) { |
| 289 // Let clicks at the very top of the shelf through so windows can be | 273 // Let clicks at the very top of the shelf through so windows can be |
| 290 // resized with the bottom-right corner and bottom edge. | 274 // resized with the bottom-right corner and bottom edge. |
| 291 mouse_insets = GetInsetsForAlignment( | 275 mouse_insets = GetInsetsForAlignment( |
| 292 ShelfLayoutManager::kWorkspaceAreaVisibleInset, | 276 ShelfLayoutManager::kWorkspaceAreaVisibleInset, |
| 293 shelf_->GetAlignment()); | 277 shelf_->GetAlignment()); |
| 294 } else if (new_state == ash::SHELF_AUTO_HIDE) { | 278 } else if (new_state == SHELF_AUTO_HIDE) { |
| 295 // Extend the touch hit target out a bit to allow users to drag shelf out | 279 // Extend the touch hit target out a bit to allow users to drag shelf out |
| 296 // while hidden. | 280 // while hidden. |
| 297 touch_insets = GetInsetsForAlignment( | 281 touch_insets = GetInsetsForAlignment( |
| 298 -ShelfLayoutManager::kWorkspaceAreaAutoHideInset, | 282 -ShelfLayoutManager::kWorkspaceAreaAutoHideInset, |
| 299 shelf_->GetAlignment()); | 283 shelf_->GetAlignment()); |
| 300 } | 284 } |
| 301 | 285 |
| 302 set_mouse_extend(mouse_insets); | 286 set_mouse_extend(mouse_insets); |
| 303 set_touch_extend(touch_insets); | 287 set_touch_extend(touch_insets); |
| 304 } | 288 } |
| 305 | 289 |
| 306 ShelfLayoutManager* shelf_; | 290 ShelfLayoutManager* shelf_; |
| 307 | 291 |
| 308 DISALLOW_COPY_AND_ASSIGN(ShelfWindowTargeter); | 292 DISALLOW_COPY_AND_ASSIGN(ShelfWindowTargeter); |
| 309 }; | 293 }; |
| 310 | 294 |
| 311 } // namespace | 295 } // namespace |
| 312 | 296 |
| 313 namespace ash { | |
| 314 | |
| 315 // The contents view of the Shelf. This view contains ShelfView and | 297 // The contents view of the Shelf. This view contains ShelfView and |
| 316 // sizes it to the width of the shelf minus the size of the status area. | 298 // sizes it to the width of the shelf minus the size of the status area. |
| 317 class ShelfWidget::DelegateView : public views::WidgetDelegate, | 299 class ShelfWidget::DelegateView : public views::WidgetDelegate, |
| 318 public views::AccessiblePaneView, | 300 public views::AccessiblePaneView, |
| 319 public BackgroundAnimatorDelegate, | 301 public BackgroundAnimatorDelegate, |
| 320 public aura::WindowObserver { | 302 public aura::WindowObserver { |
| 321 public: | 303 public: |
| 322 explicit DelegateView(ShelfWidget* shelf); | 304 explicit DelegateView(ShelfWidget* shelf); |
| 323 ~DelegateView() override; | 305 ~DelegateView() override; |
| 324 | 306 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { | 442 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { |
| 461 layer->Add(&opaque_background_); | 443 layer->Add(&opaque_background_); |
| 462 layer->Add(&opaque_foreground_); | 444 layer->Add(&opaque_foreground_); |
| 463 ReorderLayers(); | 445 ReorderLayers(); |
| 464 } | 446 } |
| 465 | 447 |
| 466 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { | 448 void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { |
| 467 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); | 449 ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance(); |
| 468 gfx::ImageSkia shelf_background = | 450 gfx::ImageSkia shelf_background = |
| 469 *rb->GetImageSkiaNamed(IDR_ASH_SHELF_BACKGROUND); | 451 *rb->GetImageSkiaNamed(IDR_ASH_SHELF_BACKGROUND); |
| 470 if (SHELF_ALIGNMENT_BOTTOM != shelf_->GetAlignment()) | 452 const bool horizontal = IsHorizontalAlignment(shelf_->GetAlignment()); |
| 453 if (!horizontal) { |
| 471 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( | 454 shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( |
| 472 shelf_background, | 455 shelf_background, shelf_->GetAlignment() == SHELF_ALIGNMENT_LEFT |
| 473 shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( | 456 ? SkBitmapOperations::ROTATION_90_CW |
| 474 SkBitmapOperations::ROTATION_90_CW, | 457 : SkBitmapOperations::ROTATION_270_CW); |
| 475 SkBitmapOperations::ROTATION_90_CW, | 458 } |
| 476 SkBitmapOperations::ROTATION_270_CW)); | |
| 477 const gfx::Rect dock_bounds(shelf_->shelf_layout_manager()->dock_bounds()); | 459 const gfx::Rect dock_bounds(shelf_->shelf_layout_manager()->dock_bounds()); |
| 478 SkPaint paint; | 460 SkPaint paint; |
| 479 paint.setAlpha(alpha_); | 461 paint.setAlpha(alpha_); |
| 480 canvas->DrawImageInt(shelf_background, | 462 canvas->DrawImageInt( |
| 481 0, | 463 shelf_background, 0, 0, shelf_background.width(), |
| 482 0, | 464 shelf_background.height(), |
| 483 shelf_background.width(), | 465 (horizontal && dock_bounds.x() == 0 && dock_bounds.width() > 0) |
| 484 shelf_background.height(), | 466 ? dock_bounds.width() |
| 485 (SHELF_ALIGNMENT_BOTTOM == shelf_->GetAlignment() && | 467 : 0, |
| 486 dock_bounds.x() == 0 && dock_bounds.width() > 0) | 468 0, horizontal ? width() - dock_bounds.width() : width(), height(), false, |
| 487 ? dock_bounds.width() | 469 paint); |
| 488 : 0, | 470 if (horizontal && dock_bounds.width() > 0) { |
| 489 0, | |
| 490 SHELF_ALIGNMENT_BOTTOM == shelf_->GetAlignment() | |
| 491 ? width() - dock_bounds.width() | |
| 492 : width(), | |
| 493 height(), | |
| 494 false, | |
| 495 paint); | |
| 496 if (SHELF_ALIGNMENT_BOTTOM == shelf_->GetAlignment() && | |
| 497 dock_bounds.width() > 0) { | |
| 498 // The part of the shelf background that is in the corner below the docked | 471 // The part of the shelf background that is in the corner below the docked |
| 499 // windows close to the work area is an arched gradient that blends | 472 // windows close to the work area is an arched gradient that blends |
| 500 // vertically oriented docked background and horizontal shelf. | 473 // vertically oriented docked background and horizontal shelf. |
| 501 gfx::ImageSkia shelf_corner = *rb->GetImageSkiaNamed(IDR_ASH_SHELF_CORNER); | 474 gfx::ImageSkia shelf_corner = *rb->GetImageSkiaNamed(IDR_ASH_SHELF_CORNER); |
| 502 if (dock_bounds.x() == 0) { | 475 if (dock_bounds.x() == 0) { |
| 503 shelf_corner = gfx::ImageSkiaOperations::CreateRotatedImage( | 476 shelf_corner = gfx::ImageSkiaOperations::CreateRotatedImage( |
| 504 shelf_corner, SkBitmapOperations::ROTATION_90_CW); | 477 shelf_corner, SkBitmapOperations::ROTATION_90_CW); |
| 505 } | 478 } |
| 506 canvas->DrawImageInt( | 479 canvas->DrawImageInt( |
| 507 shelf_corner, | 480 shelf_corner, 0, 0, shelf_corner.width(), shelf_corner.height(), |
| 508 0, | |
| 509 0, | |
| 510 shelf_corner.width(), | |
| 511 shelf_corner.height(), | |
| 512 dock_bounds.x() > 0 ? dock_bounds.x() : dock_bounds.width() - height(), | 481 dock_bounds.x() > 0 ? dock_bounds.x() : dock_bounds.width() - height(), |
| 513 0, | 482 0, height(), height(), false, paint); |
| 514 height(), | |
| 515 height(), | |
| 516 false, | |
| 517 paint); | |
| 518 // The part of the shelf background that is just below the docked windows | 483 // The part of the shelf background that is just below the docked windows |
| 519 // is drawn using the last (lowest) 1-pixel tall strip of the image asset. | 484 // is drawn using the last (lowest) 1-pixel tall strip of the image asset. |
| 520 // This avoids showing the border 3D shadow between the shelf and the dock. | 485 // This avoids showing the border 3D shadow between the shelf and the dock. |
| 521 canvas->DrawImageInt(shelf_background, | 486 canvas->DrawImageInt(shelf_background, 0, shelf_background.height() - 1, |
| 522 0, | 487 shelf_background.width(), 1, |
| 523 shelf_background.height() - 1, | |
| 524 shelf_background.width(), | |
| 525 1, | |
| 526 dock_bounds.x() > 0 ? dock_bounds.x() + height() : 0, | 488 dock_bounds.x() > 0 ? dock_bounds.x() + height() : 0, |
| 527 0, | 489 0, dock_bounds.width() - height(), height(), false, |
| 528 dock_bounds.width() - height(), | |
| 529 height(), | |
| 530 false, | |
| 531 paint); | 490 paint); |
| 532 } | 491 } |
| 533 gfx::Rect black_rect = | 492 gfx::Rect black_rect = |
| 534 shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( | 493 shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( |
| 535 gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels), | 494 gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels), |
| 536 gfx::Rect(0, 0, kNumBlackPixels, height()), | 495 gfx::Rect(0, 0, kNumBlackPixels, height()), |
| 537 gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height())); | 496 gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height())); |
| 538 canvas->FillRect(black_rect, SK_ColorBLACK); | 497 canvas->FillRect(black_rect, SK_ColorBLACK); |
| 539 } | 498 } |
| 540 | 499 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 case user::LOGGED_IN_NONE: | 680 case user::LOGGED_IN_NONE: |
| 722 return false; | 681 return false; |
| 723 } | 682 } |
| 724 | 683 |
| 725 NOTREACHED(); | 684 NOTREACHED(); |
| 726 return false; | 685 return false; |
| 727 } | 686 } |
| 728 | 687 |
| 729 ShelfAlignment ShelfWidget::GetAlignment() const { | 688 ShelfAlignment ShelfWidget::GetAlignment() const { |
| 730 // TODO(msw): This should not be called before |shelf_| is created. | 689 // TODO(msw): This should not be called before |shelf_| is created. |
| 731 return shelf_ ? shelf_->GetAlignment() : SHELF_ALIGNMENT_BOTTOM; | 690 return shelf_ ? shelf_->alignment() : SHELF_ALIGNMENT_BOTTOM_LOCKED; |
| 732 } | 691 } |
| 733 | 692 |
| 734 void ShelfWidget::OnShelfAlignmentChanged() { | 693 void ShelfWidget::OnShelfAlignmentChanged() { |
| 735 status_area_widget_->SetShelfAlignment(GetAlignment()); | 694 status_area_widget_->SetShelfAlignment(GetAlignment()); |
| 736 delegate_view_->SchedulePaint(); | 695 delegate_view_->SchedulePaint(); |
| 737 } | 696 } |
| 738 | 697 |
| 739 void ShelfWidget::SetDimsShelf(bool dimming) { | 698 void ShelfWidget::SetDimsShelf(bool dimming) { |
| 740 delegate_view_->SetDimmed(dimming); | 699 delegate_view_->SetDimmed(dimming); |
| 741 // Repaint all children, allowing updates to reflect dimmed state eg: | 700 // Repaint all children, allowing updates to reflect dimmed state eg: |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 DCHECK(delegate_view_); | 785 DCHECK(delegate_view_); |
| 827 return delegate_view_->disable_dimming_animations_for_test(); | 786 return delegate_view_->disable_dimming_animations_for_test(); |
| 828 } | 787 } |
| 829 | 788 |
| 830 void ShelfWidget::WillDeleteShelf() { | 789 void ShelfWidget::WillDeleteShelf() { |
| 831 shelf_layout_manager_->RemoveObserver(this); | 790 shelf_layout_manager_->RemoveObserver(this); |
| 832 shelf_layout_manager_ = NULL; | 791 shelf_layout_manager_ = NULL; |
| 833 } | 792 } |
| 834 | 793 |
| 835 } // namespace ash | 794 } // namespace ash |
| OLD | NEW |