haxeui/haxeui-core

View on GitHub
haxe/ui/HaxeUIApp.hx

Summary

Maintainability
Test Coverage
package haxe.ui;

import haxe.ui.Preloader.PreloadItem;
import haxe.ui.Preloader;
import haxe.ui.backend.AppImpl;
import haxe.ui.backend.ToolkitOptions;
import haxe.ui.core.Component;
import haxe.ui.core.Screen;

@:keep
class HaxeUIApp extends AppImpl {
    public static var instance:HaxeUIApp;

    private var _options:ToolkitOptions;
    public function new(options:ToolkitOptions = null) {
        super();
        instance = this;
        _options = options;
        Toolkit.build();
        build();
    }

    private var _readyCalled:Bool = false;
    public function ready(onReady:Void->Void, onEnd:Void->Void = null) {
        if (_readyCalled) {
            trace("WARNING: multiple calls to HaxeUIApp:ready detected, only one needed, skipping additional calls");
            onReady();
            return;
        }
        _readyCalled = true;
        init(onReady, onEnd);
    }

    public var preloaderClass:Class<Preloader> = null;
    public var preloader:Preloader = null;
    private var _onReady:Void->Void;
    private var _onEnd:Void->Void;
    private override function init(onReady:Void->Void, onEnd:Void->Void = null) {
        _onReady = onReady;
        _onEnd = onEnd;
        
        if (Toolkit.backendProperties.getProp("haxe.ui.theme") != null && Toolkit.theme == "default") {
            Toolkit.theme = Toolkit.backendProperties.getProp("haxe.ui.theme");
        }

        if (_options == null) {
            Toolkit.init(getToolkitInit());
        } else { // TODO: consider: https://code.haxe.org/category/macros/combine-objects.html
            Toolkit.init(_options);
        }

        if (_autoHandlePreload) {
            startPreload(onPreloadComplete);
        } else {
            super.init(_onReady, _onEnd);
        }
    }

    private function onPreloadComplete() {
        super.init(_onReady, _onEnd);
    }

    private override function startPreload(onComplete:Void->Void) {
        var preloadList:Array<PreloadItem> = null;

        #if (!haxeui_hxwidgets && !haxeui_kha && !haxeui_qt && !haxeui_raylib) // TODO: needs some work here

        preloadList = buildPreloadList();
        if (preloadList != null && preloadList.length > 0) {
            if (preloaderClass == null) {
                preloader = new Preloader();
            } else {
                preloader = Type.createInstance(preloaderClass, []);
            }
            preloader.progress(0, preloadList.length);
            addComponent(preloader);
            preloader.validateComponent();
        }

        #end

        handlePreload(preloadList, onComplete, preloader);
    }

    private function handlePreload(list:Array<PreloadItem>, onComplete:Void->Void, preloader:Preloader) {
        if (list == null || list.length == 0) {
            if (preloader != null) {
                preloader.complete();
            }
            onComplete();
            return;
        }

        var item = list.shift();
        switch (item.type) {
            case "font":
                ToolkitAssets.instance.getFont(item.resourceId, function(f) {
                    if (preloader != null) {
                        preloader.increment();
                    }
                    handlePreload(list, onComplete, preloader);
                });
            case "image":
                ToolkitAssets.instance.getImage(item.resourceId, function(i) {
                    if (preloader != null) {
                        preloader.increment();
                    }
                    handlePreload(list, onComplete, preloader);
                });
            case _:
                trace('WARNING: unknown type to preload "${item.type}", continuing');
                if (preloader != null) {
                    preloader.increment();
                }
                handlePreload(list, onComplete, preloader);
        }
    }

    public var title(get, set):String;
    private function get_title():String {
        return Screen.instance.title;
    }
    private function set_title(value:String):String {
        Screen.instance.title = value;
        return value;
    }
    
    public function addComponent(component:Component):Component {
        return Screen.instance.addComponent(component);
    }

    public function removeComponent(component:Component, dispose:Bool = true):Component {
        return Screen.instance.removeComponent(component, dispose);
    }

    public function setComponentIndex(child:Component, index:Int):Component {
        return Screen.instance.setComponentIndex(child, index);
    }

    private override function buildPreloadList():Array<PreloadItem> {
        var list = super.buildPreloadList();

        if (list == null) {
            list = [];
        }

        list = list.concat(ToolkitAssets.instance.preloadList);

        return list;
    }
}