зеркало из https://github.com/mozilla/pjs.git
Bug 521108: Improve pan axis locking [r=vingtetung]
This commit is contained in:
Родитель
51735de3a2
Коммит
1c72f254a4
|
@ -312,7 +312,6 @@ BrowserView.prototype = {
|
||||||
*/
|
*/
|
||||||
getViewportDimensions: function getViewportDimensions() {
|
getViewportDimensions: function getViewportDimensions() {
|
||||||
let bvs = this._browserViewportState;
|
let bvs = this._browserViewportState;
|
||||||
|
|
||||||
if (!bvs)
|
if (!bvs)
|
||||||
throw "Cannot get viewport dimensions when no browser is set";
|
throw "Cannot get viewport dimensions when no browser is set";
|
||||||
|
|
||||||
|
@ -321,12 +320,10 @@ BrowserView.prototype = {
|
||||||
|
|
||||||
setZoomLevel: function setZoomLevel(zoomLevel) {
|
setZoomLevel: function setZoomLevel(zoomLevel) {
|
||||||
let bvs = this._browserViewportState;
|
let bvs = this._browserViewportState;
|
||||||
|
|
||||||
if (!bvs)
|
if (!bvs)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let newZoomLevel = BrowserView.Util.clampZoomLevel(zoomLevel);
|
let newZoomLevel = BrowserView.Util.clampZoomLevel(zoomLevel);
|
||||||
|
|
||||||
if (newZoomLevel != bvs.zoomLevel) {
|
if (newZoomLevel != bvs.zoomLevel) {
|
||||||
let browserW = this.viewportToBrowser(bvs.viewportRect.right);
|
let browserW = this.viewportToBrowser(bvs.viewportRect.right);
|
||||||
let browserH = this.viewportToBrowser(bvs.viewportRect.bottom);
|
let browserH = this.viewportToBrowser(bvs.viewportRect.bottom);
|
||||||
|
@ -466,7 +463,6 @@ BrowserView.prototype = {
|
||||||
}
|
}
|
||||||
|
|
||||||
let oldBrowser = this._browser;
|
let oldBrowser = this._browser;
|
||||||
|
|
||||||
let browserChanged = (oldBrowser !== browser);
|
let browserChanged = (oldBrowser !== browser);
|
||||||
|
|
||||||
if (oldBrowser) {
|
if (oldBrowser) {
|
||||||
|
|
|
@ -49,7 +49,7 @@ const kDoubleClickInterval = 400;
|
||||||
const kMsUntilLock = 50;
|
const kMsUntilLock = 50;
|
||||||
|
|
||||||
// threshold in pixels for sensing a tap as opposed to a pan
|
// threshold in pixels for sensing a tap as opposed to a pan
|
||||||
const kTapRadius = 15;
|
const kTapRadius = 25;
|
||||||
|
|
||||||
// how many milliseconds between each kinetic pan update
|
// how many milliseconds between each kinetic pan update
|
||||||
const kKineticUpdateInterval = 25;
|
const kKineticUpdateInterval = 25;
|
||||||
|
@ -601,16 +601,11 @@ MouseModule.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inform our dragger of a dragStart and update kinetic with new data.
|
* Inform our dragger of a dragStart.
|
||||||
*/
|
*/
|
||||||
_doDragStart: function _doDragStart(event) {
|
_doDragStart: function _doDragStart(event) {
|
||||||
let dragData = this._dragData;
|
let dragData = this._dragData;
|
||||||
|
|
||||||
// addData must be called before setDragStart. Otherwise addData may end kinetic panning and
|
|
||||||
// thus accidentally end the drag we've just begun.
|
|
||||||
this._kinetic.addData(event.screenX, event.screenY);
|
|
||||||
dragData.setDragStart(event.screenX, event.screenY);
|
dragData.setDragStart(event.screenX, event.screenY);
|
||||||
|
|
||||||
this._dragger.dragStart(event.clientX, event.clientY, event.target, this._targetScrollInterface);
|
this._dragger.dragStart(event.clientX, event.clientY, event.target, this._targetScrollInterface);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -886,41 +881,48 @@ DragData.prototype = {
|
||||||
|
|
||||||
// If now a pan, mark previous position where panning was.
|
// If now a pan, mark previous position where panning was.
|
||||||
if (this._isPan) {
|
if (this._isPan) {
|
||||||
let [prevX, prevY] = this._lockAxis(this.sX, this.sY);
|
|
||||||
this.prevPanX = prevX;
|
|
||||||
this.prevPanY = prevY;
|
|
||||||
this.sX = sX;
|
|
||||||
this.sY = sY;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if axes should be locked.
|
|
||||||
if (!this.locked && Date.now() - this._dragStartTime >= kMsUntilLock) {
|
|
||||||
// look at difference from origin coord to lock movement, but only
|
|
||||||
// do it if initial movement is sufficient to detect intent
|
|
||||||
|
|
||||||
// divide possibilty space into eight parts. Diagonals will allow
|
|
||||||
// free movement, while moving towards a cardinal will lock that
|
|
||||||
// axis. We pick a direction if you move more than twice as far
|
|
||||||
// on one axis than another, which should be an angle of about 30
|
|
||||||
// degrees from the axis
|
|
||||||
|
|
||||||
let absX = Math.abs(this._originX - sX);
|
let absX = Math.abs(this._originX - sX);
|
||||||
let absY = Math.abs(this._originY - sY);
|
let absY = Math.abs(this._originY - sY);
|
||||||
|
|
||||||
if (absX > 2 * absY)
|
// After the first lock, see if locking decision should be reverted.
|
||||||
this.lockedY = this._originY;
|
if (this.lockedX && absX > 3 * absY)
|
||||||
else if (absY > 2 * absX)
|
this.lockedX = null;
|
||||||
this.lockedX = this._originX;
|
else if (this.lockedY && absY > 3 * absX)
|
||||||
|
this.lockedY = null;
|
||||||
|
|
||||||
this.locked = true;
|
if (!this.locked) {
|
||||||
|
// look at difference from origin coord to lock movement, but only
|
||||||
|
// do it if initial movement is sufficient to detect intent
|
||||||
|
|
||||||
|
// divide possibilty space into eight parts. Diagonals will allow
|
||||||
|
// free movement, while moving towards a cardinal will lock that
|
||||||
|
// axis. We pick a direction if you move more than twice as far
|
||||||
|
// on one axis than another, which should be an angle of about 30
|
||||||
|
// degrees from the axis
|
||||||
|
|
||||||
|
if (absX > 2.5 * absY)
|
||||||
|
this.lockedY = sY;
|
||||||
|
else if (absY > absX)
|
||||||
|
this.lockedX = sX;
|
||||||
|
|
||||||
|
this.locked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// After pan lock, figure out previous panning position. Base it on last drag
|
||||||
|
// position so there isn't a jump in panning.
|
||||||
|
let [prevX, prevY] = this._lockAxis(this.sX, this.sY);
|
||||||
|
this.prevPanX = prevX;
|
||||||
|
this.prevPanY = prevY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.sX = sX;
|
||||||
|
this.sY = sY;
|
||||||
},
|
},
|
||||||
|
|
||||||
setDragStart: function setDragStart(screenX, screenY) {
|
setDragStart: function setDragStart(screenX, screenY) {
|
||||||
this.sX = this._originX = screenX;
|
this.sX = this._originX = screenX;
|
||||||
this.sY = this._originY = screenY;
|
this.sY = this._originY = screenY;
|
||||||
this.dragging = true;
|
this.dragging = true;
|
||||||
this._dragStartTime = Date.now();
|
|
||||||
this.locked = false;
|
this.locked = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче