diff --git a/browser/base/content/tabcandy/app/trench.js b/browser/base/content/tabcandy/app/trench.js index 05e36988928..c3ed1f24cc4 100644 --- a/browser/base/content/tabcandy/app/trench.js +++ b/browser/base/content/tabcandy/app/trench.js @@ -105,7 +105,23 @@ Trench.prototype = { var xRange = {min: rect.left, max: rect.left + rect.width}; var yRange = {min: rect.top, max: rect.top + rect.height}; - switch (edge) { + var edgeToCheck; + if (this.type == "border") { + if (this.edge == "left") + edgeToCheck = "right"; + else if (this.edge == "right") + edgeToCheck = "left"; + else if (this.edge == "top") + edgeToCheck = "bottom"; + else if (this.edge == "bottom") + edgeToCheck = "top"; + } else if (this.type == "guide") { + edgeToCheck = this.edge; + } + + rect.adjustedEdge = edgeToCheck; + + switch (edgeToCheck) { case "left": if (this.ruleOverlaps(rect.left, yRange)) { rect.left = this.position; @@ -178,44 +194,13 @@ var Trenches = { delete self.trenches[id]; }); }, - comparePosition: function Trenches_comparePosition(a,b) { - return a.position - b.position; - }, activateOthersTrenches: function Trenches_activateOthersTrenches(element) { - var aT = this.activeTrenches; - aT.left = []; - aT.right = []; - aT.top = []; - aT.bottom = []; - this.safeRegionCache = {left:{},right:{},top:{},bottom:{}}; this.trenches.forEach(function(t) { if (t.el === element) return; t.active = true; t.show(); // debug - - var relevantEdge; - if (t.type == "border") { - if (t.edge == "left") - relevantEdge = "right"; - else if (t.edge == "right") - relevantEdge = "left"; - else if (t.edge == "top") - relevantEdge = "bottom"; - else if (t.edge == "bottom") - relevantEdge = "top"; - } else if (t.type == "guide" || t.type == "barrier") { - relevantEdge = t.edge; - } - - aT[relevantEdge].push({id: t.id, position: t.position, toString: function(){return '' + t.id + ':' + t.position}}); - }); - - aT.left.sort(this.comparePosition); - aT.right.sort(this.comparePosition); - aT.top.sort(this.comparePosition); - aT.bottom.sort(this.comparePosition); }, disactivate: function Trenches_disactivate() { this.trenches.forEach(function(t) { @@ -223,74 +208,6 @@ var Trenches = { t.show(); }); }, - snapEdge: function Trenches_snapEdge(rect,edge,assumeConstantSize,keepProportional) { - - var aT = this.activeTrenches; - - var position; - switch (edge) { - case 'left': - position = rect.left; break; - case 'right': - position = rect.left + rect.width; break; - case 'top': - position = rect.top; break; - case 'bottom': - position = rect.top + rect.height; break; - } - - var safeRegionCache = this.safeRegionCache; - - if ('min' in safeRegionCache[edge] && 'max' in safeRegionCache[edge]) { - if (safeRegionCache[edge].min < position && position < safeRegionCache[edge].max) { - return false; - } - } - - // Find the relevant trenches to compare to: - // What we're doing here is planting a "rat" within the ordered list of edges that matter - // We then sort the resulting array, use indexOf on the rat, and figure out which trenches - // are closest to the edge in question. - var rat = {id:'rat',position:position}; - var index = aT[edge].concat(rat).sort(this.comparePosition).indexOf(rat); - - // Now we know to check aT[edge][index-1] and aT[edge][index] - - var newRect; - var updated = false; - if (index-1 >= 0) { - var trench = this.getById(aT[edge][index-1].id); - newRect = trench.rectOverlaps(rect,edge,assumeConstantSize,keepProportional); - if (newRect) { - rect = newRect; - updated = true; - delete safeRegionCache[edge].min; - } else { - safeRegionCache[edge].min = trench.position + trench.radius; - } - } else { - safeRegionCache[edge].min = -10; - } - if (index < aT[edge].length) { - var trench = this.getById(aT[edge][index].id); - newRect = trench.rectOverlaps(rect,edge,assumeConstantSize,keepProportional); - if (newRect) { - rect = newRect; - updated = true; - delete safeRegionCache[edge].max; - } else { - safeRegionCache[edge].max = trench.position - trench.radius; - } - } else { - safeRegionCache[edge].max = Infinity; - } - - if (updated) - return rect; - else - return false; - - }, snap: function Trenches_snap(rect,assumeConstantSize,keepProportional) { var aT = this.activeTrenches; @@ -298,39 +215,38 @@ var Trenches = { var updatedX = false; var updatedY = false; - var newRect; - newRect = this.snapEdge(rect,(this.preferLeft?'left':'right'),assumeConstantSize,keepProportional); - if (newRect) { - rect = newRect; - updated = true; - updatedX = true; - } - - if (!assumeConstantSize || !updatedX) { - newRect = this.snapEdge(rect,(this.preferLeft?'right':'left'),assumeConstantSize,keepProportional); + for (let i in this.trenches) { + var t = this.trenches[i]; + if (!t.active) + continue; + // newRect will be a new rect, or false + var newRect = t.rectOverlaps(rect,assumeConstantSize,keepProportional); + if (newRect) { - rect = newRect; - updated = true; - updatedX = true; + if (assumeConstantSize && updatedX && updatedY) + break; + if (assumeConstantSize && updatedX && (newRect.adjustedEdge == "left"||newRect.adjustedEdge == "right")) + continue; + if (assumeConstantSize && updatedY && (newRect.adjustedEdge == "top"||newRect.adjustedEdge == "bottom")) + continue; + rect = newRect; + updated = true; + + // if updatedX, we don't need to update x any more. + if (newRect.adjustedEdge == "left" && this.preferLeft) + updatedX = true; + if (newRect.adjustedEdge == "right" && !this.preferLeft) + updatedX = true; + + // if updatedY, we don't need to update x any more. + if (newRect.adjustedEdge == "top" && this.preferTop) + updatedY = true; + if (newRect.adjustedEdge == "bottom" && !this.preferTop) + updatedY = true; + } - } - - newRect = this.snapEdge(rect,(this.preferTop?'top':'bottom'),assumeConstantSize,keepProportional); - if (newRect) { - rect = newRect; - updated = true; - updatedY = true; - } - - if (!assumeConstantSize || !updatedY) { - newRect = this.snapEdge(rect,(this.preferTop?'bottom':'top'),assumeConstantSize,keepProportional); - if (newRect) { - rect = newRect; - updated = true; - updatedY = true; - } - } - + } + if (updated) return rect; else