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

Side by Side Diff: chrome/browser/resources/options/chromeos/display_layout_manager_multi.js

Issue 2562783002: Fix collision calculation (Closed)
Patch Set: Created 4 years 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 | « chrome/browser/resources/options/chromeos/display_layout.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 cr.exportPath('options'); 5 cr.exportPath('options');
6 6
7 cr.define('options', function() { 7 cr.define('options', function() {
8 'use strict'; 8 'use strict';
9 9
10 var DisplayLayoutManager = options.DisplayLayoutManager; 10 var DisplayLayoutManager = options.DisplayLayoutManager;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 49
50 // Find the closest edge. 50 // Find the closest edge.
51 var layoutType = layout.getLayoutTypeForPosition(parent.div, newPosition); 51 var layoutType = layout.getLayoutTypeForPosition(parent.div, newPosition);
52 52
53 // Calculate the new position and delta. 53 // Calculate the new position and delta.
54 var oldPos = {x: layout.div.offsetLeft, y: layout.div.offsetTop}; 54 var oldPos = {x: layout.div.offsetLeft, y: layout.div.offsetTop};
55 var newPos = layout.getSnapPosition(newPosition, parent.div, layoutType); 55 var newPos = layout.getSnapPosition(newPosition, parent.div, layoutType);
56 var deltaPos = {x: newPos.x - oldPos.x, y: newPos.y - oldPos.y}; 56 var deltaPos = {x: newPos.x - oldPos.x, y: newPos.y - oldPos.y};
57 57
58 // Check for collisions. 58 // Check for collisions.
59 this.collideAndModifyDelta_(layout, deltaPos); 59 this.collideAndModifyDelta_(layout, oldPos, deltaPos);
60 if (deltaPos.x == 0 && deltaPos.y == 0) 60 if (deltaPos.x == 0 && deltaPos.y == 0)
61 return; 61 return;
62 62
63 // Update the div (but not the actual layout type or offset yet), 63 // Update the div (but not the actual layout type or offset yet),
64 newPos = {x: oldPos.x + deltaPos.x, y: oldPos.y + deltaPos.y}; 64 newPos = {x: oldPos.x + deltaPos.x, y: oldPos.y + deltaPos.y};
65 layout.setDivPosition(newPos, parent.div, layoutType); 65 layout.setDivPosition(newPos, parent.div, layoutType);
66 66
67 // If the edge changed, update and highlight it. 67 // If the edge changed, update and highlight it.
68 if (layoutType != this.dragLayoutType_ || 68 if (layoutType != this.dragLayoutType_ ||
69 parentId != this.dragParentId_) { 69 parentId != this.dragParentId_) {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 187
188 // Find the closest edge. 188 // Find the closest edge.
189 var layoutType = orphan.getLayoutTypeForPosition(parent.div, pos); 189 var layoutType = orphan.getLayoutTypeForPosition(parent.div, pos);
190 190
191 // Snap from the nearest corner to the desired locaiton and get the delta. 191 // Snap from the nearest corner to the desired locaiton and get the delta.
192 var cornerPos = orphan.getCornerPos(parent.div, pos); 192 var cornerPos = orphan.getCornerPos(parent.div, pos);
193 pos = orphan.getSnapPosition(pos, parent.div, layoutType); 193 pos = orphan.getSnapPosition(pos, parent.div, layoutType);
194 var deltaPos = {x: pos.x - cornerPos.x, y: pos.y - cornerPos.y}; 194 var deltaPos = {x: pos.x - cornerPos.x, y: pos.y - cornerPos.y};
195 195
196 // Check for collisions. 196 // Check for collisions.
197 this.collideAndModifyDelta_(orphan, deltaPos); 197 this.collideAndModifyDelta_(orphan, cornerPos, deltaPos);
198 pos = {x: cornerPos.x + deltaPos.x, y: cornerPos.y + deltaPos.y}; 198 pos = {x: cornerPos.x + deltaPos.x, y: cornerPos.y + deltaPos.y};
199 199
200 // Update the div and adjust the corners. 200 // Update the div and adjust the corners.
201 orphan.layoutType = layoutType; 201 orphan.layoutType = layoutType;
202 orphan.setDivPosition(pos, parent.div, layoutType); 202 orphan.setDivPosition(pos, parent.div, layoutType);
203 orphan.adjustCorners(parent.div, layoutType); 203 orphan.adjustCorners(parent.div, layoutType);
204 204
205 // Calculate the bounds from the new div position. 205 // Calculate the bounds from the new div position.
206 orphan.calculateOffset(this.visualScale_, parent); 206 orphan.calculateOffset(this.visualScale_, parent);
207 207
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 var delta2 = dx * dx + dy * dy; 272 var delta2 = dx * dx + dy * dy;
273 if (closestId == '' || delta2 < closestDelta2) { 273 if (closestId == '' || delta2 < closestDelta2) {
274 closestId = id; 274 closestId = id;
275 closestDelta2 = delta2; 275 closestDelta2 = delta2;
276 } 276 }
277 } 277 }
278 return closestId; 278 return closestId;
279 }, 279 },
280 280
281 /** 281 /**
282 * Intersects |layout| with each other layout and reduces |deltaPos| to 282 * Intersects |layout| at |pos| with each other layout and reduces
283 * avoid any collisions (or sets it to [0,0] if the div can not be moved 283 * |deltaPos| to avoid any collisions (or sets it to [0,0] if the div can
284 * in the direction of |deltaPos|). 284 * not be moved in the direction of |deltaPos|).
285 * @param {!options.DisplayLayout} layout 285 * @param {!options.DisplayLayout} layout
286 * @param {!options.DisplayPosition} pos
286 * @param {!options.DisplayPosition} deltaPos 287 * @param {!options.DisplayPosition} deltaPos
287 */ 288 */
288 collideAndModifyDelta_: function(layout, deltaPos) { 289 collideAndModifyDelta_: function(layout, pos, deltaPos) {
289 var keys = Object.keys( 290 var keys = Object.keys(
290 /** @type {!Object<!options.DisplayLayout>}*/ ( 291 /** @type {!Object<!options.DisplayLayout>}*/ (
291 this.displayLayoutMap_)); 292 this.displayLayoutMap_));
292 var others = new Set(keys); 293 var others = new Set(keys);
293 others.delete(layout.id); 294 others.delete(layout.id);
294 var checkCollisions = true; 295 var checkCollisions = true;
295 while (checkCollisions) { 296 while (checkCollisions) {
296 checkCollisions = false; 297 checkCollisions = false;
297 for (var tid of others) { 298 for (var tid of others) {
298 var tlayout = this.displayLayoutMap_[tid]; 299 var tlayout = this.displayLayoutMap_[tid];
299 if (layout.collideWithDivAndModifyDelta(tlayout.div, deltaPos)) { 300 if (layout.collideWithDivAndModifyDelta(pos, tlayout.div, deltaPos)) {
300 if (deltaPos.x == 0 && deltaPos.y == 0) 301 if (deltaPos.x == 0 && deltaPos.y == 0)
301 return; 302 return;
302 others.delete(tid); 303 others.delete(tid);
303 checkCollisions = true; 304 checkCollisions = true;
304 break; 305 break;
305 } 306 }
306 } 307 }
307 } 308 }
308 }, 309 },
309 310
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 // Parent layout bounds may not be calculated yet, so calculate (but 359 // Parent layout bounds may not be calculated yet, so calculate (but
359 // do not set) them. 360 // do not set) them.
360 var parentBounds = this.calcLayoutBounds_(parent); 361 var parentBounds = this.calcLayoutBounds_(parent);
361 return layout.calculateBounds(parentBounds); 362 return layout.calculateBounds(parentBounds);
362 }, 363 },
363 }; 364 };
364 365
365 // Export 366 // Export
366 return {DisplayLayoutManagerMulti: DisplayLayoutManagerMulti}; 367 return {DisplayLayoutManagerMulti: DisplayLayoutManagerMulti};
367 }); 368 });
OLDNEW
« no previous file with comments | « chrome/browser/resources/options/chromeos/display_layout.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698