mirror of
https://github.com/FunkinCrew/Funkin.git
synced 2024-11-24 00:27:59 -05:00
530 lines
15 KiB
Haxe
530 lines
15 KiB
Haxe
package funkin.input;
|
|
|
|
import openfl.utils.Assets;
|
|
import lime.app.Future;
|
|
import openfl.display.BitmapData;
|
|
|
|
@:nullSafety
|
|
class Cursor
|
|
{
|
|
/**
|
|
* The current cursor mode.
|
|
* Set this value to change the cursor graphic.
|
|
*/
|
|
public static var cursorMode(default, set):Null<CursorMode> = null;
|
|
|
|
/**
|
|
* Show the cursor.
|
|
*/
|
|
public static inline function show():Void
|
|
{
|
|
FlxG.mouse.visible = true;
|
|
// Reset the cursor mode.
|
|
Cursor.cursorMode = Default;
|
|
}
|
|
|
|
/**
|
|
* Hide the cursor.
|
|
*/
|
|
public static inline function hide():Void
|
|
{
|
|
FlxG.mouse.visible = false;
|
|
// Reset the cursor mode.
|
|
Cursor.cursorMode = null;
|
|
}
|
|
|
|
static final CURSOR_DEFAULT_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-default.png",
|
|
scale: 1.0,
|
|
offsetX: 0,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorDefault:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_CROSS_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-cross.png",
|
|
scale: 1.0,
|
|
offsetX: 0,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorCross:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_ERASER_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-eraser.png",
|
|
scale: 1.0,
|
|
offsetX: 0,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorEraser:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_GRABBING_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-grabbing.png",
|
|
scale: 1.0,
|
|
offsetX: -8,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorGrabbing:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_HOURGLASS_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-hourglass.png",
|
|
scale: 1.0,
|
|
offsetX: 0,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorHourglass:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_POINTER_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-pointer.png",
|
|
scale: 1.0,
|
|
offsetX: -8,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorPointer:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_TEXT_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-text.png",
|
|
scale: 0.2,
|
|
offsetX: 0,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorText:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_TEXT_VERTICAL_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-text-vertical.png",
|
|
scale: 0.2,
|
|
offsetX: 0,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorTextVertical:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_ZOOM_IN_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-zoom-in.png",
|
|
scale: 1.0,
|
|
offsetX: 0,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorZoomIn:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_ZOOM_OUT_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-zoom-out.png",
|
|
scale: 1.0,
|
|
offsetX: 0,
|
|
offsetY: 0,
|
|
};
|
|
static var assetCursorZoomOut:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_CROSSHAIR_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-crosshair.png",
|
|
scale: 1.0,
|
|
offsetX: -16,
|
|
offsetY: -16,
|
|
};
|
|
static var assetCursorCrosshair:Null<BitmapData> = null;
|
|
|
|
static final CURSOR_CELL_PARAMS:CursorParams =
|
|
{
|
|
graphic: "assets/images/cursor/cursor-cell.png",
|
|
scale: 1.0,
|
|
offsetX: -16,
|
|
offsetY: -16,
|
|
};
|
|
static var assetCursorCell:Null<BitmapData> = null;
|
|
|
|
// DESIRED CURSOR: Resize NS (vertical)
|
|
// DESIRED CURSOR: Resize EW (horizontal)
|
|
// DESIRED CURSOR: Resize NESW (diagonal)
|
|
// DESIRED CURSOR: Resize NWSE (diagonal)
|
|
// DESIRED CURSOR: Help (Cursor with question mark)
|
|
// DESIRED CURSOR: Menu (Cursor with menu icon)
|
|
|
|
static function set_cursorMode(value:Null<CursorMode>):Null<CursorMode>
|
|
{
|
|
if (value != null && cursorMode != value)
|
|
{
|
|
cursorMode = value;
|
|
setCursorGraphic(cursorMode);
|
|
}
|
|
return cursorMode;
|
|
}
|
|
|
|
/**
|
|
* Synchronous.
|
|
*/
|
|
static function setCursorGraphic(?value:CursorMode = null):Void
|
|
{
|
|
if (value == null)
|
|
{
|
|
FlxG.mouse.unload();
|
|
return;
|
|
}
|
|
|
|
switch (value)
|
|
{
|
|
case Default:
|
|
if (assetCursorDefault == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_DEFAULT_PARAMS.graphic);
|
|
assetCursorDefault = bitmapData;
|
|
applyCursorParams(assetCursorDefault, CURSOR_DEFAULT_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorDefault, CURSOR_DEFAULT_PARAMS);
|
|
}
|
|
|
|
case Cross:
|
|
if (assetCursorCross == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_CROSS_PARAMS.graphic);
|
|
assetCursorCross = bitmapData;
|
|
applyCursorParams(assetCursorCross, CURSOR_CROSS_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorCross, CURSOR_CROSS_PARAMS);
|
|
}
|
|
|
|
case Eraser:
|
|
if (assetCursorEraser == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_ERASER_PARAMS.graphic);
|
|
assetCursorEraser = bitmapData;
|
|
applyCursorParams(assetCursorEraser, CURSOR_ERASER_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorEraser, CURSOR_ERASER_PARAMS);
|
|
}
|
|
|
|
case Grabbing:
|
|
if (assetCursorGrabbing == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_GRABBING_PARAMS.graphic);
|
|
assetCursorGrabbing = bitmapData;
|
|
applyCursorParams(assetCursorGrabbing, CURSOR_GRABBING_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorGrabbing, CURSOR_GRABBING_PARAMS);
|
|
}
|
|
|
|
case Hourglass:
|
|
if (assetCursorHourglass == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_HOURGLASS_PARAMS.graphic);
|
|
assetCursorHourglass = bitmapData;
|
|
applyCursorParams(assetCursorHourglass, CURSOR_HOURGLASS_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorHourglass, CURSOR_HOURGLASS_PARAMS);
|
|
}
|
|
|
|
case Pointer:
|
|
if (assetCursorPointer == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_POINTER_PARAMS.graphic);
|
|
assetCursorPointer = bitmapData;
|
|
applyCursorParams(assetCursorPointer, CURSOR_POINTER_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorPointer, CURSOR_POINTER_PARAMS);
|
|
}
|
|
|
|
case Text:
|
|
if (assetCursorText == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_TEXT_PARAMS.graphic);
|
|
assetCursorText = bitmapData;
|
|
applyCursorParams(assetCursorText, CURSOR_TEXT_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorText, CURSOR_TEXT_PARAMS);
|
|
}
|
|
|
|
case ZoomIn:
|
|
if (assetCursorZoomIn == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_ZOOM_IN_PARAMS.graphic);
|
|
assetCursorZoomIn = bitmapData;
|
|
applyCursorParams(assetCursorZoomIn, CURSOR_ZOOM_IN_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorZoomIn, CURSOR_ZOOM_IN_PARAMS);
|
|
}
|
|
|
|
case ZoomOut:
|
|
if (assetCursorZoomOut == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_ZOOM_OUT_PARAMS.graphic);
|
|
assetCursorZoomOut = bitmapData;
|
|
applyCursorParams(assetCursorZoomOut, CURSOR_ZOOM_OUT_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorZoomOut, CURSOR_ZOOM_OUT_PARAMS);
|
|
}
|
|
|
|
case Crosshair:
|
|
if (assetCursorCrosshair == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_CROSSHAIR_PARAMS.graphic);
|
|
assetCursorCrosshair = bitmapData;
|
|
applyCursorParams(assetCursorCrosshair, CURSOR_CROSSHAIR_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorCrosshair, CURSOR_CROSSHAIR_PARAMS);
|
|
}
|
|
|
|
case Cell:
|
|
if (assetCursorCell == null)
|
|
{
|
|
var bitmapData:BitmapData = Assets.getBitmapData(CURSOR_CELL_PARAMS.graphic);
|
|
assetCursorCell = bitmapData;
|
|
applyCursorParams(assetCursorCell, CURSOR_CELL_PARAMS);
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorCell, CURSOR_CELL_PARAMS);
|
|
}
|
|
|
|
default:
|
|
setCursorGraphic(null);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Asynchronous.
|
|
*/
|
|
static function loadCursorGraphic(?value:CursorMode = null):Void
|
|
{
|
|
if (value == null)
|
|
{
|
|
FlxG.mouse.unload();
|
|
return;
|
|
}
|
|
|
|
switch (value)
|
|
{
|
|
case Default:
|
|
if (assetCursorDefault == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_DEFAULT_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorDefault = bitmapData;
|
|
applyCursorParams(assetCursorDefault, CURSOR_DEFAULT_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Default));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorDefault, CURSOR_DEFAULT_PARAMS);
|
|
}
|
|
|
|
case Cross:
|
|
if (assetCursorCross == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_CROSS_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorCross = bitmapData;
|
|
applyCursorParams(assetCursorCross, CURSOR_CROSS_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Cross));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorCross, CURSOR_CROSS_PARAMS);
|
|
}
|
|
|
|
case Eraser:
|
|
if (assetCursorEraser == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_ERASER_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorEraser = bitmapData;
|
|
applyCursorParams(assetCursorEraser, CURSOR_ERASER_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Eraser));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorEraser, CURSOR_ERASER_PARAMS);
|
|
}
|
|
|
|
case Grabbing:
|
|
if (assetCursorGrabbing == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_GRABBING_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorGrabbing = bitmapData;
|
|
applyCursorParams(assetCursorGrabbing, CURSOR_GRABBING_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Grabbing));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorGrabbing, CURSOR_GRABBING_PARAMS);
|
|
}
|
|
|
|
case Hourglass:
|
|
if (assetCursorHourglass == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_HOURGLASS_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorHourglass = bitmapData;
|
|
applyCursorParams(assetCursorHourglass, CURSOR_HOURGLASS_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Hourglass));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorHourglass, CURSOR_HOURGLASS_PARAMS);
|
|
}
|
|
|
|
case Pointer:
|
|
if (assetCursorPointer == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_POINTER_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorPointer = bitmapData;
|
|
applyCursorParams(assetCursorPointer, CURSOR_POINTER_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Pointer));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorPointer, CURSOR_POINTER_PARAMS);
|
|
}
|
|
|
|
case Text:
|
|
if (assetCursorText == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_TEXT_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorText = bitmapData;
|
|
applyCursorParams(assetCursorText, CURSOR_TEXT_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Text));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorText, CURSOR_TEXT_PARAMS);
|
|
}
|
|
|
|
case ZoomIn:
|
|
if (assetCursorZoomIn == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_ZOOM_IN_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorZoomIn = bitmapData;
|
|
applyCursorParams(assetCursorZoomIn, CURSOR_ZOOM_IN_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(ZoomIn));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorZoomIn, CURSOR_ZOOM_IN_PARAMS);
|
|
}
|
|
|
|
case ZoomOut:
|
|
if (assetCursorZoomOut == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_ZOOM_OUT_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorZoomOut = bitmapData;
|
|
applyCursorParams(assetCursorZoomOut, CURSOR_ZOOM_OUT_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(ZoomOut));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorZoomOut, CURSOR_ZOOM_OUT_PARAMS);
|
|
}
|
|
|
|
case Crosshair:
|
|
if (assetCursorCrosshair == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_CROSSHAIR_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorCrosshair = bitmapData;
|
|
applyCursorParams(assetCursorCrosshair, CURSOR_CROSSHAIR_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Crosshair));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorCrosshair, CURSOR_CROSSHAIR_PARAMS);
|
|
}
|
|
|
|
case Cell:
|
|
if (assetCursorCell == null)
|
|
{
|
|
var future:Future<BitmapData> = Assets.loadBitmapData(CURSOR_CELL_PARAMS.graphic);
|
|
future.onComplete(function(bitmapData:BitmapData) {
|
|
assetCursorCell = bitmapData;
|
|
applyCursorParams(assetCursorCell, CURSOR_CELL_PARAMS);
|
|
});
|
|
future.onError(onCursorError.bind(Cell));
|
|
}
|
|
else
|
|
{
|
|
applyCursorParams(assetCursorCell, CURSOR_CELL_PARAMS);
|
|
}
|
|
|
|
default:
|
|
loadCursorGraphic(null);
|
|
}
|
|
}
|
|
|
|
static inline function applyCursorParams(graphic:BitmapData, params:CursorParams):Void
|
|
{
|
|
FlxG.mouse.load(graphic, params.scale, params.offsetX, params.offsetY);
|
|
}
|
|
|
|
static function onCursorError(cursorMode:CursorMode, error:String):Void
|
|
{
|
|
trace("Failed to load cursor graphic for cursor mode " + cursorMode + ": " + error);
|
|
}
|
|
}
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
|
|
enum CursorMode
|
|
{
|
|
Default;
|
|
Cross;
|
|
Eraser;
|
|
Grabbing;
|
|
Hourglass;
|
|
Pointer;
|
|
Text;
|
|
ZoomIn;
|
|
ZoomOut;
|
|
Crosshair;
|
|
Cell;
|
|
}
|
|
|
|
/**
|
|
* Static data describing how a cursor should be rendered.
|
|
*/
|
|
typedef CursorParams =
|
|
{
|
|
graphic:String,
|
|
scale:Float,
|
|
offsetX:Int,
|
|
offsetY:Int,
|
|
}
|