Konstantin Koch 8287c54432 Included the Visual Studio extension and made the necessary changes to make it run.
Replaced the old VS templates with ones that offer more flexiblity.
Started replacing the Content Project for the samples with our custom project type.
Inlcuded a basic not yet working AssimpImporter.
2015-04-08 14:50:03 +02:00

136 lines
5.0 KiB
C#

using Microsoft.VisualStudio.Project;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using ANX.Framework.VisualStudio.Nodes;
namespace ANX.Framework.VisualStudio
{
public class AssetFileDescriptor : DesignPropertyDescriptor
{
ContentProjectNode currentProject;
public AssetFileDescriptor(PropertyDescriptor prop)
: base(prop)
{
currentProject = Utilities.GetCurrentProject();
}
public override void SetValue(object component, object value)
{
var prop = (IncludedAssetFileNodeProperties)component;
switch (this.Name)
{
case "AssetName":
if (IsAssetNameValid((string)value))
prop.AssetName = (string)value;
break;
default:
base.SetValue(component, value);
break;
}
//By refreshing the property grid, we make sure if a converter didn't have any properties and we changed to a converter with properties, it would refresh.
TypeDescriptor.Refresh(component);
}
private bool IsAssetNameValid(string value)
{
if (value == null)
return true;
foreach (var c in Path.GetInvalidFileNameChars())
{
if (value.Contains(c))
return false;
}
return true;
}
public override bool CanResetValue(object component)
{
var prop = (IncludedAssetFileNodeProperties)component;
switch (this.Name)
{
case "AssetName":
return Path.GetFileNameWithoutExtension(prop.FileName) != prop.AssetName;
case "ContentImporter":
using (var domain = currentProject.BuildAppDomain.Aquire())
{
var importer = domain.Proxy.GuessImporterByFileExtension(prop.FileName);
return importer != null && prop.ContentImporter != importer;
}
case "ContentProcessor":
if (string.IsNullOrEmpty(prop.ContentImporter))
return false;
using (var domain = currentProject.BuildAppDomain.Aquire())
{
return prop.ContentProcessor != domain.Proxy.GetDefaultProcessorForImporter(prop.ContentImporter) ||
this.Converter.GetProperties(new TypeDescriptorContext(null, component, this), prop.ContentProcessor).Cast<PropertyDescriptor>().Any((x) => x.CanResetValue(prop.ContentProcessor));
}
case "FileName":
return false;
default:
return base.CanResetValue(component);
}
}
public override void ResetValue(object component)
{
var prop = (IncludedAssetFileNodeProperties)component;
switch (this.Name)
{
case "AssetName":
this.SetValue(component, Path.GetFileNameWithoutExtension(prop.FileName));
return;
case "ContentImporter":
using (var domain = currentProject.BuildAppDomain.Aquire())
{
this.SetValue(component, domain.Proxy.GuessImporterByFileExtension(prop.FileName));
}
return;
case "ContentProcessor":
using (var domain = currentProject.BuildAppDomain.Aquire())
{
this.SetValue(component, domain.Proxy.GetDefaultProcessorForImporter(prop.ContentImporter));
prop.ProcessorParameters.Clear();
}
return;
}
base.ResetValue(component);
}
public override bool ShouldSerializeValue(object component)
{
return this.CanResetValue(component);
}
public override object GetValue(object component)
{
var prop = (IncludedAssetFileNodeProperties)component;
//if no values are present, create default values, a none value is not allowed.
if (string.IsNullOrEmpty(prop.ContentImporter))
using (var buildDomain = currentProject.BuildAppDomain.Aquire())
{
prop.ContentImporter = buildDomain.Proxy.GuessImporterByFileExtension(prop.Extension);
}
if (string.IsNullOrEmpty(prop.ContentProcessor))
using (var buildDomain = currentProject.BuildAppDomain.Aquire())
{
prop.ContentProcessor = buildDomain.Proxy.GetDefaultProcessorForImporter(prop.ContentImporter);
}
return base.GetValue(component);
}
}
}