diff --git a/Source/Editor/Surface/ContextMenu/VisjectCM.cs b/Source/Editor/Surface/ContextMenu/VisjectCM.cs index 19ddcd294..c7c33094f 100644 --- a/Source/Editor/Surface/ContextMenu/VisjectCM.cs +++ b/Source/Editor/Surface/ContextMenu/VisjectCM.cs @@ -307,7 +307,10 @@ namespace FlaxEditor.Surface.ContextMenu if (!IsLayoutLocked) { group.UnlockChildrenRecursive(); - SortGroups(); + if(_contextSensitiveSearchEnabled && _selectedBox != null) + UpdateFilters(); + else + SortGroups(); if (ShowExpanded) group.Open(false); group.PerformLayout(); @@ -367,7 +370,10 @@ namespace FlaxEditor.Surface.ContextMenu if (!isLayoutLocked) { - SortGroups(); + if(_contextSensitiveSearchEnabled && _selectedBox != null) + UpdateFilters(); + else + SortGroups(); Profiler.BeginEvent("Perform Layout"); UnlockChildrenRecursive(); foreach (var group in groups) @@ -482,10 +488,11 @@ namespace FlaxEditor.Surface.ContextMenu // Update groups LockChildrenRecursive(); + var contextSensitiveSelectedBox = _contextSensitiveSearchEnabled ? _selectedBox : null; for (int i = 0; i < _groups.Count; i++) { - _groups[i].UpdateFilter(_searchBox.Text, _contextSensitiveSearchEnabled ? _selectedBox : null); - _groups[i].UpdateItemSort(_selectedBox); + _groups[i].UpdateFilter(_searchBox.Text, contextSensitiveSelectedBox); + _groups[i].UpdateItemSort(contextSensitiveSelectedBox); } SortGroups(); UnlockChildrenRecursive(); @@ -560,7 +567,10 @@ namespace FlaxEditor.Surface.ContextMenu } UnlockChildrenRecursive(); - SortGroups(); + if(_contextSensitiveSearchEnabled && _selectedBox != null) + UpdateFilters(); + else + SortGroups(); PerformLayout(); Profiler.EndEvent(); diff --git a/Source/Editor/Surface/ContextMenu/VisjectCMGroup.cs b/Source/Editor/Surface/ContextMenu/VisjectCMGroup.cs index 2e82bdf50..cd100abf7 100644 --- a/Source/Editor/Surface/ContextMenu/VisjectCMGroup.cs +++ b/Source/Editor/Surface/ContextMenu/VisjectCMGroup.cs @@ -88,6 +88,25 @@ namespace FlaxEditor.Surface.ContextMenu public void UpdateFilter(string filterText, Box selectedBox) { Profiler.BeginEvent("VisjectCMGroup.UpdateFilter"); + + // Check if a dot is inside the filter text and split the string accordingly. + // Everything in front of the dot is for specifying a class/group name. And everything afterward is the actual item filter text + if (!string.IsNullOrEmpty(filterText)) + { + int dotIndex = filterText.IndexOf('.'); + if (dotIndex != -1) + { + // Early out and make the group invisible if it doesn't start with the specified string + string filterGroupName = filterText.Substring(0, dotIndex); + if (!Name.StartsWith(filterGroupName, StringComparison.InvariantCultureIgnoreCase)) + { + Visible = false; + Profiler.EndEvent(); + return; + } + filterText = filterText.Substring(dotIndex + 1); + } + } // Update items bool isAnyVisible = false; @@ -177,6 +196,13 @@ namespace FlaxEditor.Surface.ContextMenu SortScore = item.SortScore; } } + + if (selectedBox != null) + { + if (string.Equals(Name, selectedBox.CurrentType.Name, StringComparison.InvariantCultureIgnoreCase)) + SortScore += 10; + } + SortChildren(); Profiler.EndEvent();