forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			176 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			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"; | ||
|  | 	} | ||
|  | } |