File: stacked_panel_drag_handler.cc

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (82 lines) | stat: -rw-r--r-- 2,907 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/panels/stacked_panel_drag_handler.h"

#include "base/logging.h"
#include "chrome/browser/ui/panels/panel.h"
#include "chrome/browser/ui/panels/panel_collection.h"
#include "chrome/browser/ui/panels/stacked_panel_collection.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"

// static
void StackedPanelDragHandler::HandleDrag(Panel* panel,
                                         const gfx::Point& target_position,
                                         bool in_orginal_collection) {
  DCHECK_EQ(PanelCollection::STACKED, panel->collection()->type());

  StackedPanelCollection* stack = panel->stack();
  DCHECK(stack);

  // If the panel is in its original stack, only top panel is allowed to drag.
  if (in_orginal_collection && panel != stack->top_panel())
    return;

  // Find out if all panels in the stack are being dragged.
  bool all_panels_under_drag = true;
  for (StackedPanelCollection::Panels::const_iterator iter =
           stack->panels().begin();
       iter != stack->panels().end(); ++iter) {
    if (!(*iter)->in_preview_mode()) {
      all_panels_under_drag = false;
      break;
    }
  }

  gfx::Vector2d delta_origin = target_position - panel->GetBounds().origin();

  // If not all panels in the stack are being dragged, it means that these
  // panels being dragged have just been added to this stack. Dragging these
  // panels should only cause the horizontal movement due to that y position
  // of these panels have already aligned.
  if (!all_panels_under_drag)
    delta_origin.set_y(0);

  stack->MoveAllDraggingPanelsInstantly(delta_origin);
}

// static
void StackedPanelDragHandler::FinalizeDrag(Panel* panel) {
  DCHECK_EQ(PanelCollection::STACKED, panel->collection()->type());

  StackedPanelCollection* stack = panel->stack();
  DCHECK(stack);

  // It is only needed when dragging a panel/stack to stack to the top of
  // another panel/stack.
  if (stack->top_panel() != panel)
    return;

  // Find the first non-dragging panel that is used to align all dragging panels
  // above it to have the same x position. This is because all dragging panels
  // are only aligned vertically when the stacking occurs.
  Panel* first_non_dragging_panel = NULL;
  for (StackedPanelCollection::Panels::const_iterator iter =
           stack->panels().begin();
       iter != stack->panels().end(); ++iter) {
    Panel* panel = *iter;
    if (!panel->in_preview_mode()) {
      first_non_dragging_panel = panel;
      break;
    }
  }
  if (!first_non_dragging_panel)
    return;

  gfx::Vector2d delta_origin(
      first_non_dragging_panel->GetBounds().x() - panel->GetBounds().x(),
      0);
  stack->MoveAllDraggingPanelsInstantly(delta_origin);
}