OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/panels/stacked_panel_drag_handler.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "chrome/browser/ui/panels/panel.h" | |
9 #include "chrome/browser/ui/panels/panel_collection.h" | |
10 #include "chrome/browser/ui/panels/stacked_panel_collection.h" | |
11 #include "ui/gfx/geometry/point.h" | |
12 #include "ui/gfx/geometry/rect.h" | |
13 | |
14 // static | |
15 void StackedPanelDragHandler::HandleDrag(Panel* panel, | |
16 const gfx::Point& target_position, | |
17 bool in_orginal_collection) { | |
18 DCHECK_EQ(PanelCollection::STACKED, panel->collection()->type()); | |
19 | |
20 StackedPanelCollection* stack = panel->stack(); | |
21 DCHECK(stack); | |
22 | |
23 // If the panel is in its original stack, only top panel is allowed to drag. | |
24 if (in_orginal_collection && panel != stack->top_panel()) | |
25 return; | |
26 | |
27 // Find out if all panels in the stack are being dragged. | |
28 bool all_panels_under_drag = true; | |
29 for (StackedPanelCollection::Panels::const_iterator iter = | |
30 stack->panels().begin(); | |
31 iter != stack->panels().end(); ++iter) { | |
32 if (!(*iter)->in_preview_mode()) { | |
33 all_panels_under_drag = false; | |
34 break; | |
35 } | |
36 } | |
37 | |
38 gfx::Vector2d delta_origin = target_position - panel->GetBounds().origin(); | |
39 | |
40 // If not all panels in the stack are being dragged, it means that these | |
41 // panels being dragged have just been added to this stack. Dragging these | |
42 // panels should only cause the horizontal movement due to that y position | |
43 // of these panels have already aligned. | |
44 if (!all_panels_under_drag) | |
45 delta_origin.set_y(0); | |
46 | |
47 stack->MoveAllDraggingPanelsInstantly(delta_origin); | |
48 } | |
49 | |
50 // static | |
51 void StackedPanelDragHandler::FinalizeDrag(Panel* panel) { | |
52 DCHECK_EQ(PanelCollection::STACKED, panel->collection()->type()); | |
53 | |
54 StackedPanelCollection* stack = panel->stack(); | |
55 DCHECK(stack); | |
56 | |
57 // It is only needed when dragging a panel/stack to stack to the top of | |
58 // another panel/stack. | |
59 if (stack->top_panel() != panel) | |
60 return; | |
61 | |
62 // Find the first non-dragging panel that is used to align all dragging panels | |
63 // above it to have the same x position. This is because all dragging panels | |
64 // are only aligned vertically when the stacking occurs. | |
65 Panel* first_non_dragging_panel = NULL; | |
66 for (StackedPanelCollection::Panels::const_iterator iter = | |
67 stack->panels().begin(); | |
68 iter != stack->panels().end(); ++iter) { | |
69 Panel* panel = *iter; | |
70 if (!panel->in_preview_mode()) { | |
71 first_non_dragging_panel = panel; | |
72 break; | |
73 } | |
74 } | |
75 if (!first_non_dragging_panel) | |
76 return; | |
77 | |
78 gfx::Vector2d delta_origin( | |
79 first_non_dragging_panel->GetBounds().x() - panel->GetBounds().x(), | |
80 0); | |
81 stack->MoveAllDraggingPanelsInstantly(delta_origin); | |
82 } | |
OLD | NEW |