package funkin.ui.haxeui; import haxe.ui.RuntimeComponentBuilder; import haxe.ui.components.CheckBox; import haxe.ui.containers.menus.MenuCheckBox; import haxe.ui.core.Component; import haxe.ui.events.MouseEvent; import haxe.ui.events.UIEvent; class HaxeUISubState extends MusicBeatSubstate { // The component representing the main UI. public var component:Component; var _componentKey:String; public function new(key:String) { super(); _componentKey = key; } override function create() { super.create(); refreshComponent(); } /** * Builds a component from a given XML file. * Call this in your code to load additional components at runtime. */ public function buildComponent(assetPath:String) { trace('Building component $assetPath'); return RuntimeComponentBuilder.fromAsset(assetPath); } override function update(elapsed:Float) { super.update(elapsed); // Force quit. if (FlxG.keys.justPressed.F4) FlxG.switchState(new MainMenuState()); // Refresh the component. if (FlxG.keys.justPressed.F5) { refreshComponent(); } } function refreshComponent() { /* if (component != null) { remove(component); component = null; } if (component != null) { trace('Success!'); add(component); } else { trace('Failed to build component $_componentKey'); } */ if (component == null) { component = buildComponent(_componentKey); add(component); trace(component); } else { var component2 = buildComponent(_componentKey); component2.x += 100; add(component2); trace(component2); remove(component); } } /** * Add an onClick listener to a HaxeUI menu bar item. */ function addUIClickListener(key:String, callback:MouseEvent->Void) { var target:Component = findComponent(key); if (target == null) { // Gracefully handle the case where the item can't be located. trace('WARN: Could not locate menu item: $key'); } else { target.onClick = callback; } } /** * Add an onChange listener to a HaxeUI input component such as a slider or text field. */ function addUIChangeListener(key:String, callback:UIEvent->Void) { var target:Component = findComponent(key); if (target == null) { // Gracefully handle the case where the item can't be located. trace('WARN: Could not locate menu item: $key'); } else { target.onChange = callback; } } /** * Set the value of a HaxeUI component. * Usually modifies the text of a label or value of a text field. */ function setUIValue(key:String, value:T):T { var target:Component = findComponent(key); if (target == null) { // Gracefully handle the case where the item can't be located. trace('WARN: Could not locate menu item: $key'); return value; } else { return target.value = value; } } /** * Set the value of a HaxeUI checkbox, * since that's on 'selected' instead of 'value'. */ public function setUICheckboxSelected(key:String, value:Bool):Bool { var targetA:CheckBox = findComponent(key, CheckBox); if (targetA != null) { return targetA.selected = value; } var targetB:MenuCheckBox = findComponent(key, MenuCheckBox); if (targetB != null) { return targetB.selected = value; } // Gracefully handle the case where the item can't be located. trace('WARN: Could not locate check box: $key'); return value; } public function findComponent(criteria:String = null, type:Class = null, recursive:Null = null, searchType:String = "id"):Null { if (component == null) return null; return component.findComponent(criteria, type, recursive, searchType); } override function destroy() { if (component != null) remove(component); component = null; } }