diff --git a/Source/Editor/Content/Proxy/AnimationGraphFunctionProxy.cs b/Source/Editor/Content/Proxy/AnimationGraphFunctionProxy.cs
index c4ea2e09a..cb611d2f8 100644
--- a/Source/Editor/Content/Proxy/AnimationGraphFunctionProxy.cs
+++ b/Source/Editor/Content/Proxy/AnimationGraphFunctionProxy.cs
@@ -16,6 +16,9 @@ namespace FlaxEditor.Content
///
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 3c445c104..103fee18e 100644
--- a/Source/Editor/Content/Proxy/AnimationGraphProxy.cs
+++ b/Source/Editor/Content/Proxy/AnimationGraphProxy.cs
@@ -15,6 +15,9 @@ namespace FlaxEditor.Content
{
///
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 bda0fa98d..07b613dcb 100644
--- a/Source/Editor/Content/Proxy/AnimationProxy.cs
+++ b/Source/Editor/Content/Proxy/AnimationProxy.cs
@@ -18,6 +18,9 @@ namespace FlaxEditor.Content
{
///
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 6516dbc37..772b00a20 100644
--- a/Source/Editor/Content/Proxy/AssetProxy.cs
+++ b/Source/Editor/Content/Proxy/AssetProxy.cs
@@ -22,6 +22,11 @@ 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 8b9ace491..f52802234 100644
--- a/Source/Editor/Content/Proxy/AudioClipProxy.cs
+++ b/Source/Editor/Content/Proxy/AudioClipProxy.cs
@@ -62,6 +62,9 @@ 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/CollisionDataProxy.cs b/Source/Editor/Content/Proxy/CollisionDataProxy.cs
index cca8a8192..4bddbf063 100644
--- a/Source/Editor/Content/Proxy/CollisionDataProxy.cs
+++ b/Source/Editor/Content/Proxy/CollisionDataProxy.cs
@@ -42,6 +42,9 @@ namespace FlaxEditor.Content
{
///
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/CubeTextureProxy.cs b/Source/Editor/Content/Proxy/CubeTextureProxy.cs
index d89771b13..653e71ce3 100644
--- a/Source/Editor/Content/Proxy/CubeTextureProxy.cs
+++ b/Source/Editor/Content/Proxy/CubeTextureProxy.cs
@@ -20,6 +20,9 @@ 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 10f0d9076..bb78d5ab0 100644
--- a/Source/Editor/Content/Proxy/FontProxy.cs
+++ b/Source/Editor/Content/Proxy/FontProxy.cs
@@ -17,6 +17,9 @@ 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 7c8a7268d..60a9b78bb 100644
--- a/Source/Editor/Content/Proxy/GameplayGlobalsProxy.cs
+++ b/Source/Editor/Content/Proxy/GameplayGlobalsProxy.cs
@@ -15,6 +15,9 @@ namespace FlaxEditor.Content
{
///
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 55b4c8d47..8ec932106 100644
--- a/Source/Editor/Content/Proxy/IESProfileProxy.cs
+++ b/Source/Editor/Content/Proxy/IESProfileProxy.cs
@@ -20,6 +20,9 @@ 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 3f2863f74..2f48a1b6c 100644
--- a/Source/Editor/Content/Proxy/JsonAssetProxy.cs
+++ b/Source/Editor/Content/Proxy/JsonAssetProxy.cs
@@ -31,6 +31,9 @@ namespace FlaxEditor.Content
///
public override string Name => "Json Asset";
+
+ ///
+ public override string CategoryName => "Json Asset";
///
public override string FileExtension => Extension;
@@ -165,6 +168,20 @@ 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 702f04706..c2c317342 100644
--- a/Source/Editor/Content/Proxy/MaterialFunctionProxy.cs
+++ b/Source/Editor/Content/Proxy/MaterialFunctionProxy.cs
@@ -15,6 +15,9 @@ namespace FlaxEditor.Content
{
///
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 663c191ef..ea0a73cbe 100644
--- a/Source/Editor/Content/Proxy/MaterialInstanceProxy.cs
+++ b/Source/Editor/Content/Proxy/MaterialInstanceProxy.cs
@@ -20,6 +20,9 @@ namespace FlaxEditor.Content
///
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 e2e74eb14..2da83bf96 100644
--- a/Source/Editor/Content/Proxy/MaterialProxy.cs
+++ b/Source/Editor/Content/Proxy/MaterialProxy.cs
@@ -21,6 +21,9 @@ namespace FlaxEditor.Content
///
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 b99d15134..ed0633ce4 100644
--- a/Source/Editor/Content/Proxy/ModelProxy.cs
+++ b/Source/Editor/Content/Proxy/ModelProxy.cs
@@ -21,6 +21,9 @@ 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 24cc22690..c56e5f695 100644
--- a/Source/Editor/Content/Proxy/ParticleEmitterFunctionProxy.cs
+++ b/Source/Editor/Content/Proxy/ParticleEmitterFunctionProxy.cs
@@ -15,6 +15,9 @@ namespace FlaxEditor.Content
{
///
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 089c614da..391670085 100644
--- a/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs
+++ b/Source/Editor/Content/Proxy/ParticleEmitterProxy.cs
@@ -22,6 +22,9 @@ 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 c19e84a78..b1fda9b60 100644
--- a/Source/Editor/Content/Proxy/ParticleSystemProxy.cs
+++ b/Source/Editor/Content/Proxy/ParticleSystemProxy.cs
@@ -46,6 +46,9 @@ 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 64eb1d9f1..16e00069f 100644
--- a/Source/Editor/Content/Proxy/PrefabProxy.cs
+++ b/Source/Editor/Content/Proxy/PrefabProxy.cs
@@ -31,6 +31,9 @@ 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 b3bc6e73f..16c6ae9f2 100644
--- a/Source/Editor/Content/Proxy/PreviewsCacheProxy.cs
+++ b/Source/Editor/Content/Proxy/PreviewsCacheProxy.cs
@@ -15,6 +15,9 @@ 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 30409208e..4bebe20f6 100644
--- a/Source/Editor/Content/Proxy/SceneAnimationProxy.cs
+++ b/Source/Editor/Content/Proxy/SceneAnimationProxy.cs
@@ -40,6 +40,9 @@ 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 7856fa064..6be481250 100644
--- a/Source/Editor/Content/Proxy/SceneProxy.cs
+++ b/Source/Editor/Content/Proxy/SceneProxy.cs
@@ -19,6 +19,9 @@ 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 0bbd2830f..abe63f06e 100644
--- a/Source/Editor/Content/Proxy/SettingsProxy.cs
+++ b/Source/Editor/Content/Proxy/SettingsProxy.cs
@@ -20,6 +20,9 @@ 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 b65949460..76fd02897 100644
--- a/Source/Editor/Content/Proxy/ShaderProxy.cs
+++ b/Source/Editor/Content/Proxy/ShaderProxy.cs
@@ -14,6 +14,9 @@ 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 2a90820b0..d84bf3fe8 100644
--- a/Source/Editor/Content/Proxy/SkeletonMaskProxy.cs
+++ b/Source/Editor/Content/Proxy/SkeletonMaskProxy.cs
@@ -15,6 +15,9 @@ namespace FlaxEditor.Content
{
///
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 597c69a1d..18276604e 100644
--- a/Source/Editor/Content/Proxy/SkinnedModelProxy.cs
+++ b/Source/Editor/Content/Proxy/SkinnedModelProxy.cs
@@ -20,6 +20,9 @@ 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 5184abafb..fce7e22e5 100644
--- a/Source/Editor/Content/Proxy/SpriteAtlasProxy.cs
+++ b/Source/Editor/Content/Proxy/SpriteAtlasProxy.cs
@@ -20,6 +20,9 @@ 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 67de33851..ce292d5b3 100644
--- a/Source/Editor/Content/Proxy/TextureProxy.cs
+++ b/Source/Editor/Content/Proxy/TextureProxy.cs
@@ -20,6 +20,9 @@ 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 b065a4fcd..540e46945 100644
--- a/Source/Editor/Content/Proxy/VisualScriptProxy.cs
+++ b/Source/Editor/Content/Proxy/VisualScriptProxy.cs
@@ -24,6 +24,9 @@ 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 a3ee714ae..990d42615 100644
--- a/Source/Editor/Modules/ContentDatabaseModule.cs
+++ b/Source/Editor/Modules/ContentDatabaseModule.cs
@@ -927,7 +927,9 @@ namespace FlaxEditor.Modules
Proxy.Add(new VisualScriptProxy());
Proxy.Add(new LocalizedStringTableProxy());
Proxy.Add(new FileProxy());
- Proxy.Add(new SpawnableJsonAssetProxy());
+ var pm = new SpawnableJsonAssetProxy();
+ pm.SetCategoryName("Physics");
+ Proxy.Add(pm);
// 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 c0dcc9b14..7f27e0cd3 100644
--- a/Source/Editor/Windows/ContentWindow.ContextMenu.cs
+++ b/Source/Editor/Windows/ContentWindow.ContextMenu.cs
@@ -2,10 +2,12 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using FlaxEditor.Content;
using FlaxEditor.GUI.ContextMenu;
using FlaxEngine;
using FlaxEngine.Assertions;
+using FlaxEngine.GUI;
using FlaxEngine.Json;
namespace FlaxEditor.Windows
@@ -17,35 +19,6 @@ namespace FlaxEditor.Windows
///
public event Action ContextMenuShow;
- private readonly List _animationGroupNames = new List()
- {
- "Animation",
- "Animation Graph",
- "Animation Graph Function",
- "Skeleton Mask",
- "Scene Animation",
- };
-
- private readonly List _particleGroupNames = new List()
- {
- "Particle Emitter",
- "Particle Emitter Function",
- "Particle System",
- };
-
- private readonly List _materialGroupNames = new List()
- {
- "Material",
- "Material Function",
- "Material Instance",
- };
-
- private readonly List _physicsGroupNames = new List()
- {
- "Collision Data",
- "Physical Material",
- };
-
private void ShowContextMenuForItem(ContentItem item, ref Float2 location, bool isTreeNode)
{
Assert.IsNull(_newElement);
@@ -180,6 +153,28 @@ 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++)
+ {
+ var p = Editor.ContentDatabase.Proxy[i];
+ if (p.CanCreate(folder))
+ {
+ if (p is AssetProxy ap)
+ {
+ if (categorizedProxyList.ContainsKey(ap.CategoryName))
+ {
+ categorizedProxyList.TryGetValue(ap.CategoryName, out var apList);
+ apList?.Add(ap);
+ }
+ else
+ {
+ categorizedProxyList.Add(ap.CategoryName, new List() {ap});
+ }
+ }
+ }
+ }
+
c = cm.AddChildMenu("New");
c.ContextMenu.Tag = item;
c.ContextMenu.AutoSort = true;
@@ -189,17 +184,27 @@ namespace FlaxEditor.Windows
var p = Editor.ContentDatabase.Proxy[i];
if (p.CanCreate(folder))
{
- if (_animationGroupNames.Contains(p.Name))
- AddContentProxyToMenu(c.ContextMenu, p, "Animation");
- else if (_particleGroupNames.Contains(p.Name))
- AddContentProxyToMenu(c.ContextMenu, p, "Particles");
- else if (_materialGroupNames.Contains(p.Name))
- AddContentProxyToMenu(c.ContextMenu, p, "Materials");
- else if (_physicsGroupNames.Contains(p.Name))
- AddContentProxyToMenu(c.ContextMenu, p, "Physics");
+ 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++;
}
}
@@ -218,21 +223,6 @@ namespace FlaxEditor.Windows
cm.Show(this, location);
}
- private void AddContentProxyToMenu(ContextMenu contextMenu, ContentProxy contentProxy, string menuName)
- {
- var childMenu = contextMenu.GetChildMenu(menuName);
- if (childMenu == null)
- {
- var c = contextMenu.AddChildMenu(menuName);
- c.ContextMenu.AutoSort = true;
- c.ContextMenu.AddButton(contentProxy.Name, () => NewItem(contentProxy));
- }
- else
- {
- childMenu.ContextMenu.AddButton(contentProxy.Name, () => NewItem(contentProxy));
- }
- }
-
private void OnExpandAllClicked(ContextMenuButton button)
{
CurrentViewFolder.Node.ExpandAll();