diff --git a/Source/Editor/Content/Proxy/AnimationGraphFunctionProxy.cs b/Source/Editor/Content/Proxy/AnimationGraphFunctionProxy.cs
index cb611d2f8..a8092a162 100644
--- a/Source/Editor/Content/Proxy/AnimationGraphFunctionProxy.cs
+++ b/Source/Editor/Content/Proxy/AnimationGraphFunctionProxy.cs
@@ -11,14 +11,12 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Animation/Animation Graph Function")]
public class AnimationGraphFunctionProxy : BinaryAssetProxy
{
///
public override string Name => "Animation Graph Function";
- ///
- public override string CategoryName => "Animation";
-
///
public override EditorWindow Open(Editor editor, ContentItem item)
{
diff --git a/Source/Editor/Content/Proxy/AnimationGraphProxy.cs b/Source/Editor/Content/Proxy/AnimationGraphProxy.cs
index 103fee18e..7f43b8c7b 100644
--- a/Source/Editor/Content/Proxy/AnimationGraphProxy.cs
+++ b/Source/Editor/Content/Proxy/AnimationGraphProxy.cs
@@ -11,13 +11,11 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Animation/Animation Graph")]
public class AnimationGraphProxy : BinaryAssetProxy
{
///
public override string Name => "Animation Graph";
-
- ///
- public override string CategoryName => "Animation";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/AnimationProxy.cs b/Source/Editor/Content/Proxy/AnimationProxy.cs
index 07b613dcb..eb8c892ab 100644
--- a/Source/Editor/Content/Proxy/AnimationProxy.cs
+++ b/Source/Editor/Content/Proxy/AnimationProxy.cs
@@ -14,13 +14,11 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Animation/Animation")]
public class AnimationProxy : BinaryAssetProxy
{
///
public override string Name => "Animation";
-
- ///
- public override string CategoryName => "Animation";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/AssetProxy.cs b/Source/Editor/Content/Proxy/AssetProxy.cs
index 772b00a20..6516dbc37 100644
--- a/Source/Editor/Content/Proxy/AssetProxy.cs
+++ b/Source/Editor/Content/Proxy/AssetProxy.cs
@@ -22,11 +22,6 @@ namespace FlaxEditor.Content
///
public abstract string TypeName { get; }
- ///
- /// The category name used to sort in context menus
- ///
- public abstract string CategoryName { get; }
-
///
/// Checks if this proxy supports the given asset type id at the given path.
///
diff --git a/Source/Editor/Content/Proxy/AudioClipProxy.cs b/Source/Editor/Content/Proxy/AudioClipProxy.cs
index f52802234..8b9ace491 100644
--- a/Source/Editor/Content/Proxy/AudioClipProxy.cs
+++ b/Source/Editor/Content/Proxy/AudioClipProxy.cs
@@ -62,9 +62,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Audio Clip";
-
- ///
- public override string CategoryName => "Audio";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/CSharpScriptProxy.cs b/Source/Editor/Content/Proxy/CSharpScriptProxy.cs
index 332695695..a871d0589 100644
--- a/Source/Editor/Content/Proxy/CSharpScriptProxy.cs
+++ b/Source/Editor/Content/Proxy/CSharpScriptProxy.cs
@@ -12,6 +12,7 @@ namespace FlaxEditor.Content
/// Context proxy object for C# script files.
///
///
+ [ContentContextMenu("New/C# Script")]
public class CSharpScriptProxy : ScriptProxy
{
///
diff --git a/Source/Editor/Content/Proxy/CollisionDataProxy.cs b/Source/Editor/Content/Proxy/CollisionDataProxy.cs
index 4bddbf063..b6ff2e75f 100644
--- a/Source/Editor/Content/Proxy/CollisionDataProxy.cs
+++ b/Source/Editor/Content/Proxy/CollisionDataProxy.cs
@@ -38,13 +38,11 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Physics/Collision Data")]
class CollisionDataProxy : BinaryAssetProxy
{
///
public override string Name => "Collision Data";
-
- ///
- public override string CategoryName => "Physics";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/CppProxy.cs b/Source/Editor/Content/Proxy/CppProxy.cs
index d975b8778..6581dccd2 100644
--- a/Source/Editor/Content/Proxy/CppProxy.cs
+++ b/Source/Editor/Content/Proxy/CppProxy.cs
@@ -75,6 +75,7 @@ namespace FlaxEditor.Content
/// Context proxy object for C++ script files.
///
///
+ [ContentContextMenu("New/C++/C++ Script")]
public class CppScriptProxy : CppProxy
{
///
@@ -98,6 +99,7 @@ namespace FlaxEditor.Content
/// Context proxy object for C++ Json Asset files.
///
///
+ [ContentContextMenu("New/C++/C++ Function Library")]
public class CppStaticClassProxy : CppProxy
{
///
@@ -115,6 +117,7 @@ namespace FlaxEditor.Content
/// Context proxy object for C++ Json Asset files.
///
///
+ [ContentContextMenu("New/C++/C++ Json Asset")]
public class CppAssetProxy : CppProxy
{
///
diff --git a/Source/Editor/Content/Proxy/CubeTextureProxy.cs b/Source/Editor/Content/Proxy/CubeTextureProxy.cs
index 653e71ce3..d89771b13 100644
--- a/Source/Editor/Content/Proxy/CubeTextureProxy.cs
+++ b/Source/Editor/Content/Proxy/CubeTextureProxy.cs
@@ -20,9 +20,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Cube Texture";
-
- ///
- public override string CategoryName => "Texture";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/FontProxy.cs b/Source/Editor/Content/Proxy/FontProxy.cs
index bb78d5ab0..10f0d9076 100644
--- a/Source/Editor/Content/Proxy/FontProxy.cs
+++ b/Source/Editor/Content/Proxy/FontProxy.cs
@@ -17,9 +17,6 @@ namespace FlaxEditor.Content
{
///
public override string Name => "Font";
-
- ///
- public override string CategoryName => "Font";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/GameplayGlobalsProxy.cs b/Source/Editor/Content/Proxy/GameplayGlobalsProxy.cs
index 60a9b78bb..af391a8c4 100644
--- a/Source/Editor/Content/Proxy/GameplayGlobalsProxy.cs
+++ b/Source/Editor/Content/Proxy/GameplayGlobalsProxy.cs
@@ -11,13 +11,11 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Gameplay Globals")]
public class GameplayGlobalsProxy : BinaryAssetProxy
{
///
public override string Name => "Gameplay Globals";
-
- ///
- public override string CategoryName => "Globals";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/IESProfileProxy.cs b/Source/Editor/Content/Proxy/IESProfileProxy.cs
index 8ec932106..55b4c8d47 100644
--- a/Source/Editor/Content/Proxy/IESProfileProxy.cs
+++ b/Source/Editor/Content/Proxy/IESProfileProxy.cs
@@ -20,9 +20,6 @@ namespace FlaxEditor.Content
///
public override string Name => "IES Profile";
-
- ///
- public override string CategoryName => "Lighting";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/JsonAssetProxy.cs b/Source/Editor/Content/Proxy/JsonAssetProxy.cs
index 2f48a1b6c..8bfaae384 100644
--- a/Source/Editor/Content/Proxy/JsonAssetProxy.cs
+++ b/Source/Editor/Content/Proxy/JsonAssetProxy.cs
@@ -22,6 +22,7 @@ namespace FlaxEditor.Content
/// Json assets proxy.
///
///
+ [ContentContextMenu("New/Json Asset")]
public abstract class JsonAssetProxy : JsonAssetBaseProxy
{
///
@@ -31,9 +32,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Json Asset";
-
- ///
- public override string CategoryName => "Json Asset";
///
public override string FileExtension => Extension;
@@ -168,20 +166,6 @@ namespace FlaxEditor.Content
///
public override string Name { get; } = Utilities.Utils.GetPropertyNameUI(typeof(T).Name);
- private string _categoryName;
-
- ///
- public override string CategoryName => _categoryName;
-
- ///
- /// Sets the category name
- ///
- /// This is the category name
- public void SetCategoryName(string name)
- {
- _categoryName = name;
- }
-
///
public override bool CanCreate(ContentFolder targetLocation)
{
diff --git a/Source/Editor/Content/Proxy/MaterialFunctionProxy.cs b/Source/Editor/Content/Proxy/MaterialFunctionProxy.cs
index c2c317342..f8c868cb5 100644
--- a/Source/Editor/Content/Proxy/MaterialFunctionProxy.cs
+++ b/Source/Editor/Content/Proxy/MaterialFunctionProxy.cs
@@ -11,13 +11,11 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Material/Material Function")]
public class MaterialFunctionProxy : BinaryAssetProxy
{
///
public override string Name => "Material Function";
-
- ///
- public override string CategoryName => "Material";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/MaterialInstanceProxy.cs b/Source/Editor/Content/Proxy/MaterialInstanceProxy.cs
index ea0a73cbe..60ff9bc51 100644
--- a/Source/Editor/Content/Proxy/MaterialInstanceProxy.cs
+++ b/Source/Editor/Content/Proxy/MaterialInstanceProxy.cs
@@ -14,15 +14,13 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Material/Material Instance")]
public class MaterialInstanceProxy : BinaryAssetProxy
{
private MaterialPreview _preview;
///
public override string Name => "Material Instance";
-
- ///
- public override string CategoryName => "Material";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/MaterialProxy.cs b/Source/Editor/Content/Proxy/MaterialProxy.cs
index 2da83bf96..68c9c81b7 100644
--- a/Source/Editor/Content/Proxy/MaterialProxy.cs
+++ b/Source/Editor/Content/Proxy/MaterialProxy.cs
@@ -15,15 +15,13 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Material/Material")]
public class MaterialProxy : BinaryAssetProxy
{
private MaterialPreview _preview;
///
public override string Name => "Material";
-
- ///
- public override string CategoryName => "Material";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/ModelProxy.cs b/Source/Editor/Content/Proxy/ModelProxy.cs
index ed0633ce4..b99d15134 100644
--- a/Source/Editor/Content/Proxy/ModelProxy.cs
+++ b/Source/Editor/Content/Proxy/ModelProxy.cs
@@ -21,9 +21,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Model";
-
- ///
- public override string CategoryName => "Model";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/ParticleEmitterFunctionProxy.cs b/Source/Editor/Content/Proxy/ParticleEmitterFunctionProxy.cs
index c56e5f695..b508bb818 100644
--- a/Source/Editor/Content/Proxy/ParticleEmitterFunctionProxy.cs
+++ b/Source/Editor/Content/Proxy/ParticleEmitterFunctionProxy.cs
@@ -11,13 +11,11 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Particles/Particle Emitter Function")]
public class ParticleEmitterFunctionProxy : BinaryAssetProxy
{
///
public override string Name => "Particle Emitter Function";
-
- ///
- public override string CategoryName => "Particles";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs b/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs
index 391670085..be07720d2 100644
--- a/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs
+++ b/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs
@@ -15,6 +15,7 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Particles/Particle Emitter")]
public class ParticleEmitterProxy : BinaryAssetProxy
{
private ParticleEmitterPreview _preview;
@@ -22,9 +23,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Particle Emitter";
-
- ///
- public override string CategoryName => "Particles";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/ParticleSystemProxy.cs b/Source/Editor/Content/Proxy/ParticleSystemProxy.cs
index b1fda9b60..38301afdf 100644
--- a/Source/Editor/Content/Proxy/ParticleSystemProxy.cs
+++ b/Source/Editor/Content/Proxy/ParticleSystemProxy.cs
@@ -39,6 +39,7 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Particles/Particle System")]
public class ParticleSystemProxy : BinaryAssetProxy
{
private ParticleSystemPreview _preview;
@@ -46,9 +47,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Particle System";
-
- ///
- public override string CategoryName => "Particles";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/PrefabProxy.cs b/Source/Editor/Content/Proxy/PrefabProxy.cs
index 16e00069f..a4610b25a 100644
--- a/Source/Editor/Content/Proxy/PrefabProxy.cs
+++ b/Source/Editor/Content/Proxy/PrefabProxy.cs
@@ -15,6 +15,7 @@ namespace FlaxEditor.Content
/// Content proxy for .
///
///
+ [ContentContextMenu("New/Prefab")]
public sealed class PrefabProxy : JsonAssetBaseProxy
{
private PrefabPreview _preview;
@@ -31,9 +32,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Prefab";
-
- ///
- public override string CategoryName => "Prefab";
///
public override string FileExtension => Extension;
diff --git a/Source/Editor/Content/Proxy/PreviewsCacheProxy.cs b/Source/Editor/Content/Proxy/PreviewsCacheProxy.cs
index 16c6ae9f2..b3bc6e73f 100644
--- a/Source/Editor/Content/Proxy/PreviewsCacheProxy.cs
+++ b/Source/Editor/Content/Proxy/PreviewsCacheProxy.cs
@@ -15,9 +15,6 @@ namespace FlaxEditor.Content
{
///
public override string Name => "Previews Cache";
-
- ///
- public override string CategoryName => "Previews Cache";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/SceneAnimationProxy.cs b/Source/Editor/Content/Proxy/SceneAnimationProxy.cs
index 4bebe20f6..30409208e 100644
--- a/Source/Editor/Content/Proxy/SceneAnimationProxy.cs
+++ b/Source/Editor/Content/Proxy/SceneAnimationProxy.cs
@@ -40,9 +40,6 @@ namespace FlaxEditor.Content
{
///
public override string Name => "Scene Animation";
-
- ///
- public override string CategoryName => "Animation";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/SceneProxy.cs b/Source/Editor/Content/Proxy/SceneProxy.cs
index 6be481250..cecd825a1 100644
--- a/Source/Editor/Content/Proxy/SceneProxy.cs
+++ b/Source/Editor/Content/Proxy/SceneProxy.cs
@@ -10,6 +10,7 @@ namespace FlaxEditor.Content
/// Content proxy for .
///
///
+ [ContentContextMenu("New/Scene")]
public sealed class SceneProxy : JsonAssetBaseProxy
{
///
@@ -19,9 +20,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Scene";
-
- ///
- public override string CategoryName => "Scene";
///
public override string FileExtension => Extension;
diff --git a/Source/Editor/Content/Proxy/SettingsProxy.cs b/Source/Editor/Content/Proxy/SettingsProxy.cs
index abe63f06e..651ba62d2 100644
--- a/Source/Editor/Content/Proxy/SettingsProxy.cs
+++ b/Source/Editor/Content/Proxy/SettingsProxy.cs
@@ -11,6 +11,7 @@ namespace FlaxEditor.Content
/// Content proxy for json settings assets (e.g or ).
///
///
+ [ContentContextMenu("New/Settings")]
public class SettingsProxy : JsonAssetProxy
{
private readonly Type _type;
@@ -20,9 +21,6 @@ namespace FlaxEditor.Content
/// Gets the settings type.
///
public Type Type => _type;
-
- ///
- public override string CategoryName => "Settings";
///
/// Initializes a new instance of the class.
diff --git a/Source/Editor/Content/Proxy/ShaderProxy.cs b/Source/Editor/Content/Proxy/ShaderProxy.cs
index 76fd02897..b65949460 100644
--- a/Source/Editor/Content/Proxy/ShaderProxy.cs
+++ b/Source/Editor/Content/Proxy/ShaderProxy.cs
@@ -14,9 +14,6 @@ namespace FlaxEditor.Content
{
///
public override string Name => "Shader";
-
- ///
- public override string CategoryName => "Shader";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/SkeletonMaskProxy.cs b/Source/Editor/Content/Proxy/SkeletonMaskProxy.cs
index d84bf3fe8..ab78a1e09 100644
--- a/Source/Editor/Content/Proxy/SkeletonMaskProxy.cs
+++ b/Source/Editor/Content/Proxy/SkeletonMaskProxy.cs
@@ -11,13 +11,11 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Animation/Skeleton Mask")]
public class SkeletonMaskProxy : BinaryAssetProxy
{
///
public override string Name => "Skeleton Mask";
-
- ///
- public override string CategoryName => "Animation";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Content/Proxy/SkinnedModelProxy.cs b/Source/Editor/Content/Proxy/SkinnedModelProxy.cs
index 18276604e..597c69a1d 100644
--- a/Source/Editor/Content/Proxy/SkinnedModelProxy.cs
+++ b/Source/Editor/Content/Proxy/SkinnedModelProxy.cs
@@ -20,9 +20,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Skinned Model";
-
- ///
- public override string CategoryName => "Model";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/SpriteAtlasProxy.cs b/Source/Editor/Content/Proxy/SpriteAtlasProxy.cs
index fce7e22e5..5184abafb 100644
--- a/Source/Editor/Content/Proxy/SpriteAtlasProxy.cs
+++ b/Source/Editor/Content/Proxy/SpriteAtlasProxy.cs
@@ -20,9 +20,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Sprite Atlas";
-
- ///
- public override string CategoryName => "Sprites";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/TextureProxy.cs b/Source/Editor/Content/Proxy/TextureProxy.cs
index ce292d5b3..67de33851 100644
--- a/Source/Editor/Content/Proxy/TextureProxy.cs
+++ b/Source/Editor/Content/Proxy/TextureProxy.cs
@@ -20,9 +20,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Texture";
-
- ///
- public override string CategoryName => "Texture";
///
public override bool CanReimport(ContentItem item)
diff --git a/Source/Editor/Content/Proxy/VisualScriptProxy.cs b/Source/Editor/Content/Proxy/VisualScriptProxy.cs
index 540e46945..afd105131 100644
--- a/Source/Editor/Content/Proxy/VisualScriptProxy.cs
+++ b/Source/Editor/Content/Proxy/VisualScriptProxy.cs
@@ -15,6 +15,7 @@ namespace FlaxEditor.Content
/// A asset proxy object.
///
///
+ [ContentContextMenu("New/Visual Script")]
public class VisualScriptProxy : BinaryAssetProxy, IScriptTypesContainer
{
internal VisualScriptProxy()
@@ -24,9 +25,6 @@ namespace FlaxEditor.Content
///
public override string Name => "Visual Script";
-
- ///
- public override string CategoryName => "Scripting";
///
public override EditorWindow Open(Editor editor, ContentItem item)
diff --git a/Source/Editor/Modules/ContentDatabaseModule.cs b/Source/Editor/Modules/ContentDatabaseModule.cs
index 990d42615..a3ee714ae 100644
--- a/Source/Editor/Modules/ContentDatabaseModule.cs
+++ b/Source/Editor/Modules/ContentDatabaseModule.cs
@@ -927,9 +927,7 @@ namespace FlaxEditor.Modules
Proxy.Add(new VisualScriptProxy());
Proxy.Add(new LocalizedStringTableProxy());
Proxy.Add(new FileProxy());
- var pm = new SpawnableJsonAssetProxy();
- pm.SetCategoryName("Physics");
- Proxy.Add(pm);
+ Proxy.Add(new SpawnableJsonAssetProxy());
// Settings
Proxy.Add(new SettingsProxy(typeof(GameSettings), Editor.Instance.Icons.GameSettings128));
diff --git a/Source/Editor/Windows/ContentWindow.ContextMenu.cs b/Source/Editor/Windows/ContentWindow.ContextMenu.cs
index 7f27e0cd3..36d3e4938 100644
--- a/Source/Editor/Windows/ContentWindow.ContextMenu.cs
+++ b/Source/Editor/Windows/ContentWindow.ContextMenu.cs
@@ -1,6 +1,7 @@
// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
using System;
+using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using FlaxEditor.Content;
@@ -152,64 +153,78 @@ namespace FlaxEditor.Windows
{
cm.AddButton("New folder", NewFolder);
}
-
- // categorize the asset proxies according to their category name
- Dictionary> categorizedProxyList = new Dictionary>();
- for (int i = 0; i < Editor.ContentDatabase.Proxy.Count; i++)
+
+ // loop through each proxy and user defined json type and add them to the context menu
+ foreach (var type in Editor.CodeEditing.All.Get())
{
- var p = Editor.ContentDatabase.Proxy[i];
+ if (type.IsAbstract || !type.HasAttribute(typeof(ContentContextMenuAttribute), true))
+ continue;
+
+ ContentContextMenuAttribute attribute = null;
+ foreach (var typeAttribute in type.GetAttributes(true))
+ {
+ if (typeAttribute is ContentContextMenuAttribute contentContextMenuAttribute)
+ {
+ attribute = contentContextMenuAttribute;
+ break;
+ }
+ }
+
+ ContentProxy p;
+ if (type.Type.IsSubclassOf(typeof(ContentProxy)))
+ {
+ p = Editor.ContentDatabase.Proxy.Find(T => T.GetType() == type.Type);
+ }
+ else
+ {
+ // user can use attribute to put their own assets into the content context menu
+ var generic = typeof(SpawnableJsonAssetProxy<>).MakeGenericType(type.Type);
+ var instance = Activator.CreateInstance(generic);
+ dynamic obj = instance;
+ p = obj as AssetProxy;
+ }
+
+ if (p == null)
+ continue;
+
+ // create menus
if (p.CanCreate(folder))
{
- if (p is AssetProxy ap)
+ var splitPath = attribute.Path.Split('/');
+ ContextMenuChildMenu childCM = null;
+ bool mainCM = true;
+ for (int i = 0; i < splitPath?.Length; i++)
{
- if (categorizedProxyList.ContainsKey(ap.CategoryName))
+ if (i == splitPath.Length - 1)
{
- categorizedProxyList.TryGetValue(ap.CategoryName, out var apList);
- apList?.Add(ap);
+ if (mainCM)
+ {
+ cm.AddButton(splitPath[i].Trim(), () => NewItem(p));
+ mainCM = false;
+ }
+ else
+ {
+ childCM?.ContextMenu.AddButton(splitPath[i].Trim(), () => NewItem(p));
+ childCM.ContextMenu.AutoSort = true;
+ }
}
else
{
- categorizedProxyList.Add(ap.CategoryName, new List() {ap});
+ if (mainCM)
+ {
+ childCM = cm.GetOrAddChildMenu(splitPath[i].Trim());
+ mainCM = false;
+ }
+ else
+ {
+ childCM = childCM?.ContextMenu.GetOrAddChildMenu(splitPath[i].Trim());
+ }
+ childCM.ContextMenu.AutoSort = true;
}
}
}
}
- c = cm.AddChildMenu("New");
- c.ContextMenu.Tag = item;
- c.ContextMenu.AutoSort = true;
- int newItems = 0;
- for (int i = 0; i < Editor.ContentDatabase.Proxy.Count; i++)
- {
- var p = Editor.ContentDatabase.Proxy[i];
- if (p.CanCreate(folder))
- {
- if (p is AssetProxy ap && categorizedProxyList.TryGetValue(ap.CategoryName, out var apList))
- {
- if (apList.Contains(ap))
- {
- if (apList.Count > 1)
- {
- var childMenu = c.ContextMenu.GetOrAddChildMenu(ap.CategoryName);
- childMenu.ContextMenu.AutoSort = true;
- childMenu.ContextMenu.AddButton(p.Name, () => NewItem(p));
- }
- else
- {
- c.ContextMenu.AddButton(p.Name, () => NewItem(p));
- }
- }
- }
- else
- {
- c.ContextMenu.AddButton(p.Name, () => NewItem(p));
- }
-
- newItems++;
- }
- }
- c.Enabled = newItems > 0;
-
if (folder.CanHaveAssets)
{
cm.AddButton("Import file", () =>
diff --git a/Source/Engine/Physics/PhysicalMaterial.h b/Source/Engine/Physics/PhysicalMaterial.h
index 0d8356546..b46c1a294 100644
--- a/Source/Engine/Physics/PhysicalMaterial.h
+++ b/Source/Engine/Physics/PhysicalMaterial.h
@@ -8,7 +8,7 @@
///
/// Physical materials are used to define the response of a physical object when interacting dynamically with the world.
///
-API_CLASS() class FLAXENGINE_API PhysicalMaterial final : public ISerializable
+API_CLASS(Attributes = "ContentContextMenu(\"New/Physics/Physical Material\")") class FLAXENGINE_API PhysicalMaterial final : public ISerializable
{
API_AUTO_SERIALIZATION();
DECLARE_SCRIPTING_TYPE_MINIMAL(PhysicalMaterial);
diff --git a/Source/Engine/Scripting/Attributes/Editor/ContentContextMenu.cs b/Source/Engine/Scripting/Attributes/Editor/ContentContextMenu.cs
new file mode 100644
index 000000000..ee9956ede
--- /dev/null
+++ b/Source/Engine/Scripting/Attributes/Editor/ContentContextMenu.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace FlaxEngine
+{
+ ///
+ /// This attribute is used to show content items that can be created in the content browser context menu. Separate the subcontext menus with a /.
+ ///
+ [Serializable]
+ [AttributeUsage(AttributeTargets.Class)]
+ public class ContentContextMenuAttribute : Attribute
+ {
+ ///
+ /// The path to be used in the context menu
+ ///
+ public string Path;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The path to use to create the context menu
+ public ContentContextMenuAttribute(string path)
+ {
+ Path = path;
+ }
+ }
+}