Fix scene search performance regression

This commit is contained in:
2026-05-04 23:05:25 +02:00
parent da716dde6a
commit 864f3a3d42
2 changed files with 41 additions and 19 deletions
+39 -17
View File
@@ -182,7 +182,7 @@ namespace FlaxEditor.SceneGraph.GUI
_highlights?.Clear(); _highlights?.Clear();
isThisVisible = true; isThisVisible = true;
} }
else else if (filterText.Contains(','))
{ {
var splitFilter = filterText.Split(','); var splitFilter = filterText.Split(',');
var hasAllFilters = true; var hasAllFilters = true;
@@ -199,21 +199,17 @@ namespace FlaxEditor.SceneGraph.GUI
// Check for any scripts // Check for any scripts
if (trimmedFilter.Equals("s:", StringComparison.OrdinalIgnoreCase)) if (trimmedFilter.Equals("s:", StringComparison.OrdinalIgnoreCase))
{ {
if (Actor != null) if (actor != null && actor.ScriptsCount > 0)
{
if (Actor.ScriptsCount > 0)
{
hasFilter = true; hasFilter = true;
} }
}
}
else else
{ {
var scriptText = trimmedFilter.Replace("s:", "", StringComparison.OrdinalIgnoreCase).Trim(); var scriptText = trimmedFilter.Replace("s:", "", StringComparison.OrdinalIgnoreCase).Trim();
var scriptFound = false; var scriptFound = false;
if (Actor != null) if (actor != null)
{ {
foreach (var script in Actor.Scripts) var scripts = actor.Scripts;
foreach (var script in scripts)
{ {
var name = TypeUtils.GetTypeDisplayName(script.GetType()); var name = TypeUtils.GetTypeDisplayName(script.GetType());
var nameNoSpaces = name.Replace(" ", ""); var nameNoSpaces = name.Replace(" ", "");
@@ -233,15 +229,15 @@ namespace FlaxEditor.SceneGraph.GUI
{ {
if (trimmedFilter.Equals("a:", StringComparison.OrdinalIgnoreCase)) if (trimmedFilter.Equals("a:", StringComparison.OrdinalIgnoreCase))
{ {
if (Actor != null) if (actor != null)
hasFilter = true; hasFilter = true;
} }
else else
{ {
if (Actor != null) if (actor != null)
{ {
var actorTypeText = trimmedFilter.Replace("a:", "", StringComparison.OrdinalIgnoreCase).Trim(); var actorTypeText = trimmedFilter.Replace("a:", "", StringComparison.OrdinalIgnoreCase).Trim();
var name = TypeUtils.GetTypeDisplayName(Actor.GetType()); var name = TypeUtils.GetTypeDisplayName(actor.GetType());
var nameNoSpaces = name.Replace(" ", ""); var nameNoSpaces = name.Replace(" ", "");
if (name.Contains(actorTypeText, StringComparison.OrdinalIgnoreCase) || nameNoSpaces.Contains(actorTypeText, StringComparison.OrdinalIgnoreCase)) if (name.Contains(actorTypeText, StringComparison.OrdinalIgnoreCase) || nameNoSpaces.Contains(actorTypeText, StringComparison.OrdinalIgnoreCase))
hasFilter = true; hasFilter = true;
@@ -253,15 +249,15 @@ namespace FlaxEditor.SceneGraph.GUI
{ {
if (trimmedFilter.Equals("c:", StringComparison.OrdinalIgnoreCase)) if (trimmedFilter.Equals("c:", StringComparison.OrdinalIgnoreCase))
{ {
if (Actor != null) if (actor != null)
hasFilter = true; hasFilter = true;
} }
else else
{ {
if (Actor != null && Actor is UIControl uic && uic.Control != null) if (actor is UIControl uiControl && uiControl.Control != null)
{ {
var controlTypeText = trimmedFilter.Replace("c:", "", StringComparison.OrdinalIgnoreCase).Trim(); var controlTypeText = trimmedFilter.Replace("c:", "", StringComparison.OrdinalIgnoreCase).Trim();
var name = TypeUtils.GetTypeDisplayName(uic.Control.GetType()); var name = TypeUtils.GetTypeDisplayName(uiControl.Control.GetType());
var nameNoSpaces = name.Replace(" ", ""); var nameNoSpaces = name.Replace(" ", "");
if (name.Contains(controlTypeText, StringComparison.OrdinalIgnoreCase) || nameNoSpaces.Contains(controlTypeText, StringComparison.OrdinalIgnoreCase)) if (name.Contains(controlTypeText, StringComparison.OrdinalIgnoreCase) || nameNoSpaces.Contains(controlTypeText, StringComparison.OrdinalIgnoreCase))
hasFilter = true; hasFilter = true;
@@ -283,8 +279,9 @@ namespace FlaxEditor.SceneGraph.GUI
var textRect = TextRect; var textRect = TextRect;
for (int i = 0; i < ranges.Length; i++) for (int i = 0; i < ranges.Length; i++)
{ {
var start = font.GetCharPosition(text, ranges[i].StartIndex); var range = ranges[i];
var end = font.GetCharPosition(text, ranges[i].EndIndex); var start = font.GetCharPosition(text, range.StartIndex);
var end = font.GetCharPosition(text, range.EndIndex);
_highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height)); _highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
} }
hasFilter = true; hasFilter = true;
@@ -302,6 +299,31 @@ namespace FlaxEditor.SceneGraph.GUI
if (!hasAllFilters) if (!hasAllFilters)
_highlights?.Clear(); _highlights?.Clear();
} }
else if (QueryFilterHelper.Match(filterText, Text, out QueryFilterHelper.Range[] ranges))
{
// Update highlights
if (_highlights == null)
_highlights = new List<Rectangle>(ranges.Length);
else
_highlights.Clear();
var font = Style.Current.FontSmall;
var textRect = TextRect;
var text = Text;
for (int i = 0; i < ranges.Length; i++)
{
var range = ranges[i];
var start = font.GetCharPosition(text, range.StartIndex);
var end = font.GetCharPosition(text, range.EndIndex);
_highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
}
isThisVisible = true;
}
else
{
// Hide
_highlights?.Clear();
isThisVisible = false;
}
// Update children // Update children
bool isAnyChildVisible = false; bool isAnyChildVisible = false;
+1 -1
View File
@@ -175,8 +175,8 @@ namespace FlaxEditor.Windows
if (IsLayoutLocked) if (IsLayoutLocked)
return; return;
_tree.LockChildrenRecursive();
PerformLayout(); PerformLayout();
_tree.LockChildrenRecursive();
// Update tree // Update tree
var query = _searchBox.Text; var query = _searchBox.Text;