Procházet zdrojové kódy

Project Manager - List and Install

A basic project manager that can list modules and handle basic installations.
Peter Robinson před 3 roky
rodič
revize
bd36ef2292

+ 22 - 2
editor/EditorCore/Themes/BaseTheme/BaseTheme.cs

@@ -1215,7 +1215,6 @@ function BaseTheme::makeScrollProfile(%this)
 	%this.scrollProfile = new GuiControlProfile()
 	%this.scrollProfile = new GuiControlProfile()
 	{
 	{
 	    fillColor = %this.setAlpha(%this.color2, 180);
 	    fillColor = %this.setAlpha(%this.color2, 180);
-
 		borderDefault = %mainBorder;
 		borderDefault = %mainBorder;
 	};
 	};
 
 
@@ -1254,7 +1253,7 @@ function BaseTheme::makeScrollProfile(%this)
 		fontColorNA = %this.setAlpha(%this.color2, 80);
 		fontColorNA = %this.setAlpha(%this.color2, 80);
 		borderDefault = %this.emptyBorder;
 		borderDefault = %this.emptyBorder;
 	};
 	};
-	%this.scrollProfile = new GuiControlProfile()
+	%this.tinyScrollProfile = new GuiControlProfile()
 	{
 	{
 	    fillColor = %this.setAlpha(%this.color2, 180);
 	    fillColor = %this.setAlpha(%this.color2, 180);
 		borderDefault = %this.emptyBorder;
 		borderDefault = %this.emptyBorder;
@@ -1848,6 +1847,27 @@ function BaseTheme::makeTextDisplayProfile(%this)
 		borderTop = %this.emptyBorder;
 		borderTop = %this.emptyBorder;
 		borderBottom = %this.emptyBorder;
 		borderBottom = %this.emptyBorder;
 	};
 	};
+
+	%spacerBorder = new GuiBorderProfile()
+	{
+		margin = 3;
+	};
+
+	%this.spacerProfile = new GuiControlProfile()
+	{
+		fillColor = %this.color5;
+		fontType = %this.font[1];
+		fontDirectory = %this.fontDirectory;
+		fontSize = 14;
+		fontColor = %this.color1;
+		align = "center";
+		vAlign = "middle";
+
+		borderDefault = %this.emptyBorder;
+		borderLeft = %spacerBorder;
+		borderRight = %spacerBorder;
+		borderBottom = %spacerBorder;
+	};
 }
 }
 
 
 //Positive values are brighter, negative are darker
 //Positive values are brighter, negative are darker

+ 108 - 20
editor/ProjectManager/ProjectManager.cs

@@ -22,31 +22,70 @@
 
 
 function ProjectManager::create(%this)
 function ProjectManager::create(%this)
 {
 {
+	exec("./scripts/ProjectModulePanel.cs");
+	exec("./scripts/ProjectGamePanel.cs");
+	exec("./scripts/ProjectLibraryPanel.cs");
+	exec("./scripts/ProjectModuleCard.cs");
+
 	%this.guiPage = EditorCore.RegisterEditor("Project Manager", %this);
 	%this.guiPage = EditorCore.RegisterEditor("Project Manager", %this);
 
 
-	%this.comingSoon = new GuiWindowCtrl()
+	%this.scroller = new GuiScrollCtrl()
 	{
 	{
-		class = "comingSoonTest";
-		HorizSizing="center";
-		VertSizing="center";
-		Position="412 324";
-		Extent="200 120";
-		Visible="1";
-		Text = "Coming Soon!";
-		canClose = true;
-		canMove = true;
-		Profile = "GuiWindowProfile";
-		CloseButtonProfile = "GuiWindowCloseButtonProfile";
+		HorizSizing="width";
+		VertSizing="height";
+		Position="0 0";
+		Extent="1024 768";
+		hScrollBar="dynamic";
+		vScrollBar="dynamic";
+		constantThumbHeight="0";
+		showArrowButtons="1";
+		scrollBarThickness="14";
 	};
 	};
-	//ThemeManager.setProfile(%this.comingSoon, "simpleProfile");
-	%this.guiPage.add(%this.comingSoon);
+	ThemeManager.setProfile(%this.scroller, "emptyProfile");
+	ThemeManager.setProfile(%this.scroller, "thumbProfile", "ThumbProfile");
+	ThemeManager.setProfile(%this.scroller, "trackProfile", "TrackProfile");
+	ThemeManager.setProfile(%this.scroller, "scrollArrowProfile", "ArrowProfile");
+	%this.guiPage.add(%this.scroller);
 
 
-	EditorCore.FinishRegistration(%this.guiPage);
-}
+	%this.container = new GuiControl()
+	{
+		HorizSizing="width";
+		VertSizing="height";
+		Position="0 0";
+		Extent="1024 768";
+		MinExtent="1024 500";
+	};
+	ThemeManager.setProfile(%this.container, "emptyProfile");
+	%this.scroller.add(%this.container);
 
 
-function comingSoonTest::onClose(%this)
-{
-	echo("comingSoonTest::onClose fired successfully!");
+	%this.libraryPanel = new GuiControl()
+	{
+		Class = "ProjectLibraryPanel";
+		superclass = "ProjectModulePanel";
+		HorizSizing="relative";
+		VertSizing="height";
+		Position="0 0";
+		Extent="512 768";
+	};
+	ThemeManager.setProfile(%this.libraryPanel, "emptyProfile");
+	%this.container.add(%this.libraryPanel);
+	%this.libraryPanel.load();
+	%this.startListening(%this.libraryPanel);
+
+	%this.gamePanel = new GuiControl()
+	{
+		Class = "ProjectGamePanel";
+		superclass = "ProjectModulePanel";
+		HorizSizing="relative";
+		VertSizing="height";
+		Position="512 0";
+		Extent="512 768";
+	};
+	ThemeManager.setProfile(%this.gamePanel, "emptyProfile");
+	%this.container.add(%this.gamePanel);
+	%this.startListening(%this.gamePanel);
+
+	EditorCore.FinishRegistration(%this.guiPage);
 }
 }
 
 
 function ProjectManager::destroy(%this)
 function ProjectManager::destroy(%this)
@@ -56,10 +95,59 @@ function ProjectManager::destroy(%this)
 
 
 function ProjectManager::open(%this)
 function ProjectManager::open(%this)
 {
 {
-
+	%allModules = ModuleDatabase.findModules(false);
+	%this.gamePanel.onOpen(%allModules);
+	%this.libraryPanel.onOpen(%allModules);
 }
 }
 
 
 function ProjectManager::close(%this)
 function ProjectManager::close(%this)
 {
 {
+	%this.libraryPanel.onClose();
+	%this.gamePanel.onClose();
+}
+
+function ProjectManager::setProjectFolder(%this, %folder)
+{
+	%this.projectFolder = %folder;
+}
 
 
+function ProjectManager::getProjectFolder(%this)
+{
+	if(%this.projectFolder $= "")
+	{
+		%appCore = ModuleDatabase.findModule("AppCore", 1);
+		%appCorePath = %appCore.getModulePath();
+		%mainCsPath = getMainDotCsDir();
+		%mainLen = strLen(%mainCsPath);
+		%lastChar = getSubStr(%mainCsPath, %mainLen-1, 1);
+		if(%lastChar $= "\\" || %lastChar $= "\/")
+		{
+			%relativePath = getSubStr(%appCorePath, strlen(%mainCsPath), strlen(%appCorePath) - %mainLen);
+		}
+		else
+		{
+			%relativePath = getSubStr(%appCorePath, strlen(%mainCsPath) + 1, strlen(%appCorePath) - (%mainLen + 1));
+		}
+		%unwantedPortion1 = strchr(%relativePath, "\\");
+		%unwantedPortion2 = strchr(%relativePath, "\/");
+		if(%unwantedPortion1 !$= "")
+		{
+			%this.projectFolder = getSubStr(%relativePath, 0, strlen(%relativePath) - strlen(%unwantedPortion1));
+		}
+		else if(%unwantedPortion2 !$= "")
+		{
+			%this.projectFolder = getSubStr(%relativePath, 0, strlen(%relativePath) - strlen(%unwantedPortion2));
+		}
+		else
+		{
+			%this.projectFolder = %relativePath;
+		}
+	}
+	return pathConcat(getMainDotCsDir(), %this.projectFolder);
+}
+
+function ProjectManager::onModuleInstalled(%this, %module)
+{
+	%this.gamePanel.addModule(%module, %module);
+	%this.gamePanel.sortModules();
 }
 }

+ 49 - 0
editor/ProjectManager/scripts/ProjectGamePanel.cs

@@ -0,0 +1,49 @@
+
+function ProjectGamePanel::onAdd(%this)
+{
+	%this.init("Project");
+}
+
+function ProjectGamePanel::onOpen(%this, %allModules)
+{
+	%appCore = ModuleDatabase.findModule("AppCore", 1);
+	if(isObject(%appCore))
+	{
+		%this.setTitle(%appCore.project);
+	}
+
+	%loadedModules = ModuleDatabase.findModules(true);
+
+	%this.clearModules();
+	for(%i = 0; %i < getWordCount(%allModules); %i++)
+	{
+		%mod = getWord(%allModules, %i);
+		%this.addModule(%mod, %loadedModules);
+	}
+	%this.list.sortByText();
+}
+
+function ProjectGamePanel::addModule(%this, %module, %loadedModules)
+{
+	%color = %this.gray;
+	if(%module.Deprecated)
+	{
+		%color = %this.darkRed;
+	}
+	for(%i = 0; %i < getWordCount(%loadedModules); %i++)
+	{
+		%loadedModule = getWord(%loadedModules, %i);
+		if(%loadedModule == %module)
+		{
+			%color = %this.yellow;
+			if(%module.Deprecated)
+			{
+				%color = %this.darkRed;
+			}
+		}
+	}
+
+	%this.list.addItemWithID(%this.getModuleName(%module), %module);
+	%index = %this.list.findItemID(%module);
+	%this.list.setItemColor(%index, %color);
+}

+ 99 - 0
editor/ProjectManager/scripts/ProjectLibraryPanel.cs

@@ -0,0 +1,99 @@
+
+function ProjectLibraryPanel::onAdd(%this)
+{
+	%this.init("Library");
+}
+
+function ProjectLibraryPanel::load(%this)
+{
+	%this.manager = new ModuleManager();
+	%this.manager.addListener(AssetDatabase);
+	%this.manager.EchoInfo = false;
+
+	%this.manager.ScanModules(pathConcat(getMainDotCsDir(), "library"));
+
+	%allModules = %this.manager.findModules(false);
+
+	for(%i = 0; %i < getWordCount(%allModules); %i++)
+	{
+		%mod = getWord(%allModules, %i);
+		%this.addModule(%mod);
+	}
+	%this.list.sortByText();
+}
+
+function ProjectLibraryPanel::addModule(%this, %module)
+{
+	%this.list.addItemWithID(%this.getModuleName(%module), %module);
+}
+
+function ProjectLibraryPanel::onOpen(%this, %allModules)
+{
+	%count = %this.list.getItemCount();
+	for(%i = 0; %i < %count; %i++)
+	{
+		%module = %this.list.getItemID(%i);
+		%this.refreshColor(%module, %i, %allModules);
+	}
+}
+
+function ProjectLibraryPanel::refreshColor(%this, %module, %index, %projectModules)
+{
+	%color = %this.gray;
+	if(%module.Deprecated)
+	{
+		%color = %this.darkRed;
+	}
+	for(%i = 0; %i < getWordCount(%projectModules); %i++)
+	{
+		%projectModule = getWord(%projectModules, %i);
+		if(%projectModule.ModuleId $= %module.ModuleId && %projectModule.VersionId $= %module.VersionId)
+		{
+			%color = %this.yellow;
+			if(%module.Deprecated)
+			{
+				%color = %this.darkRed;
+			}
+			else if(%module.BuildID > %projectModule.BuildID)
+			{
+				%color = %this.purple;
+			}
+		}
+	}
+
+	%this.list.setItemColor(%index, %color);
+}
+
+function ProjectLibraryPanel::onInstallClick(%this)
+{
+	%index = %this.list.getSelectedItem();
+	%module = %this.list.getItemID(%index);
+
+	if(isObject(%module))
+	{
+		%newModulePath = pathConcat(ProjectManager.getProjectFolder(), %module.moduleID);
+		%this.manager.CopyModule(%module.moduleID, %module.versionID, %module.moduleID, %newModulePath, false);
+		//%this.manager.synchronizeDependencies(%module, pathConcat(ProjectManager.getProjectFolder()));
+
+		%file = TamlRead(pathConcat(%newModulePath, "module.taml"));
+		%file.Group = "";
+		TamlWrite(%file, pathConcat(%newModulePath, "module.taml"));
+
+		ModuleDatabase.ScanModules(%newModulePath);
+		ModuleDatabase.LoadExplicit(%module.moduleID, %module.versionID);
+		%installedModule = ModuleDatabase.findModule(%module.moduleID, %module.versionID);
+
+		%this.list.setItemColor(%index, "255 255 100 255");
+
+		%file = TamlRead(pathConcat(%newModulePath, "module.taml"));
+		%file.Group = "gameBase";
+		TamlWrite(%file, pathConcat(%newModulePath, "module.taml"));
+
+		%this.postEvent("ModuleInstalled", %installedModule);
+	}
+}
+
+function ProjectLibraryPanel::onUpdateClick(%this)
+{
+
+}

+ 192 - 0
editor/ProjectManager/scripts/ProjectModuleCard.cs

@@ -0,0 +1,192 @@
+
+ function ProjectModuleCard::onAdd(%this)
+ {
+	 %this.chain = new GuiChainCtrl()
+	 {
+		 HorizSizing="width";
+ 		 VertSizing="height";
+		 Position = "0 0";
+		 Extent = "286 100";
+		 IsVertical = "1";
+		 ChildSpacing = -4;
+	 };
+ 	ThemeManager.setProfile(%this.chain, "emptyProfile");
+ 	%this.add(%this.chain);
+
+	%this.titleText = new GuiControl()
+	{
+		HorizSizing="width";
+		Position = "0 13";
+		Extent = "286 38";
+		Text = "ModuleName";
+		FontSizeAdjust = "1.4";
+	};
+	ThemeManager.setProfile(%this.titleText, "titleProfile");
+	%this.chain.add(%this.titleText);
+
+	%this.authorText = new GuiControl()
+	{
+		HorizSizing="width";
+		Position = "0 0";
+		Extent = "180 22";
+		MinExtent = "180 22";
+		Text = "Module by Torque2D";
+		TextWrap = 1;
+		TextExtend = 1;
+		FontSizeAdjust = "1.1";
+		FontColor = ThemeManager.activeTheme.color5;
+		OverrideFontColor = true;
+	};
+	ThemeManager.setProfile(%this.authorText, "codeProfile");
+	%this.chain.add(%this.authorText);
+
+	%this.versionText = new GuiControl()
+	{
+		HorizSizing="width";
+		Position = "0 0";
+		Extent = "180 26";
+		Text = "Version: 1     Build: 1";
+		FontColor = ThemeManager.activeTheme.setAlpha(ThemeManager.activeTheme.color4, 150);
+		OverrideFontColor = true;
+	};
+	ThemeManager.setProfile(%this.versionText, "codeProfile");
+	%this.chain.add(%this.versionText);
+
+	%this.spacer = new GuiControl()
+	{
+		HorizSizing="width";
+		Position = "0 0";
+		Extent = "286 6";
+	};
+	ThemeManager.setProfile(%this.spacer, "spacerProfile");
+	%this.chain.add(%this.spacer);
+
+	%this.descriptionText = new GuiControl()
+	{
+		HorizSizing="width";
+		Position = "0 10";
+		Extent = "286 150";
+		MinExtent = "250 150";
+		Text = "Demonstrates the ability to create rope and chains using joints.";
+		TextWrap = 1;
+		TextExtend = 1;
+	};
+	ThemeManager.setProfile(%this.descriptionText, "normalTextProfile");
+	%this.chain.add(%this.descriptionText);
+
+	%this.button = new GuiButtonCtrl()
+	{
+		Class="ProjectModuleCardButton";
+		HorizSizing="left";
+		VertSizing="bottom";
+		Position = "184 40";
+		Extent = "100 30";
+		MinExtent = "100 30";
+		Text = "";
+	};
+	ThemeManager.setProfile(%this.button, "primaryButtonProfile");
+	%this.add(%this.button);
+	%this.startListening(%this.button);
+
+	%this.startListening(ThemeManager);
+ }
+
+function ProjectModuleCard::onThemeChange(%this, %theme)
+{
+	%this.authorText.FontColor = %theme.color5;
+	%this.versionText.FontColor = %theme.setAlpha(%theme.color4, 150);
+}
+
+function ProjectModuleCard::show(%this, %module)
+{
+	%this.titleText.setText(%module.moduleID);
+	%this.setAuthor(%module);
+	%this.setVersion(%module);
+	%this.descriptionText.setText(%module.description);
+
+	%this.button.visible = false;
+	%projectModule = %this.getInstalledModule(%module.moduleID, %module.versionID);
+	if(%projectModule != %module)
+	{
+		if(!isObject(%projectModule))
+		{
+			%this.button.setText("Install");
+			%this.button.visible = true;
+		}
+		else if(%projectmodule.buildID < %module.buildID)
+		{
+			%this.button.setText("Update");
+			%this.button.visible = true;
+		}
+	}
+	else
+	{
+
+	}
+
+	%this.visible = true;
+}
+
+function ProjectModuleCard::hide(%this)
+{
+	%this.visible = false;
+}
+
+function ProjectModuleCard::setAuthor(%this, %module)
+{
+	%author = %module.author;
+	if(%author $= "")
+	{
+		%author = "Torque2D";
+	}
+
+	%type = %module.type;
+	if(%type $= "")
+	{
+		%type = "Module";
+	}
+
+	%this.authorText.setText(%type SPC "by" SPC %author);
+}
+
+function ProjectModuleCard::setVersion(%this, %module)
+{
+	%version = %module.versionID;
+	if(%version $= "")
+	{
+		%version = 1;
+	}
+
+	%build = %module.buildID;
+	if(%build $= "")
+	{
+		%build = 0;
+	}
+
+	%this.versionText.setText("Version:" SPC %version @ "     Build:" SPC %build);
+}
+
+function ProjectModuleCard::getInstalledModule(%this, %moduleID, %versionID)
+{
+	%allModules = ModuleDatabase.findModules(false);
+	%count = getWordCount(%allModules);
+	for(%i = 0; %i < %count; %i++)
+	{
+		%projectModule = getWord(%allModules, %i);
+		if(%moduleID $= %projectModule.ModuleID && %versionID == %projectModule.VersionID)
+		{
+			return %projectModule;
+		}
+	}
+	return 0;
+}
+
+function ProjectModuleCardButton::onClick(%this)
+{
+	%this.postEvent("ButtonClick");
+}
+
+function ProjectModuleCard::onButtonClick(%this)
+{
+	%this.postEvent(%this.button.getText() @ "Click");
+}

+ 128 - 0
editor/ProjectManager/scripts/ProjectModulePanel.cs

@@ -0,0 +1,128 @@
+
+function ProjectModulePanel::init(%this, %title)
+{
+	%this.leftPanel = new GuiControl()
+	{
+		HorizSizing="right";
+		VertSizing="height";
+		Position="0 0";
+		Extent="200 768";
+	};
+	ThemeManager.setProfile(%this.leftPanel, "overlayProfile");
+	%this.add(%this.leftPanel);
+
+	%this.title = new GuiControl()
+	{
+		Position = "0 4";
+		Extent = "200 40";
+		Text = %title;
+	};
+	ThemeManager.setProfile(%this.title, "titleProfile");
+	%this.leftPanel.add(%this.title);
+
+	%this.scroller = new GuiScrollCtrl()
+	{
+		HorizSizing="width";
+		VertSizing="height";
+		Position="0 40";
+		Extent="200 728";
+		hScrollBar="alwaysOff";
+		vScrollBar="dynamic";
+		constantThumbHeight="0";
+		showArrowButtons="0";
+		scrollBarThickness="6";
+	};
+	ThemeManager.setProfile(%this.scroller, "emptyProfile");
+	ThemeManager.setProfile(%this.scroller, "tinyThumbProfile", "ThumbProfile");
+	ThemeManager.setProfile(%this.scroller, "tinyTrackProfile", "TrackProfile");
+	ThemeManager.setProfile(%this.scroller, "tinyScrollArrowProfile", "ArrowProfile");
+	%this.leftPanel.add(%this.scroller);
+
+	%this.list = new GuiListBoxCtrl()
+	{
+		Class = "ProjectModulePanelList";
+		HorizSizing="width";
+		VertSizing="height";
+		Position="0 0";
+		Extent="200 10";
+		AllowMultipleSelections=true;
+		FitParentWidth=true;
+		FontSizeAdjust="0.9";
+	};
+	ThemeManager.setProfile(%this.list, "listBoxProfile");
+	%this.scroller.add(%this.list);
+	%this.startListening(%this.list);
+
+	%this.card = new GuiScrollCtrl()
+	{
+		Class="ProjectModuleCard";
+		HorizSizing="width";
+		VertSizing="height";
+		Position="200 0";
+		Extent="312 768";
+		hScrollBar="alwaysOff";
+		vScrollBar="dynamic";
+		constantThumbHeight="0";
+		showArrowButtons="1";
+		scrollBarThickness="14";
+		visible = false;
+	};
+	ThemeManager.setProfile(%this.card, "scrollProfile");
+	ThemeManager.setProfile(%this.card, "thumbProfile", "ThumbProfile");
+	ThemeManager.setProfile(%this.card, "trackProfile", "TrackProfile");
+	ThemeManager.setProfile(%this.card, "scrollArrowProfile", "ArrowProfile");
+	%this.add(%this.card);
+	%this.startListening(%this.card);
+
+	%this.gray = "80 80 80 150";
+	%this.yellow = "255 255 100 255";
+	%this.red = "255 80 80 255";
+	%this.darkRed = "200 0 0 200";
+	%this.purple = "255 100 255 255";
+}
+
+function ProjectModulePanel::setTitle(%this, %title)
+{
+	%this.title.setText(%title);
+}
+
+function ProjectModulePanel::clearModules(%this)
+{
+	%this.list.clearItems();
+}
+
+function ProjectModulePanel::getModuleName(%this, %module)
+{
+	%name = %module.ModuleId;
+	if(%module.VersionId !$= "1")
+	{
+		%name = %module.ModuleId @ ":" @ %module.VersionId;
+	}
+	return %name;
+}
+
+function ProjectModulePanelList::onSelect(%this)
+{
+	%index = %this.getSelectedItem();
+	if(%index != -1)
+	{
+		%module = %this.getItemID(%index);
+		%this.postEvent("ModuleSelected", %module);
+	}
+}
+
+function ProjectModulePanel::onModuleSelected(%this, %module)
+{
+	%this.card.show(%module);
+}
+
+function ProjectModulePanel::onClose(%this)
+{
+	%this.list.clearSelection();
+	%this.card.visible = false;
+}
+
+function ProjectModulePanel::sortModules(%this)
+{
+	%this.list.sortByText();
+}

+ 1 - 1
engine/source/platform/platformString_ScriptBinding.h

@@ -240,7 +240,7 @@ ConsoleFunctionWithDocs(strchr, ConsoleString,3,3, ( sourceString , char ))
    return ret ? ret : "";
    return ret ? ret : "";
 }
 }
 
 
-/*! strrchr searches the sourceString for the last occurance of the giuven char
+/*! strrchr searches the sourceString for the last occurance of the given char
     @param sourceString The string to search
     @param sourceString The string to search
     @return Either a string consisting of the given string from the last occurance of the given char on or an empty string if not found
     @return Either a string consisting of the given string from the last occurance of the given char on or an empty string if not found
 */
 */

+ 2 - 1
library/AppCore/module.taml

@@ -7,7 +7,8 @@
 	DestroyFunction="destroy"
 	DestroyFunction="destroy"
 	Project="New Project"
 	Project="New Project"
 	ProjectDescription="Set a course for adventure!"
 	ProjectDescription="Set a course for adventure!"
-	Icon="projectIcon.png" >
+	Icon="projectIcon.png"
+	Synchronized="1" >
 	<DeclaredAssets
 	<DeclaredAssets
 		Path="gui"
 		Path="gui"
 		Extension="asset.taml"
 		Extension="asset.taml"

+ 2 - 1
library/Audio/module.taml

@@ -1,7 +1,8 @@
 <ModuleDefinition
 <ModuleDefinition
 	ModuleId="Audio"
 	ModuleId="Audio"
 	VersionId="1"
 	VersionId="1"
-	Dependencies="AppCore"
+	Dependencies="AppCore=1"
+	Synchronized="1"
     Group="gameBase"
     Group="gameBase"
 	Description="Provides basic audio functionality for music and sound effects."
 	Description="Provides basic audio functionality for music and sound effects."
 	ScriptFile="audio.cs"
 	ScriptFile="audio.cs"