armory/Sources/armory/trait/internal/CanvasScript.hx

169 lines
3.9 KiB
Haxe
Raw Normal View History

2017-05-26 16:05:14 +02:00
package armory.trait.internal;
import iron.Trait;
2017-05-26 16:42:48 +02:00
#if arm_ui
2017-05-26 16:05:14 +02:00
import zui.Zui;
import armory.ui.Canvas;
2017-05-26 16:42:48 +02:00
#end
2017-05-26 16:05:14 +02:00
class CanvasScript extends Trait {
public var cnvName: String;
2017-05-26 16:42:48 +02:00
#if arm_ui
2017-05-26 16:05:14 +02:00
var cui: Zui;
2019-12-19 23:54:08 +01:00
var canvas: TCanvas = null;
2017-05-26 16:05:14 +02:00
2019-12-19 23:54:08 +01:00
public var ready(get, null): Bool;
function get_ready(): Bool { return canvas != null; }
2018-01-31 00:03:28 +01:00
2020-01-03 13:10:13 +01:00
/**
* Create new CanvasScript from canvas
* @param canvasName Name of the canvas
* @param font font file (Optional)
*/
2019-12-19 23:54:08 +01:00
public function new(canvasName: String, font: String = "font_default.ttf") {
2017-05-26 16:05:14 +02:00
super();
cnvName = canvasName;
2017-05-26 16:05:14 +02:00
2019-12-19 23:54:08 +01:00
iron.data.Data.getBlob(canvasName + ".json", function(blob: kha.Blob) {
2018-05-26 22:54:42 +02:00
2019-12-19 23:54:08 +01:00
iron.data.Data.getBlob("_themes.json", function(tBlob: kha.Blob) {
2021-08-08 13:02:19 +02:00
if (@:privateAccess tBlob.get_length() != 0) {
2019-12-06 21:42:11 +01:00
Canvas.themes = haxe.Json.parse(tBlob.toString());
2019-12-19 23:54:08 +01:00
}
else {
2019-12-06 21:42:11 +01:00
trace("\"_themes.json\" is empty! Using default theme instead.");
}
if (Canvas.themes.length == 0) {
2021-05-07 17:02:31 +02:00
Canvas.themes.push(armory.ui.Themes.light);
2018-05-26 22:54:42 +02:00
}
2019-12-06 21:42:11 +01:00
2021-08-04 23:35:54 +02:00
iron.data.Data.getFont(font, function(defaultFont: kha.Font) {
2019-12-19 23:54:08 +01:00
var c: TCanvas = haxe.Json.parse(blob.toString());
2019-12-06 21:42:11 +01:00
if (c.theme == null) c.theme = Canvas.themes[0].NAME;
2021-08-04 23:35:54 +02:00
cui = new Zui({font: defaultFont, theme: Canvas.getTheme(c.theme)});
2019-12-06 21:42:11 +01:00
if (c.assets == null || c.assets.length == 0) canvas = c;
2019-12-19 23:54:08 +01:00
else { // Load canvas assets
2019-12-06 21:42:11 +01:00
var loaded = 0;
for (asset in c.assets) {
var file = asset.name;
2021-08-04 23:35:54 +02:00
if (Canvas.isFontAsset(file)) {
iron.data.Data.getFont(file, function(f: kha.Font) {
Canvas.assetMap.set(asset.id, f);
if (++loaded >= c.assets.length) canvas = c;
});
} else {
iron.data.Data.getImage(file, function(image: kha.Image) {
Canvas.assetMap.set(asset.id, image);
if (++loaded >= c.assets.length) canvas = c;
});
}
2019-12-06 21:42:11 +01:00
}
}
});
2017-05-26 16:05:14 +02:00
});
});
2019-12-19 23:54:08 +01:00
notifyOnRender2D(function(g: kha.graphics2.Graphics) {
2017-05-26 16:05:14 +02:00
if (canvas == null) return;
2020-03-16 09:05:42 +01:00
setCanvasDimensions(kha.System.windowWidth(), kha.System.windowHeight());
2017-05-26 16:05:14 +02:00
var events = Canvas.draw(cui, canvas, g);
for (e in events) {
var all = armory.system.Event.get(e);
2017-08-07 10:47:29 +02:00
if (all != null) for (entry in all) entry.onEvent();
2017-05-26 16:05:14 +02:00
}
2018-08-29 23:01:23 +02:00
if (onReady != null) { onReady(); onReady = null; }
2017-05-26 16:05:14 +02:00
});
}
2017-05-26 16:42:48 +02:00
2019-12-19 23:54:08 +01:00
var onReady: Void->Void = null;
public function notifyOnReady(f: Void->Void) {
2018-08-29 23:01:23 +02:00
onReady = f;
}
/**
* Returns an element of the canvas.
* @param name The name of the element
* @return TElement
*/
2019-12-19 23:54:08 +01:00
public function getElement(name: String): TElement {
2017-09-18 17:02:25 +02:00
for (e in canvas.elements) if (e.name == name) return e;
return null;
}
2019-12-06 21:42:11 +01:00
/**
* Returns an array of the elements of the canvas.
* @return Array<TElement>
*/
2019-12-19 23:54:08 +01:00
public function getElements(): Array<TElement> {
return canvas.elements;
}
2020-01-03 13:10:13 +01:00
/**
* Returns the canvas object of this trait.
* @return TCanvas
*/
public function getCanvas(): Null<TCanvas> {
return canvas;
}
/**
Set the UI scale factor.
**/
public inline function setUiScale(factor: Float) {
cui.setScale(factor);
}
/**
Get the UI scale factor.
**/
public inline function getUiScale(): Float {
return cui.ops.scaleFactor;
}
2020-01-03 13:10:13 +01:00
/**
* Set visibility of canvas
* @param visible Whether canvas should be visible or not
*/
public function setCanvasVisibility(visible: Bool){
for (e in canvas.elements) e.visible = visible;
}
2020-03-16 09:05:42 +01:00
/**
* Set dimensions of canvas
* @param x Width
* @param y Height
*/
public function setCanvasDimensions(x: Int, y: Int){
canvas.width = x;
canvas.height = y;
}
2020-01-03 13:10:13 +01:00
/**
* Set font size of the canvas
* @param fontSize Size of font to be setted
*/
public function setCanvasFontSize(fontSize: Int) {
cui.t.FONT_SIZE = fontSize;
}
2017-09-18 17:02:25 +02:00
2018-08-29 23:01:23 +02:00
// Contains data
@:access(armory.ui.Canvas)
2018-08-29 23:01:23 +02:00
@:access(zui.Handle)
2019-12-19 23:54:08 +01:00
public function getHandle(name: String): Handle {
2018-08-29 23:01:23 +02:00
// Consider this a temporary solution
return Canvas.h.children[getElement(name).id];
}
2017-05-26 16:42:48 +02:00
#else
public function new(canvasName: String) { super(); cnvName = canvasName; }
2017-05-26 16:42:48 +02:00
#end
2017-05-26 16:05:14 +02:00
}