Content Pipeline:

- Fixed wrong XML parsing in ContentProject at read time

Content Compiler:
- Implemented the ability to add files to a project.
- Implemented showing and renaming properties of BuildItems and ContentProjects
- NewProjectScreen now checks if the project already exists
- Added some TreeViewExtensions
This commit is contained in:
SND\eagleeyestudios_cp 2012-09-01 16:30:35 +00:00
parent 379a1bc50e
commit 4e875e2115
9 changed files with 246 additions and 8 deletions

View File

@ -199,6 +199,7 @@ namespace ANX.Framework.Content.Pipeline.Tasks
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
}
writer.WriteEndElement();
@ -309,23 +310,36 @@ namespace ANX.Framework.Content.Pipeline.Tasks
case "BuildItem":
if (versionMajor == 1 && versionMinor >= 0)
{
if (reader.NodeType != XmlNodeType.Element)
break;
var buildItem = new BuildItem();
lastBuildItem = buildItem;
if (reader.NodeType == XmlNodeType.Attribute)
reader.MoveToFirstAttribute();
while (reader.NodeType == XmlNodeType.Attribute)
{
switch (reader.Name)
{
case "AssetName":
buildItem.AssetName = reader.ReadContentAsString();
reader.MoveToNextAttribute();
break;
case "OutputFilename":
buildItem.OutputFilename = reader.ReadContentAsString();
reader.MoveToNextAttribute();
break;
case "Importer":
buildItem.ImporterName = reader.ReadContentAsString();
reader.MoveToNextAttribute();
break;
case "Processor":
buildItem.ProcessorName = reader.ReadContentAsString();
if (buildItem.AssetName == null)
reader.MoveToNextAttribute();
else
reader.Read();
break;
case "":
reader.Read();
break;
}
}

View File

@ -22,6 +22,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>true</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -123,6 +124,7 @@
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TreeViewExtensions.cs" />
<EmbeddedResource Include="Controls\ArrowButton.resx">
<DependentUpon>ArrowButton.cs</DependentUpon>
</EmbeddedResource>

View File

@ -59,6 +59,8 @@ namespace ANX.ContentCompiler.GUI.Dialogues
{
if (String.IsNullOrEmpty(textBoxName.Text))
MessageBox.Show("Give your child a name!", "Missing value", MessageBoxButtons.OK, MessageBoxIcon.Warning);
else if (Directory.Exists(textBoxLocation.Text))
MessageBox.Show("A project with this name already exists in that path!", "Will not overwrite existing stuff", MessageBoxButtons.OK, MessageBoxIcon.Error);
else
DialogResult = DialogResult.OK;
}

View File

@ -259,6 +259,7 @@ namespace ANX.ContentCompiler.GUI
this.treeView.Name = "treeView";
this.treeView.Size = new System.Drawing.Size(219, 527);
this.treeView.TabIndex = 0;
this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.TreeViewAfterSelect);
//
// treeViewContextMenu
//
@ -318,7 +319,7 @@ namespace ANX.ContentCompiler.GUI
this.splitContainerProperties.Panel2.Controls.Add(this.propertyGrid);
this.splitContainerProperties.Panel2.ForeColor = System.Drawing.Color.White;
this.splitContainerProperties.Size = new System.Drawing.Size(640, 549);
this.splitContainerProperties.SplitterDistance = 409;
this.splitContainerProperties.SplitterDistance = 366;
this.splitContainerProperties.TabIndex = 0;
//
// editingState
@ -327,7 +328,7 @@ namespace ANX.ContentCompiler.GUI
this.editingState.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.editingState.Location = new System.Drawing.Point(0, 0);
this.editingState.Name = "editingState";
this.editingState.Size = new System.Drawing.Size(407, 547);
this.editingState.Size = new System.Drawing.Size(364, 547);
this.editingState.TabIndex = 1;
this.editingState.Visible = false;
//
@ -337,7 +338,7 @@ namespace ANX.ContentCompiler.GUI
this.startState.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.startState.Location = new System.Drawing.Point(0, 0);
this.startState.Name = "startState";
this.startState.Size = new System.Drawing.Size(407, 547);
this.startState.Size = new System.Drawing.Size(364, 547);
this.startState.TabIndex = 0;
this.startState.Visible = false;
//
@ -349,7 +350,7 @@ namespace ANX.ContentCompiler.GUI
this.labelProperties.ForeColor = System.Drawing.Color.White;
this.labelProperties.Location = new System.Drawing.Point(3, 0);
this.labelProperties.Name = "labelProperties";
this.labelProperties.Size = new System.Drawing.Size(221, 19);
this.labelProperties.Size = new System.Drawing.Size(264, 19);
this.labelProperties.TabIndex = 2;
this.labelProperties.Text = "Properties";
this.labelProperties.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
@ -370,10 +371,11 @@ namespace ANX.ContentCompiler.GUI
this.propertyGrid.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.propertyGrid.Location = new System.Drawing.Point(3, 22);
this.propertyGrid.Name = "propertyGrid";
this.propertyGrid.Size = new System.Drawing.Size(221, 503);
this.propertyGrid.Size = new System.Drawing.Size(264, 503);
this.propertyGrid.TabIndex = 0;
this.propertyGrid.ViewBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(44)))), ((int)(((byte)(44)))), ((int)(((byte)(44)))));
this.propertyGrid.ViewForeColor = System.Drawing.Color.White;
this.propertyGrid.PropertyValueChanged += new System.Windows.Forms.PropertyValueChangedEventHandler(this.PropertyGridPropertyValueChanged);
//
// menuState
//

View File

@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using ANX.ContentCompiler.GUI.Dialogues;
using ANX.Framework.Content.Pipeline;
@ -103,6 +105,7 @@ namespace ANX.ContentCompiler.GUI
_contentProject = new ContentProject(ProjectName)
{
OutputDirectory = ProjectOutputDir,
InputDirectory = ProjectFolder,
Configuration = "Release",
Creator = "ANX Content Compiler (4.0)",
ContentRoot = "Content",
@ -166,6 +169,42 @@ namespace ANX.ContentCompiler.GUI
}
#endregion
#region FileMethods
private void AddFile(string file)
{
if (!File.Exists(file))
throw new FileNotFoundException();
var folder = _contentProject.ContentRoot;
var node = treeView.SelectedNode;
if (node != null)
folder = node.Name;
else
node = treeView.Nodes[0];
var absPath = ProjectFolder + Path.DirectorySeparatorChar + folder + Path.DirectorySeparatorChar + Path.GetFileName(file);
if (!Directory.Exists(Path.Combine(ProjectFolder, folder)))
Directory.CreateDirectory(Path.Combine(ProjectFolder, folder));
File.Copy(file, absPath);
var item = new BuildItem
{
AssetName = String.IsNullOrEmpty(folder) ? folder.Replace(_contentProject.ContentRoot, "") + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(file) : Path.GetFileNameWithoutExtension(file),
SourceFilename = absPath,
OutputFilename = ProjectOutputDir + Path.DirectorySeparatorChar + folder + Path.DirectorySeparatorChar + Path.GetFileName(file),
ImporterName = ImporterManager.GuessImporterByFileExtension(file)
};
_contentProject.BuildItems.Add(item);
}
public void AddFiles(string[] files)
{
foreach (var file in files)
{
AddFile(file);
}
ChangeEnvironmentOpenProject();
}
#endregion
#region EnvironmentStates
public void ChangeEnvironmentStartState()
{
@ -173,6 +212,8 @@ namespace ANX.ContentCompiler.GUI
startState.Visible = true;
Text = "ANX Content Compiler 4";
labelTitle.Text = "ANX Content Compiler 4";
treeView.Nodes.Clear();
propertyGrid.SelectedObject = null;
}
public void ChangeEnvironmentOpenProject()
@ -181,6 +222,68 @@ namespace ANX.ContentCompiler.GUI
editingState.Visible = true;
Text = ProjectName + " - ANX Content Compiler 4";
labelTitle.Text = "ANX Content Compiler 4 - " + ProjectName;
ProjectFolder = _contentProject.InputDirectory;
treeView.Nodes.Clear();
var rootNode = new TreeNode(ProjectName + "(" + _contentProject.ContentRoot + ")") {Name = _contentProject.ContentRoot};
treeView.Nodes.Add(rootNode);
var lastNode = rootNode;
foreach (var parts in _contentProject.BuildItems.Select(buildItem => buildItem.AssetName.Split('/')).Where(parts => parts.Length >= 2))
{
for (int i=0; i < parts.Length - 1; i++)
{
var node = new TreeNode(parts[i]) {Name = lastNode.Name + "/" + parts[i] + "/"};
if (!lastNode.Nodes.Contains(node))
{
lastNode.Nodes.Add(node);
lastNode = node;
}
else
{
lastNode = lastNode.Nodes[parts[i]];
}
}
lastNode = rootNode;
}
if (_contentProject.BuildItems.Count > 0)
{
foreach (var buildItem in _contentProject.BuildItems)
{
String[] parts = null;
if (buildItem.AssetName.Contains("\\"))
parts = buildItem.AssetName.Split('\\');
else if (buildItem.AssetName.Contains("/"))
parts = buildItem.AssetName.Split('/');
/*if (parts.Length >= 2)
{
for (int i = 0; i < parts.Length - 1; i++)
{
lastNode = lastNode.Nodes[parts[i]];
}
}*/
string path = "";
if (parts != null)
{
for (int i = 0; i < parts.Length - 1; i++)
{
path = parts[i];
}
}
if (!String.IsNullOrEmpty(path))
{
var node = treeView.RecursiveSearch(path);
if (node == null) throw new ArgumentNullException("Node not found!");
var item = new TreeNode(parts[parts.Length - 1]) {Name = buildItem.AssetName};
node.Nodes.Add(item);
}
else
{
var item = new TreeNode(buildItem.AssetName) {Name = buildItem.AssetName};
treeView.Nodes[0].Nodes.Add(item);
}
}
}
}
#endregion
@ -295,5 +398,39 @@ namespace ANX.ContentCompiler.GUI
}
#endregion
#region TreeViewEvents
private void TreeViewAfterSelect(object sender, TreeViewEventArgs e)
{
if (treeView.SelectedNode == treeView.TopNode)
propertyGrid.SelectedObject = _contentProject;
else
{
foreach (var buildItem in _contentProject.BuildItems.Where(buildItem => buildItem.AssetName.Equals(treeView.SelectedNode.Name)))
{
propertyGrid.SelectedObject = buildItem;
}
}
}
#endregion
#region PropertyGridEvents
private void PropertyGridPropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
ProjectName = _contentProject.Name;
ProjectImportersDir = _contentProject.ReferenceIncludeDirectory;
ProjectFolder = _contentProject.InputDirectory;
ProjectOutputDir = _contentProject.OutputDirectory;
if (e.ChangedItem.Label.Equals("ContentRoot"))
{
foreach (BuildItem buildItem in _contentProject.BuildItems)
{
buildItem.AssetName = buildItem.AssetName.Replace((string)e.OldValue, _contentProject.ContentRoot);
}
treeView.Nodes[0].RecursivelyReplacePartOfName((string)e.OldValue, _contentProject.ContentRoot);
}
ChangeEnvironmentOpenProject();
}
#endregion
}
}

View File

@ -58,6 +58,7 @@
this.arrowButtonAddFiles.Name = "arrowButtonAddFiles";
this.arrowButtonAddFiles.Size = new System.Drawing.Size(348, 64);
this.arrowButtonAddFiles.TabIndex = 5;
this.arrowButtonAddFiles.Click += new System.EventHandler(this.ArrowButtonAddFilesClick);
//
// arrowButtonCreateFolder
//

View File

@ -16,5 +16,16 @@ namespace ANX.ContentCompiler.GUI.States
BackColor = Settings.MainColor;
}
private void ArrowButtonAddFilesClick(object sender, EventArgs e)
{
using (var dlg = new OpenFileDialog())
{
dlg.Multiselect = true;
dlg.Title = "Add files";
if (dlg.ShowDialog() == DialogResult.OK)
MainWindow.Instance.AddFiles(dlg.FileNames);
}
}
}
}

View File

@ -112,9 +112,9 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ANX.ContentCompiler.GUI
{
public static class TreeViewExtensions
{
/// <summary>
/// Performs a recursive search on this TreeView's nodes and its child nodes. Returns the first item found.
/// </summary>
/// <param name="treeView">The TreeView</param>
/// <param name="name">Name to search for</param>
/// <returns>The first node matching the given criteria or null</returns>
public static TreeNode RecursiveSearch(this TreeView treeView, String name)
{
foreach (TreeNode treeNode in treeView.Nodes)
{
if (treeNode.Name.Equals(name))
return treeNode;
var retNode = treeNode.RecursiveSearch(name);
if (retNode != null)
{
return retNode;
}
}
return null;
}
/// <summary>
/// Performs a recursive search on this TreeNode's nodes and their child nodes. Returns the first item found.
/// </summary>
/// <param name="treeNode">The TreeNode</param>
/// <param name="name">Name to search for</param>
/// <returns>The first node matching the given criteria or null</returns>
public static TreeNode RecursiveSearch(this TreeNode treeNode, String name)
{
foreach (TreeNode node in treeNode.Nodes)
{
if (node.Name.Equals(name))
return node;
var ret = node.RecursiveSearch(name);
if (ret != null)
return ret;
}
return null;
}
/// <summary>
/// Recursively replaces all parts of the names/texts with new values.
/// </summary>
/// <param name="tree"></param>
/// <param name="old"></param>
/// <param name="newString"></param>
public static void RecursivelyReplacePartOfName(this TreeNode tree, string old, string newString)
{
tree.Name = tree.Name.Replace(old, newString);
tree.Text = tree.Text.Replace(old, newString);
foreach (TreeNode node in tree.Nodes)
{
node.RecursivelyReplacePartOfName(old, newString);
}
}
}
}