forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			327 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			327 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.input; | ||
|  | 
 | ||
|  | import kha.netsync.Controller; | ||
|  | 
 | ||
|  | /** See `Mouse.setWheelEventBlockBehavior` */ | ||
|  | enum MouseEventBlockBehavior { | ||
|  | 	Full; | ||
|  | 	None; | ||
|  | 	Custom(func: (event: Dynamic) -> Bool); | ||
|  | } | ||
|  | 
 | ||
|  | enum MouseCursor { | ||
|  | 	Default; | ||
|  | 	Pointer; | ||
|  | 	Text; | ||
|  | 	EastWestResize; | ||
|  | 	NorthSouthResize; | ||
|  | 	NorthEastResize; | ||
|  | 	SouthEastResize; | ||
|  | 	NorthWestResize; | ||
|  | 	SouthWestResize; | ||
|  | 	Grab; | ||
|  | 	Grabbing; | ||
|  | 	NotAllowed; | ||
|  | 	Wait; | ||
|  | 	Crosshair; | ||
|  | 	Custom(image: kha.Image); | ||
|  | } | ||
|  | 
 | ||
|  | @:allow(kha.SystemImpl) | ||
|  | @:expose | ||
|  | class Mouse extends Controller { | ||
|  | 	static var wheelEventBlockBehavior = MouseEventBlockBehavior.Full; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Get current Mouse. | ||
|  | 	 * @param num (optional) mouse id (0 by default). | ||
|  | 	 */ | ||
|  | 	public static function get(num: Int = 0): Mouse { | ||
|  | 		return SystemImpl.getMouse(num); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Allows fine grained control of mouse wheel browser default actions (html5 only). | ||
|  | 	 * @param behavior can be: | ||
|  | 	 *   Full - block wheel events. | ||
|  | 	 *   None - do not block wheel events. | ||
|  | 	 *   Custom(func:(event:WheelEvent)->Bool) - set custom handler for wheel event (should return true if wheel event blocked). | ||
|  | 	 */ | ||
|  | 	public static function setWheelEventBlockBehavior(behavior: MouseEventBlockBehavior): Void { | ||
|  | 		wheelEventBlockBehavior = behavior; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Creates event handlers from passed functions. | ||
|  | 	 * @param downListener (optional) function with `button:Int`,`x:Int`,`y:Int` arguments, fired when a mouse is pressed down. `button:Int` is `0` for left button, `1` for right and `2` for middle. | ||
|  | 	 * @param upListener (optional) function with `button:Int`,`x:Int`,`y:Int` arguments, fired when a mouse is released. | ||
|  | 	 * @param moveListener (optional) function with `x:Int`,`y:Int`,`moveX:Int`,`moveY:Int` arguments, fired when a mouse is moved. `moveX`/`moveY` is the difference between the current coordinates and the last position of the mouse. | ||
|  | 	 * @param wheelListener (optional) function with `delta:Int` argument, fired when the wheel rotates. It can have a value of `1` or `-1` depending on the rotation. | ||
|  | 	 * @param leaveListener (optional) function without` arguments, when fired mouse leave canvas. | ||
|  | 	 */ | ||
|  | 	public function notify(?downListener: (button: Int, x: Int, y: Int) -> Void, ?upListener: (button: Int, x: Int, y: Int) -> Void, | ||
|  | 			?moveListener: (x: Int, y: Int, moveX: Int, moveY: Int) -> Void, ?wheelListener: (delta: Int) -> Void, ?leaveListener: () -> Void = null): Void { | ||
|  | 		notifyWindowed(0, downListener, upListener, moveListener, wheelListener, leaveListener); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Removes event handlers from the passed functions that were passed to `notify` function. | ||
|  | 	 */ | ||
|  | 	public function remove(?downListener: (button: Int, x: Int, y: Int) -> Void, ?upListener: (button: Int, x: Int, y: Int) -> Void, | ||
|  | 			?moveListener: (x: Int, y: Int, moveX: Int, moveY: Int) -> Void, ?wheelListener: (delta: Int) -> Void, ?leaveListener: () -> Void = null): Void { | ||
|  | 		removeWindowed(0, downListener, upListener, moveListener, wheelListener, leaveListener); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * 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->Int->Void, ?upListener: Int->Int->Int->Void, | ||
|  | 			?moveListener: Int->Int->Int->Int->Void, ?wheelListener: Int->Void, ?leaveListener: Void->Void = null): Void { | ||
|  | 		if (downListener != null) { | ||
|  | 			if (windowDownListeners == null) { | ||
|  | 				windowDownListeners = new Array(); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			while (windowDownListeners.length <= windowId) { | ||
|  | 				windowDownListeners.push(new Array()); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			windowDownListeners[windowId].push(downListener); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (upListener != null) { | ||
|  | 			if (windowUpListeners == null) { | ||
|  | 				windowUpListeners = new Array(); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			while (windowUpListeners.length <= windowId) { | ||
|  | 				windowUpListeners.push(new Array()); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			windowUpListeners[windowId].push(upListener); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (moveListener != null) { | ||
|  | 			if (windowMoveListeners == null) { | ||
|  | 				windowMoveListeners = new Array(); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			while (windowMoveListeners.length <= windowId) { | ||
|  | 				windowMoveListeners.push(new Array()); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			windowMoveListeners[windowId].push(moveListener); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (wheelListener != null) { | ||
|  | 			if (windowWheelListeners == null) { | ||
|  | 				windowWheelListeners = new Array(); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			while (windowWheelListeners.length <= windowId) { | ||
|  | 				windowWheelListeners.push(new Array()); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			windowWheelListeners[windowId].push(wheelListener); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (leaveListener != null) { | ||
|  | 			if (windowLeaveListeners == null) { | ||
|  | 				windowLeaveListeners = new Array(); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			while (windowLeaveListeners.length <= windowId) { | ||
|  | 				windowLeaveListeners.push(new Array()); | ||
|  | 			} | ||
|  | 
 | ||
|  | 			windowLeaveListeners[windowId].push(leaveListener); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Removes event handlers for `windowId:Int` from the passed functions that were passed to `notifyWindowed` function. | ||
|  | 	 */ | ||
|  | 	public function removeWindowed(windowId: Int, ?downListener: Int->Int->Int->Void, ?upListener: Int->Int->Int->Void, | ||
|  | 			?moveListener: Int->Int->Int->Int->Void, ?wheelListener: Int->Void, ?leaveListener: Void->Void = null): Void { | ||
|  | 		if (downListener != null) { | ||
|  | 			if (windowDownListeners != null) { | ||
|  | 				if (windowId < windowDownListeners.length) { | ||
|  | 					windowDownListeners[windowId].remove(downListener); | ||
|  | 				} | ||
|  | 				else { | ||
|  | 					trace('no downListeners for window "${windowId}" are registered'); | ||
|  | 				} | ||
|  | 			} | ||
|  | 			else { | ||
|  | 				trace('no downListeners were ever registered'); | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (upListener != null) { | ||
|  | 			if (windowUpListeners != null) { | ||
|  | 				if (windowId < windowUpListeners.length) { | ||
|  | 					windowUpListeners[windowId].remove(upListener); | ||
|  | 				} | ||
|  | 				else { | ||
|  | 					trace('no upListeners for window "${windowId}" are registered'); | ||
|  | 				} | ||
|  | 			} | ||
|  | 			else { | ||
|  | 				trace('no upListeners were ever registered'); | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (moveListener != null) { | ||
|  | 			if (windowMoveListeners != null) { | ||
|  | 				if (windowId < windowMoveListeners.length) { | ||
|  | 					windowMoveListeners[windowId].remove(moveListener); | ||
|  | 				} | ||
|  | 				else { | ||
|  | 					trace('no moveListeners for window "${windowId}" are registered'); | ||
|  | 				} | ||
|  | 			} | ||
|  | 			else { | ||
|  | 				trace('no moveListeners were ever registered'); | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (wheelListener != null) { | ||
|  | 			if (windowWheelListeners != null) { | ||
|  | 				if (windowId < windowWheelListeners.length) { | ||
|  | 					windowWheelListeners[windowId].remove(wheelListener); | ||
|  | 				} | ||
|  | 				else { | ||
|  | 					trace('no wheelListeners for window "${windowId}" are registered'); | ||
|  | 				} | ||
|  | 			} | ||
|  | 			else { | ||
|  | 				trace('no wheelListeners were ever registered'); | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (leaveListener != null) { | ||
|  | 			if (windowLeaveListeners != null) { | ||
|  | 				if (windowId < windowLeaveListeners.length) { | ||
|  | 					windowLeaveListeners[windowId].remove(leaveListener); | ||
|  | 				} | ||
|  | 				else { | ||
|  | 					trace('no leaveListeners for window "${windowId}" are registered'); | ||
|  | 				} | ||
|  | 			} | ||
|  | 			else { | ||
|  | 				trace('no leaveListeners were ever registered'); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Locks the cursor position and hides it. For catching movements, use the `moveX`/`moveY` arguments of your `moveListener` handler. | ||
|  | 	 */ | ||
|  | 	public function lock(): Void {} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Unlock the cursor position and hides it. For catching movements, use the `moveX`/`moveY` arguments of your `moveListener` handler. | ||
|  | 	 */ | ||
|  | 	public function unlock(): Void {} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Unlocks the cursor position and displays it. | ||
|  | 	 */ | ||
|  | 	public function canLock(): Bool { | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Returns the status of the cursor lock | ||
|  | 	 */ | ||
|  | 	public function isLocked(): Bool { | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Creates event handlers from passed functions. | ||
|  | 	 * @param change function fired when the lock is turned on / off. | ||
|  | 	 * @param error function fired when a toggle error occurs. | ||
|  | 	 */ | ||
|  | 	public function notifyOnLockChange(change: Void->Void, error: Void->Void): Void {} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Removes event handlers from the passed functions that were passed to `notifyOnLockChange` function. | ||
|  | 	 */ | ||
|  | 	public function removeFromLockChange(change: Void->Void, error: Void->Void): Void {} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Hides the system cursor (without locking) | ||
|  | 	 */ | ||
|  | 	public function hideSystemCursor(): Void {} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Show the system cursor | ||
|  | 	 */ | ||
|  | 	public function showSystemCursor(): Void {} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Set the native system cursor | ||
|  | 	 * @param cursor The native cursor to show. | ||
|  | 	 */ | ||
|  | 	public function setSystemCursor(cursor: MouseCursor): Void {} | ||
|  | 
 | ||
|  | 	static var instance: Mouse; | ||
|  | 
 | ||
|  | 	var windowDownListeners: Array<Array<Int->Int->Int->Void>>; | ||
|  | 	var windowUpListeners: Array<Array<Int->Int->Int->Void>>; | ||
|  | 	var windowMoveListeners: Array<Array<Int->Int->Int->Int->Void>>; | ||
|  | 	var windowWheelListeners: Array<Array<Int->Void>>; | ||
|  | 	var windowLeaveListeners: Array<Array<Void->Void>>; | ||
|  | 
 | ||
|  | 	function new() { | ||
|  | 		super(); | ||
|  | 		instance = this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@input | ||
|  | 	function sendLeaveEvent(windowId: Int): Void { | ||
|  | 		if (windowLeaveListeners != null) { | ||
|  | 			for (listener in windowLeaveListeners[windowId]) { | ||
|  | 				listener(); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@input | ||
|  | 	function sendDownEvent(windowId: Int, button: Int, x: Int, y: Int): Void { | ||
|  | 		if (windowDownListeners != null) { | ||
|  | 			for (listener in windowDownListeners[windowId]) { | ||
|  | 				listener(button, x, y); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@input | ||
|  | 	function sendUpEvent(windowId: Int, button: Int, x: Int, y: Int): Void { | ||
|  | 		if (windowUpListeners != null) { | ||
|  | 			for (listener in windowUpListeners[windowId]) { | ||
|  | 				listener(button, x, y); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@input | ||
|  | 	function sendMoveEvent(windowId: Int, x: Int, y: Int, movementX: Int, movementY: Int): Void { | ||
|  | 		if (windowMoveListeners != null) { | ||
|  | 			for (listener in windowMoveListeners[windowId]) { | ||
|  | 				listener(x, y, movementX, movementY); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@input | ||
|  | 	function sendWheelEvent(windowId: Int, delta: Int): Void { | ||
|  | 		if (windowWheelListeners != null) { | ||
|  | 			for (listener in windowWheelListeners[windowId]) { | ||
|  | 				listener(delta); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | } |