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.
136 lines
5.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|