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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|