2 * Copyright 2014 The Chromium Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
9 * @extends {WebInspector.Object}
10 * @param {!Element} element
12 WebInspector.TransformController = function(element)
14 this.element = element;
15 element.addEventListener("mousemove", this._onMouseMove.bind(this), false);
16 element.addEventListener("mousedown", this._onMouseDown.bind(this), false);
17 element.addEventListener("mouseup", this._onMouseUp.bind(this), false);
18 element.addEventListener("mousewheel", this._onMouseWheel.bind(this), false);
25 WebInspector.TransformController.Events = {
26 TransformChanged: "TransformChanged"
29 WebInspector.TransformController.prototype = {
31 * @param {function(!Array.<!WebInspector.KeyboardShortcut.Descriptor>, function(?Event=))} registerShortcutDelegate
33 registerShortcuts: function(registerShortcutDelegate)
35 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ResetView, this._resetAndNotify.bind(this));
37 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ZoomIn, this._onKeyboardZoom.bind(this, zoomFactor));
38 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.ZoomOut, this._onKeyboardZoom.bind(this, 1 / zoomFactor));
39 var panDistanceInPixels = 6;
40 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.PanUp, this._onPan.bind(this, 0, -panDistanceInPixels));
41 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.PanDown, this._onPan.bind(this, 0, panDistanceInPixels));
42 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.PanLeft, this._onPan.bind(this, -panDistanceInPixels, 0));
43 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.PanRight, this._onPan.bind(this, panDistanceInPixels, 0));
44 var rotateDegrees = 5;
45 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.RotateCWX, this._onKeyboardRotate.bind(this, rotateDegrees, 0));
46 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.RotateCCWX, this._onKeyboardRotate.bind(this, -rotateDegrees, 0));
47 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.RotateCWY, this._onKeyboardRotate.bind(this, 0, -rotateDegrees));
48 registerShortcutDelegate(WebInspector.ShortcutsScreen.LayersPanelShortcuts.RotateCCWY, this._onKeyboardRotate.bind(this, 0, rotateDegrees));
51 _postChangeEvent: function()
53 this.dispatchEventToListeners(WebInspector.TransformController.Events.TransformChanged);
66 * @param {?Event=} event
68 _resetAndNotify: function(event)
71 this._postChangeEvent();
73 event.preventDefault();
105 return this._rotateX;
113 return this._rotateY;
117 * @param {number} scaleFactor
121 _onScale: function(scaleFactor, x, y)
123 this._scale *= scaleFactor;
124 this._offsetX -= (x - this._offsetX) * (scaleFactor - 1);
125 this._offsetY -= (y - this._offsetY) * (scaleFactor - 1);
126 this._postChangeEvent();
130 * @param {number} offsetX
131 * @param {number} offsetY
133 _onPan: function(offsetX, offsetY)
135 this._offsetX += offsetX;
136 this._offsetY += offsetY;
137 this._postChangeEvent();
141 * @param {number} rotateX
142 * @param {number} rotateY
144 _onRotate: function(rotateX, rotateY)
146 this._rotateX = rotateX;
147 this._rotateY = rotateY;
148 this._postChangeEvent();
152 * @param {number} zoomFactor
154 _onKeyboardZoom: function(zoomFactor)
156 this._onScale(zoomFactor, this.element.clientWidth / 2, this.element.clientHeight / 2);
160 * @param {number} rotateX
161 * @param {number} rotateY
163 _onKeyboardRotate: function(rotateX, rotateY)
165 this._onRotate(this._rotateX + rotateX, this._rotateY + rotateY);
169 * @param {?Event} event
171 _onMouseWheel: function(event)
175 var zoomFactor = 1.1;
177 var mouseWheelZoomSpeed = 1 / 120;
178 var scaleFactor = Math.pow(zoomFactor, event.wheelDeltaY * mouseWheelZoomSpeed);
179 this._onScale(scaleFactor, event.clientX - this.element.totalOffsetLeft(), event.clientY - this.element.totalOffsetTop());
182 var moveFactor = 1 / 20;
183 this._onPan(event.wheelDeltaX * moveFactor, event.wheelDeltaY * moveFactor);
188 * @param {?Event} event
190 _onMouseMove: function(event)
192 if (event.which !== 1 || typeof this._originX !== "number")
194 this._onRotate(this._oldRotateX + (this._originY - event.clientY) / this.element.clientHeight * 180, this._oldRotateY - (this._originX - event.clientX) / this.element.clientWidth * 180);
198 * @param {?Event} event
200 _setReferencePoint: function(event)
202 this._originX = event.clientX;
203 this._originY = event.clientY;
204 this._oldRotateX = this._rotateX;
205 this._oldRotateY = this._rotateY;
208 _resetReferencePoint: function()
210 delete this._originX;
211 delete this._originY;
212 delete this._oldRotateX;
213 delete this._oldRotateY;
217 * @param {?Event} event
219 _onMouseDown: function(event)
221 if (event.which !== 1)
223 this._setReferencePoint(event);
227 * @param {?Event} event
229 _onMouseUp: function(event)
231 if (event.which !== 1)
233 this._resetReferencePoint();
236 __proto__: WebInspector.Object.prototype