231 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			231 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.input;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:allow(kha.SystemImpl)
							 | 
						||
| 
								 | 
							
								class Pen {
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Get current Pen.
							 | 
						||
| 
								 | 
							
									 * @param num (optional) pen id (0 by default).
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public static function get(num: Int = 0): Pen {
							 | 
						||
| 
								 | 
							
										return SystemImpl.getPen(num);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Creates event handlers from passed functions.
							 | 
						||
| 
								 | 
							
									 * @param downListener (optional) function with `x:Int`,`y:Int`,`pressure:Float` arguments, fired when a pen is pressed down. `pressure` is force of pressure on the screen in the range from `0` to `1`.
							 | 
						||
| 
								 | 
							
									 * @param upListener (optional) function with `x:Int`,`y:Int`,`pressure:Float` arguments, fired when a pen is released.
							 | 
						||
| 
								 | 
							
									 * @param moveListener (optional) function with `x:Int`,`y:Int`,`pressure:Float` arguments, fired when a pen is moved.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function notify(?downListener: Int->Int->Float->Void, ?upListener: Int->Int->Float->Void, ?moveListener: Int->Int->Float->Void): Void {
							 | 
						||
| 
								 | 
							
										notifyWindowed(0, downListener, upListener, moveListener);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Creates event handlers from passed functions specific to the pen's eraser.
							 | 
						||
| 
								 | 
							
									 * @param downListener function with `x:Int`,`y:Int`,`pressure:Float` arguments, fired when an eraser is pressed down. `pressure` is force of pressure on the screen in the range from `0` to `1`.
							 | 
						||
| 
								 | 
							
									 * @param upListener function with `x:Int`,`y:Int`,`pressure:Float` arguments, fired when an eraser is released.
							 | 
						||
| 
								 | 
							
									 * @param moveListener function with `x:Int`,`y:Int`,`pressure:Float` arguments, fired when an eraser is moved.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function notifyEraser(eraserDownListener: Int->Int->Float->Void, eraserUpListener: Int->Int->Float->Void,
							 | 
						||
| 
								 | 
							
											eraserMoveListener: Int->Int->Float->Void): Void {
							 | 
						||
| 
								 | 
							
										notifyEraserWindowed(0, eraserDownListener, eraserUpListener, eraserMoveListener);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Removes event handlers from the passed functions that were passed to `notify` function.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function remove(?downListener: Int->Int->Float->Void, ?upListener: Int->Int->Float->Void, ?moveListener: Int->Int->Float->Void): Void {
							 | 
						||
| 
								 | 
							
										removeWindowed(0, downListener, upListener, moveListener);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Removes event handlers from the passed functions that were passed to `notifyEraser` function.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function removeEraser(eraserDownListener: Int->Int->Float->Void, eraserUpListener: Int->Int->Float->Void,
							 | 
						||
| 
								 | 
							
											eraserMoveListener: Int->Int->Float->Void): Void {
							 | 
						||
| 
								 | 
							
										removeEraserWindowed(0, eraserDownListener, eraserUpListener, eraserMoveListener);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Creates event handlers from passed functions like `notify` function, but only for window with `windowId:Int` id argument. The windows are not supported by all the targets.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function notifyWindowed(windowId: Int, ?downListener: Int->Int->Float->Void, ?upListener: Int->Int->Float->Void,
							 | 
						||
| 
								 | 
							
											?moveListener: Int->Int->Float->Void): Void {
							 | 
						||
| 
								 | 
							
										if (downListener != null) {
							 | 
						||
| 
								 | 
							
											if (windowDownListeners == null) {
							 | 
						||
| 
								 | 
							
												windowDownListeners = [];
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											while (windowDownListeners.length <= windowId) {
							 | 
						||
| 
								 | 
							
												windowDownListeners.push([]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											windowDownListeners[windowId].push(downListener);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (upListener != null) {
							 | 
						||
| 
								 | 
							
											if (windowUpListeners == null) {
							 | 
						||
| 
								 | 
							
												windowUpListeners = [];
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											while (windowUpListeners.length <= windowId) {
							 | 
						||
| 
								 | 
							
												windowUpListeners.push([]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											windowUpListeners[windowId].push(upListener);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (moveListener != null) {
							 | 
						||
| 
								 | 
							
											if (windowMoveListeners == null) {
							 | 
						||
| 
								 | 
							
												windowMoveListeners = [];
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											while (windowMoveListeners.length <= windowId) {
							 | 
						||
| 
								 | 
							
												windowMoveListeners.push([]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											windowMoveListeners[windowId].push(moveListener);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Creates event handlers from passed functions like `notifyEraser` function, but only for window with `windowId:Int` id argument. The windows are not supported by all the targets.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function notifyEraserWindowed(windowId: Int, eraserDownListener: Int->Int->Float->Void, eraserUpListener: Int->Int->Float->Void,
							 | 
						||
| 
								 | 
							
											eraserMoveListener: Int->Int->Float->Void): Void {
							 | 
						||
| 
								 | 
							
										if (eraserDownListener != null) {
							 | 
						||
| 
								 | 
							
											if (windowEraserDownListeners == null) {
							 | 
						||
| 
								 | 
							
												windowEraserDownListeners = [];
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											while (windowEraserDownListeners.length <= windowId) {
							 | 
						||
| 
								 | 
							
												windowEraserDownListeners.push([]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											windowEraserDownListeners[windowId].push(eraserDownListener);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (eraserUpListener != null) {
							 | 
						||
| 
								 | 
							
											if (windowEraserUpListeners == null) {
							 | 
						||
| 
								 | 
							
												windowEraserUpListeners = [];
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											while (windowEraserUpListeners.length <= windowId) {
							 | 
						||
| 
								 | 
							
												windowEraserUpListeners.push([]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											windowEraserUpListeners[windowId].push(eraserUpListener);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (eraserMoveListener != null) {
							 | 
						||
| 
								 | 
							
											if (windowEraserMoveListeners == null) {
							 | 
						||
| 
								 | 
							
												windowEraserMoveListeners = [];
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											while (windowEraserMoveListeners.length <= windowId) {
							 | 
						||
| 
								 | 
							
												windowEraserMoveListeners.push([]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											windowEraserMoveListeners[windowId].push(eraserMoveListener);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Removes event handlers for `windowId:Int` from the passed functions that were passed to `notifyWindowed` function.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function removeWindowed(windowId: Int, ?downListener: Int->Int->Float->Void, ?upListener: Int->Int->Float->Void,
							 | 
						||
| 
								 | 
							
											?moveListener: Int->Int->Float->Void): Void {
							 | 
						||
| 
								 | 
							
										if (downListener != null && windowDownListeners != null) {
							 | 
						||
| 
								 | 
							
											if (windowId < windowDownListeners.length) {
							 | 
						||
| 
								 | 
							
												windowDownListeners[windowId].remove(downListener);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (upListener != null && windowUpListeners != null) {
							 | 
						||
| 
								 | 
							
											if (windowId < windowUpListeners.length) {
							 | 
						||
| 
								 | 
							
												windowUpListeners[windowId].remove(upListener);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (moveListener != null && windowMoveListeners != null) {
							 | 
						||
| 
								 | 
							
											if (windowId < windowMoveListeners.length) {
							 | 
						||
| 
								 | 
							
												windowMoveListeners[windowId].remove(moveListener);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Removes event handlers for `windowId:Int` from the passed functions that were passed to `notifyEraserWindowed` function.
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public function removeEraserWindowed(windowId: Int, eraserDownListener: Int->Int->Float->Void, eraserUpListener: Int->Int->Float->Void,
							 | 
						||
| 
								 | 
							
											eraserMoveListener: Int->Int->Float->Void): Void {
							 | 
						||
| 
								 | 
							
										if (eraserDownListener != null && windowEraserDownListeners != null) {
							 | 
						||
| 
								 | 
							
											if (windowId < windowEraserDownListeners.length) {
							 | 
						||
| 
								 | 
							
												windowEraserDownListeners[windowId].remove(eraserDownListener);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (eraserUpListener != null && windowEraserUpListeners != null) {
							 | 
						||
| 
								 | 
							
											if (windowId < windowEraserUpListeners.length) {
							 | 
						||
| 
								 | 
							
												windowEraserUpListeners[windowId].remove(eraserUpListener);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (eraserMoveListener != null && windowEraserMoveListeners != null) {
							 | 
						||
| 
								 | 
							
											if (windowId < windowEraserMoveListeners.length) {
							 | 
						||
| 
								 | 
							
												windowEraserMoveListeners[windowId].remove(eraserMoveListener);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static var instance: Pen;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var windowDownListeners: Array<Array<Int->Int->Float->Void>>;
							 | 
						||
| 
								 | 
							
									var windowUpListeners: Array<Array<Int->Int->Float->Void>>;
							 | 
						||
| 
								 | 
							
									var windowMoveListeners: Array<Array<Int->Int->Float->Void>>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var windowEraserDownListeners: Array<Array<Int->Int->Float->Void>>;
							 | 
						||
| 
								 | 
							
									var windowEraserUpListeners: Array<Array<Int->Int->Float->Void>>;
							 | 
						||
| 
								 | 
							
									var windowEraserMoveListeners: Array<Array<Int->Int->Float->Void>>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function new() {
							 | 
						||
| 
								 | 
							
										instance = this;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function sendDownEvent(windowId: Int, x: Int, y: Int, pressure: Float): Void {
							 | 
						||
| 
								 | 
							
										if (windowDownListeners != null) {
							 | 
						||
| 
								 | 
							
											for (listener in windowDownListeners[windowId]) {
							 | 
						||
| 
								 | 
							
												listener(x, y, pressure);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function sendUpEvent(windowId: Int, x: Int, y: Int, pressure: Float): Void {
							 | 
						||
| 
								 | 
							
										if (windowUpListeners != null) {
							 | 
						||
| 
								 | 
							
											for (listener in windowUpListeners[windowId]) {
							 | 
						||
| 
								 | 
							
												listener(x, y, pressure);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function sendMoveEvent(windowId: Int, x: Int, y: Int, pressure: Float): Void {
							 | 
						||
| 
								 | 
							
										if (windowMoveListeners != null) {
							 | 
						||
| 
								 | 
							
											for (listener in windowMoveListeners[windowId]) {
							 | 
						||
| 
								 | 
							
												listener(x, y, pressure);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function sendEraserDownEvent(windowId: Int, x: Int, y: Int, pressure: Float): Void {
							 | 
						||
| 
								 | 
							
										if (windowEraserDownListeners != null) {
							 | 
						||
| 
								 | 
							
											for (listener in windowEraserDownListeners[windowId]) {
							 | 
						||
| 
								 | 
							
												listener(x, y, pressure);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function sendEraserUpEvent(windowId: Int, x: Int, y: Int, pressure: Float): Void {
							 | 
						||
| 
								 | 
							
										if (windowEraserUpListeners != null) {
							 | 
						||
| 
								 | 
							
											for (listener in windowEraserUpListeners[windowId]) {
							 | 
						||
| 
								 | 
							
												listener(x, y, pressure);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function sendEraserMoveEvent(windowId: Int, x: Int, y: Int, pressure: Float): Void {
							 | 
						||
| 
								 | 
							
										if (windowEraserMoveListeners != null) {
							 | 
						||
| 
								 | 
							
											for (listener in windowEraserMoveListeners[windowId]) {
							 | 
						||
| 
								 | 
							
												listener(x, y, pressure);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |