2025-01-22 16:18:30 +01:00

176 lines
5.1 KiB
Haxe

package lnx2d;
// Zui
import leenkx.ui.Canvas;
// Editor
import lnx2d.Path;
import lnx2d.ui.UIProperties;
class Assets {
public static function getImage(asset:TAsset):kha.Image {
return Canvas.assetMap.get(asset.id);
}
public static function getFont(asset:TAsset):kha.Font {
return Canvas.assetMap.get(asset.id);
}
public static function importAsset(canvas:TCanvas, path:String) {
var abspath = Path.toAbsolute(path, Main.cwd);
abspath = kha.System.systemId == "Windows" ? StringTools.replace(abspath, "/", "\\") : abspath;
if (isPathImage(path)) {
kha.Assets.loadImageFromPath(abspath, false, function(image:kha.Image) {
var ar = path.split("/");
var name = ar[ar.length - 1];
var asset:TAsset = { name: name, file: path, id: Canvas.getAssetId(canvas) };
canvas.assets.push(asset);
Canvas.assetMap.set(asset.id, image);
Editor.assetNames.push(name);
UIProperties.hwin.redraws = 2;
});
}
else if (isPathFont(path)) {
kha.Assets.loadFontFromPath(abspath, function(font:kha.Font) {
var ar = path.split("/");
var name = ar[ar.length - 1];
var asset:TAsset = { name: name, file: path, id: Canvas.getAssetId(canvas) };
canvas.assets.push(asset);
Canvas.assetMap.set(asset.id, font);
Editor.assetNames.push(name);
UIProperties.hwin.redraws = 2;
});
}
}
/**
* Imports all themes from '_themes.json'. If the file doesn't exist, the
* default light theme is used instead.
*/
public static function importThemes() {
var themesDir = haxe.io.Path.directory(Main.prefs.path);
var themesPath = haxe.io.Path.join([themesDir, "_themes.json"]);
themesPath = kha.System.systemId == "Windows" ? StringTools.replace(themesPath, "/", "\\") : themesPath;
try {
kha.Assets.loadBlobFromPath(themesPath, function(b:kha.Blob) {
Canvas.themes = haxe.Json.parse(b.toString());
if (Canvas.themes.length == 0) {
Canvas.themes.push(Reflect.copy(leenkx.ui.Themes.light));
}
if (Main.inst != null) Editor.selectedTheme = Canvas.themes[0];
// Error handling for HTML5 target
}, function(a:kha.AssetError) {
Canvas.themes.push(Reflect.copy(leenkx.ui.Themes.light));
if (Main.inst != null) Editor.selectedTheme = Canvas.themes[0];
});
}
// Error handling for Krom, as the failed callback for loadBlobFromPath()
// is currently not implemented in Krom
catch (e: Dynamic) {
Canvas.themes.push(Reflect.copy(leenkx.ui.Themes.light));
if(Main.inst != null) Editor.selectedTheme = Canvas.themes[0];
}
}
public static function save(canvas: TCanvas) {
// Unpan
canvas.x = 0;
canvas.y = 0;
saveCanvas(canvas);
saveAssets(canvas);
saveThemes();
canvas.x = Editor.coffX;
canvas.y = Editor.coffY;
}
public static function load(done: TCanvas->Void) {
kha.Assets.loadBlobFromPath(Main.prefs.path, function(b: kha.Blob) {
done(Canvas.parseCanvasFromBlob(b));
});
}
static function saveCanvas(canvas: TCanvas) {
#if kha_krom
Krom.fileSaveBytes(Main.prefs.path, haxe.io.Bytes.ofString(haxe.Json.stringify(canvas)).getData());
#elseif kha_debug_html5
html5WriteFile(Main.prefs.path, haxe.Json.stringify(canvas));
#end
}
static function saveAssets(canvas: TCanvas) {
var filesPath = Main.prefs.path.substr(0, Main.prefs.path.length - 5); // .json
filesPath += '.files';
var filesList = '';
for (a in canvas.assets) filesList += a.file + '\n';
#if kha_krom
Krom.fileSaveBytes(filesPath, haxe.io.Bytes.ofString(filesList).getData());
#elseif kha_debug_html5
html5WriteFile(filesPath, filesList);
#end
}
static function saveThemes() {
var themesPath = haxe.io.Path.join([haxe.io.Path.directory(Main.prefs.path), "_themes.json"]);
#if kha_krom
Krom.fileSaveBytes(themesPath, haxe.io.Bytes.ofString(haxe.Json.stringify(Canvas.themes)).getData());
#elseif kha_debug_html5
html5WriteFile(themesPath, haxe.Json.stringify(Canvas.themes));
#end
}
#if kha_debug_html5
static function html5WriteFile(filePath: String, data: String) {
var fs = js.Syntax.code('require("fs");');
var path = js.Syntax.code('require("path")');
var filePath = path.resolve(js.Syntax.code('__dirname'), filePath);
try { fs.writeFileSync(filePath, data); }
catch (x: Dynamic) { trace('saving "${filePath}" failed'); }
}
#end
public static function getEnumTexts():Array<String> {
if(Main.inst==null) return [""];
return Editor.assetNames.length > 0 ? Editor.assetNames : [""];
}
public static function getAssetIndex(canvas:TCanvas, asset:String):Int {
for (i in 0...canvas.assets.length) if (asset == canvas.assets[i].name) return i + 1; // assetNames[0] = ""
return 0;
}
/**
* Returns if the given path is a path to an image file.
* @param path The path of the asset
* @return Bool
*/
public static function isPathImage(path: String): Bool {
var extension = haxe.io.Path.extension(path).toLowerCase();
return extension == "jpg" || extension == "png" || extension == "k" || extension == "hdr";
}
/**
* Returns if the given path is a path to a font file.
* @param path The path of the asset
* @return Bool
*/
public static inline function isPathFont(path: String): Bool {
return haxe.io.Path.extension(path).toLowerCase() == "ttf";
}
}