Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(283)

Side by Side Diff: ash/wm/panels/panel_window_resizer.cc

Issue 121153003: Prevents panels attached to shelf from docking (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Prevents panels attached to shelf from docking (nits) Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ash/wm/panels/panel_window_resizer.h ('k') | ash/wm/window_resizer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_window_resizer.h" 5 #include "ash/wm/panels/panel_window_resizer.h"
6 6
7 #include "ash/display/display_controller.h" 7 #include "ash/display/display_controller.h"
8 #include "ash/screen_ash.h" 8 #include "ash/screen_ash.h"
9 #include "ash/shelf/shelf.h" 9 #include "ash/shelf/shelf.h"
10 #include "ash/shelf/shelf_types.h" 10 #include "ash/shelf/shelf_types.h"
(...skipping 29 matching lines...) Expand all
40 } 40 }
41 41
42 } // namespace 42 } // namespace
43 43
44 PanelWindowResizer::~PanelWindowResizer() { 44 PanelWindowResizer::~PanelWindowResizer() {
45 } 45 }
46 46
47 // static 47 // static
48 PanelWindowResizer* 48 PanelWindowResizer*
49 PanelWindowResizer::Create(WindowResizer* next_window_resizer, 49 PanelWindowResizer::Create(WindowResizer* next_window_resizer,
50 aura::Window* window, 50 wm::WindowState* window_state) {
51 const gfx::Point& location, 51 return new PanelWindowResizer(next_window_resizer, window_state);
52 int window_component,
53 aura::client::WindowMoveSource source) {
54 Details details(window, location, window_component, source);
55 return details.is_resizable ?
56 new PanelWindowResizer(next_window_resizer, details) : NULL;
57 } 52 }
58 53
59 void PanelWindowResizer::Drag(const gfx::Point& location, int event_flags) { 54 void PanelWindowResizer::Drag(const gfx::Point& location, int event_flags) {
60 last_location_ = location; 55 last_location_ = location;
61 wm::ConvertPointToScreen(GetTarget()->parent(), &last_location_); 56 wm::ConvertPointToScreen(GetTarget()->parent(), &last_location_);
62 if (!did_move_or_resize_) { 57 if (!did_move_or_resize_) {
63 did_move_or_resize_ = true; 58 did_move_or_resize_ = true;
64 StartedDragging(); 59 StartedDragging();
65 } 60 }
66 61
(...skipping 14 matching lines...) Expand all
81 GetRootWindowForDisplayId(dst_display.id()); 76 GetRootWindowForDisplayId(dst_display.id());
82 panel_container_ = Shell::GetContainer( 77 panel_container_ = Shell::GetContainer(
83 dst_root, internal::kShellWindowId_PanelContainer); 78 dst_root, internal::kShellWindowId_PanelContainer);
84 79
85 // The panel's parent already knows that the drag is in progress for this 80 // The panel's parent already knows that the drag is in progress for this
86 // panel. 81 // panel.
87 if (panel_container_ && GetTarget()->parent() != panel_container_) 82 if (panel_container_ && GetTarget()->parent() != panel_container_)
88 GetPanelLayoutManager(panel_container_)->StartDragging(GetTarget()); 83 GetPanelLayoutManager(panel_container_)->StartDragging(GetTarget());
89 } 84 }
90 gfx::Point offset; 85 gfx::Point offset;
91 gfx::Rect bounds(CalculateBoundsForDrag(details_, location)); 86 gfx::Rect bounds(CalculateBoundsForDrag(location));
92 should_attach_ = AttachToLauncher(bounds, &offset); 87 if (!(details().bounds_change & WindowResizer::kBoundsChange_Resizes)) {
88 window_state_->drag_details()->should_attach_to_shelf =
89 AttachToLauncher(bounds, &offset);
90 }
93 gfx::Point modified_location(location.x() + offset.x(), 91 gfx::Point modified_location(location.x() + offset.x(),
94 location.y() + offset.y()); 92 location.y() + offset.y());
95 93
96 base::WeakPtr<PanelWindowResizer> resizer(weak_ptr_factory_.GetWeakPtr()); 94 base::WeakPtr<PanelWindowResizer> resizer(weak_ptr_factory_.GetWeakPtr());
97 next_window_resizer_->Drag(modified_location, event_flags); 95 next_window_resizer_->Drag(modified_location, event_flags);
98 if (!resizer) 96 if (!resizer)
99 return; 97 return;
100 98
101 if (should_attach_ && 99 if (details().should_attach_to_shelf &&
102 !(details_.bounds_change & WindowResizer::kBoundsChange_Resizes)) { 100 !(details().bounds_change & WindowResizer::kBoundsChange_Resizes)) {
103 UpdateLauncherPosition(); 101 UpdateLauncherPosition();
104 } 102 }
105 } 103 }
106 104
107 void PanelWindowResizer::CompleteDrag() { 105 void PanelWindowResizer::CompleteDrag() {
108 // The root window can change when dragging into a different screen. 106 // The root window can change when dragging into a different screen.
109 next_window_resizer_->CompleteDrag(); 107 next_window_resizer_->CompleteDrag();
110 FinishDragging(); 108 FinishDragging();
111 } 109 }
112 110
113 void PanelWindowResizer::RevertDrag() { 111 void PanelWindowResizer::RevertDrag() {
114 next_window_resizer_->RevertDrag(); 112 next_window_resizer_->RevertDrag();
115 should_attach_ = was_attached_; 113 window_state_->drag_details()->should_attach_to_shelf = was_attached_;
116 FinishDragging(); 114 FinishDragging();
117 } 115 }
118 116
119 aura::Window* PanelWindowResizer::GetTarget() {
120 return next_window_resizer_->GetTarget();
121 }
122
123 const gfx::Point& PanelWindowResizer::GetInitialLocation() const {
124 return details_.initial_location_in_parent;
125 }
126
127 PanelWindowResizer::PanelWindowResizer(WindowResizer* next_window_resizer, 117 PanelWindowResizer::PanelWindowResizer(WindowResizer* next_window_resizer,
128 const Details& details) 118 wm::WindowState* window_state)
129 : details_(details), 119 : WindowResizer(window_state),
130 next_window_resizer_(next_window_resizer), 120 next_window_resizer_(next_window_resizer),
131 panel_container_(NULL), 121 panel_container_(NULL),
132 initial_panel_container_(NULL), 122 initial_panel_container_(NULL),
133 did_move_or_resize_(false), 123 did_move_or_resize_(false),
134 was_attached_(wm::GetWindowState(GetTarget())->panel_attached()), 124 was_attached_(window_state->panel_attached()),
135 should_attach_(was_attached_),
136 weak_ptr_factory_(this) { 125 weak_ptr_factory_(this) {
137 DCHECK(details_.is_resizable); 126 DCHECK(details().is_resizable);
138 panel_container_ = Shell::GetContainer( 127 panel_container_ = Shell::GetContainer(
139 details.window->GetRootWindow(), 128 GetTarget()->GetRootWindow(),
140 internal::kShellWindowId_PanelContainer); 129 internal::kShellWindowId_PanelContainer);
141 initial_panel_container_ = panel_container_; 130 initial_panel_container_ = panel_container_;
142 } 131 }
143 132
144 bool PanelWindowResizer::AttachToLauncher(const gfx::Rect& bounds, 133 bool PanelWindowResizer::AttachToLauncher(const gfx::Rect& bounds,
145 gfx::Point* offset) { 134 gfx::Point* offset) {
146 bool should_attach = false; 135 bool should_attach = false;
147 if (panel_container_) { 136 if (panel_container_) {
148 internal::PanelLayoutManager* panel_layout_manager = 137 internal::PanelLayoutManager* panel_layout_manager =
149 GetPanelLayoutManager(panel_container_); 138 GetPanelLayoutManager(panel_container_);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 return should_attach; 174 return should_attach;
186 } 175 }
187 176
188 void PanelWindowResizer::StartedDragging() { 177 void PanelWindowResizer::StartedDragging() {
189 // Tell the panel layout manager that we are dragging this panel before 178 // Tell the panel layout manager that we are dragging this panel before
190 // attaching it so that it does not get repositioned. 179 // attaching it so that it does not get repositioned.
191 if (panel_container_) 180 if (panel_container_)
192 GetPanelLayoutManager(panel_container_)->StartDragging(GetTarget()); 181 GetPanelLayoutManager(panel_container_)->StartDragging(GetTarget());
193 if (!was_attached_) { 182 if (!was_attached_) {
194 // Attach the panel while dragging placing it in front of other panels. 183 // Attach the panel while dragging placing it in front of other panels.
195 wm::GetWindowState(GetTarget())->set_continue_drag_after_reparent(true); 184 window_state_->set_continue_drag_after_reparent(true);
196 wm::GetWindowState(GetTarget())->set_panel_attached(true); 185 window_state_->set_panel_attached(true);
197 // We use root window coordinates to ensure that during the drag the panel 186 // We use root window coordinates to ensure that during the drag the panel
198 // is reparented to a container in the root window that has that window. 187 // is reparented to a container in the root window that has that window.
199 aura::Window* target = GetTarget(); 188 aura::Window* target = GetTarget();
200 aura::Window* target_root = target->GetRootWindow(); 189 aura::Window* target_root = target->GetRootWindow();
201 aura::Window* old_parent = target->parent(); 190 aura::Window* old_parent = target->parent();
202 aura::client::ParentWindowWithContext( 191 aura::client::ParentWindowWithContext(
203 target, target_root, target_root->GetBoundsInScreen()); 192 target, target_root, target_root->GetBoundsInScreen());
204 wm::ReparentTransientChildrenOfChild(target, old_parent, target->parent()); 193 wm::ReparentTransientChildrenOfChild(target, old_parent, target->parent());
205 } 194 }
206 } 195 }
207 196
208 void PanelWindowResizer::FinishDragging() { 197 void PanelWindowResizer::FinishDragging() {
209 if (!did_move_or_resize_) 198 if (!did_move_or_resize_)
210 return; 199 return;
211 if (details_.bounds_change & WindowResizer::kBoundsChange_Resizes) 200 if (window_state_->panel_attached() != details().should_attach_to_shelf) {
212 should_attach_ = was_attached_; 201 window_state_->set_panel_attached(details().should_attach_to_shelf);
213 if (wm::GetWindowState(GetTarget())->panel_attached() != should_attach_) {
214 wm::GetWindowState(GetTarget())->set_panel_attached(should_attach_);
215 // We use last known location to ensure that after the drag the panel 202 // We use last known location to ensure that after the drag the panel
216 // is reparented to a container in the root window that has that location. 203 // is reparented to a container in the root window that has that location.
217 aura::Window* target = GetTarget(); 204 aura::Window* target = GetTarget();
218 aura::Window* target_root = target->GetRootWindow(); 205 aura::Window* target_root = target->GetRootWindow();
219 aura::Window* old_parent = target->parent(); 206 aura::Window* old_parent = target->parent();
220 aura::client::ParentWindowWithContext( 207 aura::client::ParentWindowWithContext(
221 target, target_root, gfx::Rect(last_location_, gfx::Size())); 208 target, target_root, gfx::Rect(last_location_, gfx::Size()));
222 wm::ReparentTransientChildrenOfChild(target, old_parent, target->parent()); 209 wm::ReparentTransientChildrenOfChild(target, old_parent, target->parent());
223 } 210 }
224 211
225 // If we started the drag in one root window and moved into another root 212 // If we started the drag in one root window and moved into another root
226 // but then canceled the drag we may need to inform the original layout 213 // but then canceled the drag we may need to inform the original layout
227 // manager that the drag is finished. 214 // manager that the drag is finished.
228 if (initial_panel_container_ != panel_container_) 215 if (initial_panel_container_ != panel_container_)
229 GetPanelLayoutManager(initial_panel_container_)->FinishDragging(); 216 GetPanelLayoutManager(initial_panel_container_)->FinishDragging();
230 if (panel_container_) 217 if (panel_container_)
231 GetPanelLayoutManager(panel_container_)->FinishDragging(); 218 GetPanelLayoutManager(panel_container_)->FinishDragging();
232 } 219 }
233 220
234 void PanelWindowResizer::UpdateLauncherPosition() { 221 void PanelWindowResizer::UpdateLauncherPosition() {
235 if (panel_container_) { 222 if (panel_container_) {
236 GetPanelLayoutManager(panel_container_)->shelf()-> 223 GetPanelLayoutManager(panel_container_)->shelf()->
237 UpdateIconPositionForWindow(GetTarget()); 224 UpdateIconPositionForWindow(GetTarget());
238 } 225 }
239 } 226 }
240 227
241 } // namespace aura 228 } // namespace aura
OLDNEW
« no previous file with comments | « ash/wm/panels/panel_window_resizer.h ('k') | ash/wm/window_resizer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698