package funkin.editors.ui; import flixel.math.FlxRect; import openfl.ui.MouseCursor; @:allow(funkin.editors.ui.UIState) @:allow(funkin.editors.ui.UIUtil) class UISprite extends FlxSprite { public var members:Array = []; private var __lastDrawCameras:Array = []; private var __rect:FlxRect = new FlxRect(); private var __oldDefCams:Array; public var hovered:Bool = false; public var hoveredByChild:Bool = false; public var pressed:Bool = false; public var hoverCallback:Void->Void = null; public var cursor:MouseCursor = ARROW; public var focused(get, set):Bool; private inline function get_focused():Bool return UIState.state.currentFocus == cast this; private inline function set_focused(b:Bool):Bool { if (get_focused()) { if (!b) UIState.state.currentFocus = null; } else { if (b) UIState.state.currentFocus = cast this; } return b; } public override function update(elapsed:Float) { hovered = false; pressed = false; hoveredByChild = false; super.update(elapsed); updateButton(); @:privateAccess { __oldDefCams = FlxCamera._defaultCameras; FlxCamera._defaultCameras = cameras; for(m in members) m.update(elapsed); FlxCamera._defaultCameras = __oldDefCams; } } public override function draw() { drawSuper(); drawMembers(); } public function drawSuper() { super.draw(); __lastDrawCameras = [for(c in cameras) c]; } public function drawMembers() { @:privateAccess { __oldDefCams = FlxCamera._defaultCameras; FlxCamera._defaultCameras = cameras; for(m in members) m.draw(); FlxCamera._defaultCameras = __oldDefCams; } } public override function destroy() { super.destroy(); members = FlxDestroyUtil.destroyArray(members); } public function updateButton() { UIState.state.updateButtonHandler(this, onHovered); } /** * Called whenever the sprite is being hovered by the mouse. */ public function onHovered() { hovered = true; if (FlxG.mouse.pressed) pressed = true; if (hoverCallback != null) hoverCallback(); } }