Home | History | Annotate | Download | only in panels
      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/point.h"
     12 #include "ui/gfx/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 }
     83