OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/wm/panels/panel_layout_manager.h" | 5 #include "ash/wm/panels/panel_layout_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 | 63 |
64 class CalloutWidgetBackground : public views::Background { | 64 class CalloutWidgetBackground : public views::Background { |
65 public: | 65 public: |
66 CalloutWidgetBackground() : alignment_(SHELF_ALIGNMENT_BOTTOM) { | 66 CalloutWidgetBackground() : alignment_(SHELF_ALIGNMENT_BOTTOM) { |
67 } | 67 } |
68 | 68 |
69 void Paint(gfx::Canvas* canvas, views::View* view) const override { | 69 void Paint(gfx::Canvas* canvas, views::View* view) const override { |
70 SkPath path; | 70 SkPath path; |
71 switch (alignment_) { | 71 switch (alignment_) { |
72 case SHELF_ALIGNMENT_BOTTOM: | 72 case SHELF_ALIGNMENT_BOTTOM: |
| 73 case SHELF_ALIGNMENT_BOTTOM_LOCKED: |
73 path.moveTo(SkIntToScalar(0), SkIntToScalar(0)); | 74 path.moveTo(SkIntToScalar(0), SkIntToScalar(0)); |
74 path.lineTo(SkIntToScalar(kArrowWidth / 2), | 75 path.lineTo(SkIntToScalar(kArrowWidth / 2), |
75 SkIntToScalar(kArrowHeight)); | 76 SkIntToScalar(kArrowHeight)); |
76 path.lineTo(SkIntToScalar(kArrowWidth), SkIntToScalar(0)); | 77 path.lineTo(SkIntToScalar(kArrowWidth), SkIntToScalar(0)); |
77 break; | 78 break; |
78 case SHELF_ALIGNMENT_LEFT: | 79 case SHELF_ALIGNMENT_LEFT: |
79 path.moveTo(SkIntToScalar(kArrowHeight), SkIntToScalar(kArrowWidth)); | 80 path.moveTo(SkIntToScalar(kArrowHeight), SkIntToScalar(kArrowWidth)); |
80 path.lineTo(SkIntToScalar(0), SkIntToScalar(kArrowWidth / 2)); | 81 path.lineTo(SkIntToScalar(0), SkIntToScalar(kArrowWidth / 2)); |
81 path.lineTo(SkIntToScalar(kArrowHeight), SkIntToScalar(0)); | 82 path.lineTo(SkIntToScalar(kArrowHeight), SkIntToScalar(0)); |
82 break; | 83 break; |
83 case SHELF_ALIGNMENT_RIGHT: | 84 case SHELF_ALIGNMENT_RIGHT: |
84 path.moveTo(SkIntToScalar(0), SkIntToScalar(0)); | 85 path.moveTo(SkIntToScalar(0), SkIntToScalar(0)); |
85 path.lineTo(SkIntToScalar(kArrowHeight), | 86 path.lineTo(SkIntToScalar(kArrowHeight), |
86 SkIntToScalar(kArrowWidth / 2)); | 87 SkIntToScalar(kArrowWidth / 2)); |
87 path.lineTo(SkIntToScalar(0), SkIntToScalar(kArrowWidth)); | 88 path.lineTo(SkIntToScalar(0), SkIntToScalar(kArrowWidth)); |
88 break; | 89 break; |
89 } | 90 } |
90 // Hard code the arrow color for now. | 91 // Hard code the arrow color for now. |
91 SkPaint paint; | 92 SkPaint paint; |
92 paint.setStyle(SkPaint::kFill_Style); | 93 paint.setStyle(SkPaint::kFill_Style); |
93 paint.setColor(SkColorSetARGB(0xff, 0xe5, 0xe5, 0xe5)); | 94 paint.setColor(SkColorSetARGB(0xff, 0xe5, 0xe5, 0xe5)); |
94 canvas->DrawPath(path, paint); | 95 canvas->DrawPath(path, paint); |
95 } | 96 } |
96 | 97 |
97 ShelfAlignment alignment() { | 98 ShelfAlignment alignment() { return alignment_; } |
98 return alignment_; | |
99 } | |
100 | 99 |
101 void set_alignment(ShelfAlignment alignment) { | 100 void set_alignment(ShelfAlignment alignment) { alignment_ = alignment; } |
102 alignment_ = alignment; | |
103 } | |
104 | 101 |
105 private: | 102 private: |
106 ShelfAlignment alignment_; | 103 ShelfAlignment alignment_; |
107 | 104 |
108 DISALLOW_COPY_AND_ASSIGN(CalloutWidgetBackground); | 105 DISALLOW_COPY_AND_ASSIGN(CalloutWidgetBackground); |
109 }; | 106 }; |
110 | 107 |
111 struct VisiblePanelPositionInfo { | 108 struct VisiblePanelPositionInfo { |
112 VisiblePanelPositionInfo() | 109 VisiblePanelPositionInfo() |
113 : min_major(0), | 110 : min_major(0), |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 | 169 |
173 bool BoundsAdjacent(const gfx::Rect& bounds1, const gfx::Rect& bounds2) { | 170 bool BoundsAdjacent(const gfx::Rect& bounds1, const gfx::Rect& bounds2) { |
174 return bounds1.x() == bounds2.right() || | 171 return bounds1.x() == bounds2.right() || |
175 bounds1.y() == bounds2.bottom() || | 172 bounds1.y() == bounds2.bottom() || |
176 bounds1.right() == bounds2.x() || | 173 bounds1.right() == bounds2.x() || |
177 bounds1.bottom() == bounds2.y(); | 174 bounds1.bottom() == bounds2.y(); |
178 } | 175 } |
179 | 176 |
180 gfx::Vector2d GetSlideInAnimationOffset(ShelfAlignment alignment) { | 177 gfx::Vector2d GetSlideInAnimationOffset(ShelfAlignment alignment) { |
181 gfx::Vector2d offset; | 178 gfx::Vector2d offset; |
182 switch (alignment) { | 179 if (alignment == SHELF_ALIGNMENT_LEFT) |
183 case SHELF_ALIGNMENT_BOTTOM: | 180 offset.set_x(-kPanelSlideInOffset); |
184 offset.set_y(kPanelSlideInOffset); | 181 else if (alignment == SHELF_ALIGNMENT_RIGHT) |
185 break; | 182 offset.set_x(kPanelSlideInOffset); |
186 case SHELF_ALIGNMENT_LEFT: | 183 else |
187 offset.set_x(-kPanelSlideInOffset); | 184 offset.set_y(kPanelSlideInOffset); |
188 break; | |
189 case SHELF_ALIGNMENT_RIGHT: | |
190 offset.set_x(kPanelSlideInOffset); | |
191 break; | |
192 } | |
193 return offset; | 185 return offset; |
194 } | 186 } |
195 | 187 |
196 } // namespace | 188 } // namespace |
197 | 189 |
198 class PanelCalloutWidget : public views::Widget { | 190 class PanelCalloutWidget : public views::Widget { |
199 public: | 191 public: |
200 explicit PanelCalloutWidget(aura::Window* container) | 192 explicit PanelCalloutWidget(aura::Window* container) |
201 : background_(NULL) { | 193 : background_(NULL) { |
202 InitWidget(container); | 194 InitWidget(container); |
203 } | 195 } |
204 | 196 |
205 void SetAlignment(ShelfAlignment alignment) { | 197 void SetAlignment(ShelfAlignment alignment) { |
206 gfx::Rect callout_bounds = GetWindowBoundsInScreen(); | 198 gfx::Rect callout_bounds = GetWindowBoundsInScreen(); |
207 if (alignment == SHELF_ALIGNMENT_BOTTOM) { | 199 if (IsHorizontalAlignment(alignment)) { |
208 callout_bounds.set_width(kArrowWidth); | 200 callout_bounds.set_width(kArrowWidth); |
209 callout_bounds.set_height(kArrowHeight); | 201 callout_bounds.set_height(kArrowHeight); |
210 } else { | 202 } else { |
211 callout_bounds.set_width(kArrowHeight); | 203 callout_bounds.set_width(kArrowHeight); |
212 callout_bounds.set_height(kArrowWidth); | 204 callout_bounds.set_height(kArrowWidth); |
213 } | 205 } |
214 GetNativeWindow()->SetBounds(callout_bounds); | 206 GetNativeWindow()->SetBounds(callout_bounds); |
215 if (background_->alignment() != alignment) { | 207 if (background_->alignment() != alignment) { |
216 background_->set_alignment(alignment); | 208 background_->set_alignment(alignment); |
217 SchedulePaintInRect(gfx::Rect(gfx::Point(), callout_bounds.size())); | 209 SchedulePaintInRect(gfx::Rect(gfx::Point(), callout_bounds.size())); |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 } | 689 } |
698 } | 690 } |
699 FanOutPanels(visible_panels.begin() + first_overlapping_panel, | 691 FanOutPanels(visible_panels.begin() + first_overlapping_panel, |
700 visible_panels.end()); | 692 visible_panels.end()); |
701 | 693 |
702 for (size_t i = 0; i < visible_panels.size(); ++i) { | 694 for (size_t i = 0; i < visible_panels.size(); ++i) { |
703 if (visible_panels[i].window == dragged_panel_) | 695 if (visible_panels[i].window == dragged_panel_) |
704 continue; | 696 continue; |
705 bool slide_in = visible_panels[i].slide_in; | 697 bool slide_in = visible_panels[i].slide_in; |
706 gfx::Rect bounds = visible_panels[i].window->GetTargetBounds(); | 698 gfx::Rect bounds = visible_panels[i].window->GetTargetBounds(); |
707 switch (alignment) { | 699 if (alignment == SHELF_ALIGNMENT_LEFT) |
708 case SHELF_ALIGNMENT_BOTTOM: | 700 bounds.set_x(shelf_bounds.right()); |
709 bounds.set_y(shelf_bounds.y() - bounds.height()); | 701 else if (alignment == SHELF_ALIGNMENT_RIGHT) |
710 break; | 702 bounds.set_x(shelf_bounds.x() - bounds.width()); |
711 case SHELF_ALIGNMENT_LEFT: | 703 else |
712 bounds.set_x(shelf_bounds.right()); | 704 bounds.set_y(shelf_bounds.y() - bounds.height()); |
713 break; | |
714 case SHELF_ALIGNMENT_RIGHT: | |
715 bounds.set_x(shelf_bounds.x() - bounds.width()); | |
716 break; | |
717 } | |
718 bool on_shelf = visible_panels[i].window->GetTargetBounds() == bounds; | 705 bool on_shelf = visible_panels[i].window->GetTargetBounds() == bounds; |
719 | 706 |
720 if (horizontal) { | 707 if (horizontal) { |
721 bounds.set_x(visible_panels[i].major_pos - | 708 bounds.set_x(visible_panels[i].major_pos - |
722 visible_panels[i].major_length / 2); | 709 visible_panels[i].major_length / 2); |
723 } else { | 710 } else { |
724 bounds.set_y(visible_panels[i].major_pos - | 711 bounds.set_y(visible_panels[i].major_pos - |
725 visible_panels[i].major_length / 2); | 712 visible_panels[i].major_length / 2); |
726 } | 713 } |
727 | 714 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 current_bounds.x() - callout_bounds.x(), | 827 current_bounds.x() - callout_bounds.x(), |
841 callout_bounds.right() - current_bounds.right()); | 828 callout_bounds.right() - current_bounds.right()); |
842 } else { | 829 } else { |
843 callout_bounds.set_y( | 830 callout_bounds.set_y( |
844 icon_bounds.y() + (icon_bounds.height() - | 831 icon_bounds.y() + (icon_bounds.height() - |
845 callout_bounds.height()) / 2); | 832 callout_bounds.height()) / 2); |
846 distance_until_over_panel = std::max( | 833 distance_until_over_panel = std::max( |
847 current_bounds.y() - callout_bounds.y(), | 834 current_bounds.y() - callout_bounds.y(), |
848 callout_bounds.bottom() - current_bounds.bottom()); | 835 callout_bounds.bottom() - current_bounds.bottom()); |
849 } | 836 } |
850 switch (shelf_->alignment()) { | 837 if (shelf_->alignment() == SHELF_ALIGNMENT_LEFT) |
851 case SHELF_ALIGNMENT_BOTTOM: | 838 callout_bounds.set_x(bounds.x() - callout_bounds.width()); |
852 callout_bounds.set_y(bounds.bottom()); | 839 else if (shelf_->alignment() == SHELF_ALIGNMENT_RIGHT) |
853 break; | 840 callout_bounds.set_x(bounds.right()); |
854 case SHELF_ALIGNMENT_LEFT: | 841 else |
855 callout_bounds.set_x(bounds.x() - callout_bounds.width()); | 842 callout_bounds.set_y(bounds.bottom()); |
856 break; | |
857 case SHELF_ALIGNMENT_RIGHT: | |
858 callout_bounds.set_x(bounds.right()); | |
859 break; | |
860 } | |
861 callout_bounds = ScreenUtil::ConvertRectFromScreen( | 843 callout_bounds = ScreenUtil::ConvertRectFromScreen( |
862 callout_widget->GetNativeWindow()->parent(), | 844 callout_widget->GetNativeWindow()->parent(), |
863 callout_bounds); | 845 callout_bounds); |
864 | 846 |
865 SetChildBoundsDirect(callout_widget->GetNativeWindow(), callout_bounds); | 847 SetChildBoundsDirect(callout_widget->GetNativeWindow(), callout_bounds); |
866 panel_container_->StackChildAbove(callout_widget->GetNativeWindow(), | 848 panel_container_->StackChildAbove(callout_widget->GetNativeWindow(), |
867 panel); | 849 panel); |
868 | 850 |
869 ui::Layer* layer = callout_widget->GetNativeWindow()->layer(); | 851 ui::Layer* layer = callout_widget->GetNativeWindow()->layer(); |
870 // If the panel is not over the callout position or has just become visible | 852 // If the panel is not over the callout position or has just become visible |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
930 // Keyboard hidden, restore original bounds if they exist. | 912 // Keyboard hidden, restore original bounds if they exist. |
931 SetChildBounds(panel, panel_state->GetRestoreBoundsInScreen()); | 913 SetChildBounds(panel, panel_state->GetRestoreBoundsInScreen()); |
932 } | 914 } |
933 } | 915 } |
934 // This bounds change will have caused a change to the Shelf which does not | 916 // This bounds change will have caused a change to the Shelf which does not |
935 // propogate automatically to this class, so manually recalculate bounds. | 917 // propogate automatically to this class, so manually recalculate bounds. |
936 OnWindowResized(); | 918 OnWindowResized(); |
937 } | 919 } |
938 | 920 |
939 } // namespace ash | 921 } // namespace ash |
OLD | NEW |