Mercurial > hg > orthanc-stone
annotate Platforms/Wasm/wasm-viewport.ts @ 454:50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Fri, 18 Jan 2019 11:52:10 +0100 |
parents | 59b4afa92dee |
children | 3b4df9925db6 7cdb4634846c |
rev | line source |
---|---|
230 | 1 var isPendingRedraw = false; |
229 | 2 |
230 | 3 function ScheduleWebViewportRedraw(cppViewportHandle: any) : void |
4 { | |
5 if (!isPendingRedraw) { | |
6 isPendingRedraw = true; | |
7 console.log('Scheduling a refresh of the viewport, as its content changed'); | |
8 window.requestAnimationFrame(function() { | |
9 isPendingRedraw = false; | |
10 Stone.WasmViewport.GetFromCppViewport(cppViewportHandle).Redraw(); | |
11 }); | |
229 | 12 } |
230 | 13 } |
226 | 14 |
231
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
15 declare function UTF8ToString(any): string; |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
16 |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
17 function CreateWasmViewport(htmlCanvasId: string) : any { |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
18 var cppViewportHandle = CreateCppViewport(); |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
19 var canvasId = UTF8ToString(htmlCanvasId); |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
20 var webViewport = new Stone.WasmViewport(StoneFrameworkModule, canvasId, cppViewportHandle); // viewports are stored in a static map in WasmViewport -> won't be deleted |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
21 webViewport.Initialize(); |
314 | 22 |
231
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
23 return cppViewportHandle; |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
24 } |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
25 |
226 | 26 module Stone { |
27 | |
28 // export declare type InitializationCallback = () => void; | |
29 | |
30 // export declare var StoneFrameworkModule : any; | |
31 | |
32 //const ASSETS_FOLDER : string = "assets/lib"; | |
33 //const WASM_FILENAME : string = "orthanc-framework"; | |
229 | 34 |
226 | 35 export class WasmViewport { |
36 | |
313 | 37 private static viewportsMapByCppHandle_ : Map<number, WasmViewport> = new Map<number, WasmViewport>(); // key = the C++ handle |
38 private static viewportsMapByCanvasId_ : Map<string, WasmViewport> = new Map<string, WasmViewport>(); // key = the canvasId | |
229 | 39 |
226 | 40 private module_ : any; |
41 private canvasId_ : string; | |
42 private htmlCanvas_ : HTMLCanvasElement; | |
43 private context_ : CanvasRenderingContext2D; | |
44 private imageData_ : any = null; | |
45 private renderingBuffer_ : any = null; | |
454
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
46 |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
47 private touchGestureInProgress_: boolean = false; |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
48 private touchCount_: number = 0; |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
49 private touchGestureLastCoordinates_: [number, number][] = []; // last x,y coordinates of each touch |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
50 |
226 | 51 private touchZoom_ : any = false; |
52 private touchTranslation_ : any = false; | |
53 | |
54 private ViewportSetSize : Function; | |
55 private ViewportRender : Function; | |
56 private ViewportMouseDown : Function; | |
57 private ViewportMouseMove : Function; | |
58 private ViewportMouseUp : Function; | |
59 private ViewportMouseEnter : Function; | |
60 private ViewportMouseLeave : Function; | |
61 private ViewportMouseWheel : Function; | |
62 private ViewportKeyPressed : Function; | |
63 | |
227 | 64 private pimpl_ : any; // Private pointer to the underlying WebAssembly C++ object |
65 | |
231
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
66 public constructor(module: any, canvasId: string, cppViewport: any) { |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
67 |
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
68 this.pimpl_ = cppViewport; |
313 | 69 WasmViewport.viewportsMapByCppHandle_[this.pimpl_] = this; |
70 WasmViewport.viewportsMapByCanvasId_[canvasId] = this; | |
231
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
71 |
226 | 72 this.module_ = module; |
73 this.canvasId_ = canvasId; | |
74 this.htmlCanvas_ = document.getElementById(this.canvasId_) as HTMLCanvasElement; | |
244 | 75 if (this.htmlCanvas_ == null) { |
76 console.log("Can not create WasmViewport, did not find the canvas whose id is '", this.canvasId_, "'"); | |
77 } | |
226 | 78 this.context_ = this.htmlCanvas_.getContext('2d'); |
79 | |
234
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
80 this.ViewportSetSize = this.module_.cwrap('ViewportSetSize', null, [ 'number', 'number', 'number' ]); |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
81 this.ViewportRender = this.module_.cwrap('ViewportRender', null, [ 'number', 'number', 'number', 'number' ]); |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
82 this.ViewportMouseDown = this.module_.cwrap('ViewportMouseDown', null, [ 'number', 'number', 'number', 'number', 'number' ]); |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
83 this.ViewportMouseMove = this.module_.cwrap('ViewportMouseMove', null, [ 'number', 'number', 'number' ]); |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
84 this.ViewportMouseUp = this.module_.cwrap('ViewportMouseUp', null, [ 'number' ]); |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
85 this.ViewportMouseEnter = this.module_.cwrap('ViewportMouseEnter', null, [ 'number' ]); |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
86 this.ViewportMouseLeave = this.module_.cwrap('ViewportMouseLeave', null, [ 'number' ]); |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
87 this.ViewportMouseWheel = this.module_.cwrap('ViewportMouseWheel', null, [ 'number', 'number', 'number', 'number', 'number' ]); |
327 | 88 this.ViewportKeyPressed = this.module_.cwrap('ViewportKeyPressed', null, [ 'number', 'number', 'string', 'number', 'number' ]); |
228 | 89 } |
90 | |
234
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
91 public GetCppViewport() : number { |
228 | 92 return this.pimpl_; |
226 | 93 } |
94 | |
234
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
95 public static GetFromCppViewport(cppViewportHandle: number) : WasmViewport { |
313 | 96 if (WasmViewport.viewportsMapByCppHandle_[cppViewportHandle] !== undefined) { |
97 return WasmViewport.viewportsMapByCppHandle_[cppViewportHandle]; | |
98 } | |
99 console.log("WasmViewport not found !"); | |
100 return undefined; | |
101 } | |
102 | |
103 public static GetFromCanvasId(canvasId: string) : WasmViewport { | |
104 if (WasmViewport.viewportsMapByCanvasId_[canvasId] !== undefined) { | |
105 return WasmViewport.viewportsMapByCanvasId_[canvasId]; | |
229 | 106 } |
107 console.log("WasmViewport not found !"); | |
108 return undefined; | |
109 } | |
110 | |
314 | 111 public static ResizeAll() { |
112 for (let canvasId in WasmViewport.viewportsMapByCanvasId_) { | |
113 WasmViewport.viewportsMapByCanvasId_[canvasId].Resize(); | |
114 } | |
115 } | |
116 | |
226 | 117 public Redraw() { |
118 if (this.imageData_ === null || | |
119 this.renderingBuffer_ === null || | |
227 | 120 this.ViewportRender(this.pimpl_, |
121 this.imageData_.width, | |
226 | 122 this.imageData_.height, |
123 this.renderingBuffer_) == 0) { | |
124 console.log('The rendering has failed'); | |
125 } else { | |
126 // Create an accessor to the rendering buffer (i.e. create a | |
127 // "window" above the heap of the WASM module), then copy it to | |
128 // the ImageData object | |
129 this.imageData_.data.set(new Uint8ClampedArray( | |
130 this.module_.buffer, | |
131 this.renderingBuffer_, | |
132 this.imageData_.width * this.imageData_.height * 4)); | |
133 | |
134 this.context_.putImageData(this.imageData_, 0, 0); | |
135 } | |
136 } | |
137 | |
138 public Resize() { | |
139 if (this.imageData_ != null && | |
140 (this.imageData_.width != window.innerWidth || | |
141 this.imageData_.height != window.innerHeight)) { | |
142 this.imageData_ = null; | |
143 } | |
144 | |
420
8bf717c4e497
canvas size is now defined by the parent div size
am@osimis.io
parents:
327
diff
changeset
|
145 // width/height is defined by the parent width/height |
8bf717c4e497
canvas size is now defined by the parent div size
am@osimis.io
parents:
327
diff
changeset
|
146 this.htmlCanvas_.width = this.htmlCanvas_.parentElement.offsetWidth; |
8bf717c4e497
canvas size is now defined by the parent div size
am@osimis.io
parents:
327
diff
changeset
|
147 this.htmlCanvas_.height = this.htmlCanvas_.parentElement.offsetHeight; |
234
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
148 |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
149 console.log("resizing WasmViewport: ", this.htmlCanvas_.width, "x", this.htmlCanvas_.height); |
9afb50d1ac14
configure WasmViewport size relative to window size through html attributes
am@osimis.io
parents:
231
diff
changeset
|
150 |
226 | 151 if (this.imageData_ === null) { |
152 this.imageData_ = this.context_.getImageData(0, 0, this.htmlCanvas_.width, this.htmlCanvas_.height); | |
228 | 153 this.ViewportSetSize(this.pimpl_, this.htmlCanvas_.width, this.htmlCanvas_.height); |
226 | 154 |
155 if (this.renderingBuffer_ != null) { | |
156 this.module_._free(this.renderingBuffer_); | |
157 } | |
158 | |
159 this.renderingBuffer_ = this.module_._malloc(this.imageData_.width * this.imageData_.height * 4); | |
313 | 160 } else { |
161 this.ViewportSetSize(this.pimpl_, this.htmlCanvas_.width, this.htmlCanvas_.height); | |
226 | 162 } |
163 | |
164 this.Redraw(); | |
165 } | |
166 | |
231
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
230
diff
changeset
|
167 public Initialize() { |
227 | 168 |
169 // Force the rendering of the viewport for the first time | |
170 this.Resize(); | |
226 | 171 |
228 | 172 var that : WasmViewport = this; |
227 | 173 // Register an event listener to call the Resize() function |
174 // each time the window is resized. | |
228 | 175 window.addEventListener('resize', function(event) { |
176 that.Resize(); | |
177 }, false); | |
226 | 178 |
227 | 179 this.htmlCanvas_.addEventListener('contextmenu', function(event) { |
180 // Prevent right click on the canvas | |
181 event.preventDefault(); | |
182 }, false); | |
183 | |
184 this.htmlCanvas_.addEventListener('mouseleave', function(event) { | |
228 | 185 that.ViewportMouseLeave(that.pimpl_); |
227 | 186 }); |
187 | |
188 this.htmlCanvas_.addEventListener('mouseenter', function(event) { | |
228 | 189 that.ViewportMouseEnter(that.pimpl_); |
227 | 190 }); |
191 | |
192 this.htmlCanvas_.addEventListener('mousedown', function(event) { | |
193 var x = event.pageX - this.offsetLeft; | |
194 var y = event.pageY - this.offsetTop; | |
454
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
195 that.ViewportMouseDown(that.pimpl_, event.button, x, y, 0 /* TODO detect modifier keys*/); |
227 | 196 }); |
197 | |
198 this.htmlCanvas_.addEventListener('mousemove', function(event) { | |
199 var x = event.pageX - this.offsetLeft; | |
200 var y = event.pageY - this.offsetTop; | |
228 | 201 that.ViewportMouseMove(that.pimpl_, x, y); |
227 | 202 }); |
203 | |
204 this.htmlCanvas_.addEventListener('mouseup', function(event) { | |
228 | 205 that.ViewportMouseUp(that.pimpl_); |
227 | 206 }); |
207 | |
208 window.addEventListener('keydown', function(event) { | |
327 | 209 var keyChar = event.key; |
210 var keyCode = event.keyCode | |
211 if (keyChar.length == 1) { | |
212 keyCode = 0; // maps to OrthancStone::KeyboardKeys_Generic | |
213 } else { | |
214 keyChar = null; | |
215 } | |
216 // console.log("key: ", keyCode, keyChar); | |
217 that.ViewportKeyPressed(that.pimpl_, keyCode, keyChar, event.shiftKey, event.ctrlKey, event.altKey); | |
227 | 218 }); |
226 | 219 |
227 | 220 this.htmlCanvas_.addEventListener('wheel', function(event) { |
221 var x = event.pageX - this.offsetLeft; | |
222 var y = event.pageY - this.offsetTop; | |
228 | 223 that.ViewportMouseWheel(that.pimpl_, event.deltaY, x, y, event.ctrlKey); |
227 | 224 event.preventDefault(); |
225 }); | |
226 | |
227 this.htmlCanvas_.addEventListener('touchstart', function(event) { | |
453
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
228 // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
229 event.preventDefault(); |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
230 event.stopPropagation(); |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
231 |
227 | 232 that.ResetTouch(); |
233 }); | |
234 | |
235 this.htmlCanvas_.addEventListener('touchend', function(event) { | |
453
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
236 // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
237 event.preventDefault(); |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
238 event.stopPropagation(); |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
239 |
227 | 240 that.ResetTouch(); |
241 }); | |
242 | |
454
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
243 this.htmlCanvas_.addEventListener('touchmove', function(event: TouchEvent) { |
453
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
244 |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
245 // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
246 event.preventDefault(); |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
247 event.stopPropagation(); |
59b4afa92dee
TS: stop propagating touch events to the whole html doc
Alain Mazy <alain@mazy.be>
parents:
420
diff
changeset
|
248 |
454
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
249 // if (!that.touchGestureInProgress_) { |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
250 // // starting a new gesture |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
251 // that.touchCount_ = event.targetTouches.length; |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
252 // for (var t = 0; t < event.targetTouches.length; t++) { |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
253 // that.touchGestureLastCoordinates_.push([event.targetTouches[t].pageX, event.targetTouches[t].pageY]); |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
254 // } |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
255 // that.touchGestureInProgress_ = true; |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
256 // } else { |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
257 // // continuing a gesture |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
258 // // TODO: we shall probably forward all touches to the C++ code and let the "interactors/trackers" handle them |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
259 |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
260 // if (that.touchCount_ == 1) { // consider it's a left mouse drag |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
261 |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
262 // } |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
263 // } |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
264 |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
265 // TODO: we shall probably forward all touches to the C++ code and let the "interactors/trackers" handle them |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
266 |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
267 if (that.touchTranslation_.length == 2) { // |
227 | 268 var t = that.GetTouchTranslation(event); |
228 | 269 that.ViewportMouseMove(that.pimpl_, t[0], t[1]); |
227 | 270 } |
271 else if (that.touchZoom_.length == 3) { | |
226 | 272 var z0 = that.touchZoom_; |
227 | 273 var z1 = that.GetTouchZoom(event); |
228 | 274 that.ViewportMouseMove(that.pimpl_, z0[0], z0[1] - z0[2] + z1[2]); |
227 | 275 } |
276 else { | |
277 // Realize the gesture event | |
278 if (event.targetTouches.length == 1) { | |
279 // Exactly one finger inside the canvas => Setup a translation | |
280 that.touchTranslation_ = that.GetTouchTranslation(event); | |
228 | 281 that.ViewportMouseDown(that.pimpl_, |
454
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
282 0 /* left button */, |
227 | 283 that.touchTranslation_[0], |
284 that.touchTranslation_[1], 0); | |
285 } else if (event.targetTouches.length == 2) { | |
286 // Exactly 2 fingers inside the canvas => Setup a pinch/zoom | |
287 that.touchZoom_ = that.GetTouchZoom(event); | |
288 var z0 = that.touchZoom_; | |
228 | 289 that.ViewportMouseDown(that.pimpl_, |
290 2 /* right button */, | |
227 | 291 z0[0], |
292 z0[1], 0); | |
293 } | |
294 } | |
295 }); | |
296 } | |
226 | 297 |
298 public ResetTouch() { | |
227 | 299 if (this.touchTranslation_ || |
300 this.touchZoom_) { | |
228 | 301 this.ViewportMouseUp(this.pimpl_); |
226 | 302 } |
227 | 303 |
304 this.touchTranslation_ = false; | |
305 this.touchZoom_ = false; | |
454
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
306 |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
307 // this.touchGestureInProgress_ = false; |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
308 // this.touchCount_ = 0; |
50229f6eb4cd
TS: one touch drag is not equivalent to left mouse drag instead of middle mouse drag
Alain Mazy <alain@mazy.be>
parents:
453
diff
changeset
|
309 // this.touchGestureLastCoordinates_ = []; |
227 | 310 } |
226 | 311 |
312 public GetTouchTranslation(event) { | |
227 | 313 var touch = event.targetTouches[0]; |
314 return [ | |
315 touch.pageX, | |
316 touch.pageY | |
317 ]; | |
318 } | |
226 | 319 |
320 public GetTouchZoom(event) { | |
227 | 321 var touch1 = event.targetTouches[0]; |
322 var touch2 = event.targetTouches[1]; | |
323 var dx = (touch1.pageX - touch2.pageX); | |
324 var dy = (touch1.pageY - touch2.pageY); | |
325 var d = Math.sqrt(dx * dx + dy * dy); | |
326 return [ | |
327 (touch1.pageX + touch2.pageX) / 2.0, | |
328 (touch1.pageY + touch2.pageY) / 2.0, | |
329 d | |
330 ]; | |
331 } | |
226 | 332 |
227 | 333 } |
226 | 334 } |
335 |