Merge branch 'Chikinsupu-Visject-ImprovedNodeSearching'
This commit is contained in:
@@ -492,8 +492,7 @@ namespace FlaxEditor.Surface.ContextMenu
|
||||
|
||||
// If no item is selected (or it's not visible anymore), select the top one
|
||||
Profiler.BeginEvent("VisjectCM.Layout");
|
||||
if (SelectedItem == null || !SelectedItem.VisibleInHierarchy)
|
||||
SelectedItem = _groups.Find(g => g.Visible)?.Children.Find(c => c.Visible && c is VisjectCMItem) as VisjectCMItem;
|
||||
SelectedItem = _groups.Find(g => g.Visible)?.Children.Find(c => c.Visible && c is VisjectCMItem) as VisjectCMItem;
|
||||
PerformLayout();
|
||||
if (SelectedItem != null)
|
||||
_panel1.ScrollViewTo(SelectedItem);
|
||||
@@ -704,7 +703,7 @@ namespace FlaxEditor.Surface.ContextMenu
|
||||
Hide();
|
||||
return true;
|
||||
}
|
||||
else if (key == KeyboardKeys.Return)
|
||||
else if (key == KeyboardKeys.Return || key == KeyboardKeys.Tab)
|
||||
{
|
||||
if (SelectedItem != null)
|
||||
OnClickItem(SelectedItem);
|
||||
|
||||
@@ -73,8 +73,6 @@ namespace FlaxEditor.Surface.ContextMenu
|
||||
{
|
||||
SortScore = 0;
|
||||
|
||||
if (!(_highlights?.Count > 0))
|
||||
return;
|
||||
if (!Visible)
|
||||
return;
|
||||
|
||||
@@ -83,6 +81,8 @@ namespace FlaxEditor.Surface.ContextMenu
|
||||
SortScore += 1;
|
||||
if (Data != null)
|
||||
SortScore += 1;
|
||||
if (_highlights is { Count: > 0 })
|
||||
SortScore += 1;
|
||||
if (_isStartsWithMatch)
|
||||
SortScore += 2;
|
||||
if (_isFullMatch)
|
||||
@@ -169,6 +169,7 @@ namespace FlaxEditor.Surface.ContextMenu
|
||||
/// <param name="groupHeaderMatches">True if item's group header got a filter match and item should stay visible.</param>
|
||||
public void UpdateFilter(string filterText, Box selectedBox, bool groupHeaderMatches = false)
|
||||
{
|
||||
// When dragging connection out of a box, validate if the box is compatible with this item's type
|
||||
if (selectedBox != null)
|
||||
{
|
||||
Visible = CanConnectTo(selectedBox);
|
||||
@@ -185,72 +186,87 @@ namespace FlaxEditor.Surface.ContextMenu
|
||||
// Clear filter
|
||||
_highlights?.Clear();
|
||||
Visible = true;
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
GetTextRectangle(out var textRect);
|
||||
|
||||
// Check archetype title
|
||||
if (QueryFilterHelper.Match(filterText, _archetype.Title, out var ranges))
|
||||
{
|
||||
GetTextRectangle(out var textRect);
|
||||
if (QueryFilterHelper.Match(filterText, _archetype.Title, out var ranges))
|
||||
// Update highlights
|
||||
if (_highlights == null)
|
||||
_highlights = new List<Rectangle>(ranges.Length);
|
||||
else
|
||||
_highlights.Clear();
|
||||
var style = Style.Current;
|
||||
var font = style.FontSmall;
|
||||
for (int i = 0; i < ranges.Length; i++)
|
||||
{
|
||||
// Update highlights
|
||||
if (_highlights == null)
|
||||
_highlights = new List<Rectangle>(ranges.Length);
|
||||
else
|
||||
_highlights.Clear();
|
||||
var style = Style.Current;
|
||||
var font = style.FontSmall;
|
||||
for (int i = 0; i < ranges.Length; i++)
|
||||
var start = font.GetCharPosition(_archetype.Title, ranges[i].StartIndex);
|
||||
var end = font.GetCharPosition(_archetype.Title, ranges[i].EndIndex);
|
||||
_highlights.Add(new Rectangle(start.X + textRect.X, 0, end.X - start.X, Height));
|
||||
|
||||
if (ranges[i].StartIndex <= 0)
|
||||
{
|
||||
var start = font.GetCharPosition(_archetype.Title, ranges[i].StartIndex);
|
||||
var end = font.GetCharPosition(_archetype.Title, ranges[i].EndIndex);
|
||||
_highlights.Add(new Rectangle(start.X + textRect.X, 0, end.X - start.X, Height));
|
||||
|
||||
if (ranges[i].StartIndex <= 0)
|
||||
{
|
||||
_isStartsWithMatch = true;
|
||||
if (ranges[i].Length == _archetype.Title.Length)
|
||||
_isFullMatch = true;
|
||||
}
|
||||
_isStartsWithMatch = true;
|
||||
if (ranges[i].Length == _archetype.Title.Length)
|
||||
_isFullMatch = true;
|
||||
}
|
||||
Visible = true;
|
||||
}
|
||||
else if (_archetype.AlternativeTitles?.Any(altTitle => string.Equals(filterText, altTitle, StringComparison.CurrentCultureIgnoreCase)) == true)
|
||||
{
|
||||
// Update highlights
|
||||
if (_highlights == null)
|
||||
_highlights = new List<Rectangle>(1);
|
||||
else
|
||||
_highlights.Clear();
|
||||
var style = Style.Current;
|
||||
var font = style.FontSmall;
|
||||
var start = font.GetCharPosition(_archetype.Title, 0);
|
||||
var end = font.GetCharPosition(_archetype.Title, _archetype.Title.Length - 1);
|
||||
_highlights.Add(new Rectangle(start.X + textRect.X, 0, end.X - start.X, Height));
|
||||
_isFullMatch = true;
|
||||
Visible = true;
|
||||
}
|
||||
else if (NodeArchetype.TryParseText != null && NodeArchetype.TryParseText(filterText, out var data))
|
||||
{
|
||||
// Update highlights
|
||||
if (_highlights == null)
|
||||
_highlights = new List<Rectangle>(1);
|
||||
else
|
||||
_highlights.Clear();
|
||||
var style = Style.Current;
|
||||
var font = style.FontSmall;
|
||||
var start = font.GetCharPosition(_archetype.Title, 0);
|
||||
var end = font.GetCharPosition(_archetype.Title, _archetype.Title.Length - 1);
|
||||
_highlights.Add(new Rectangle(start.X + textRect.X, 0, end.X - start.X, Height));
|
||||
Visible = true;
|
||||
|
||||
Data = data;
|
||||
}
|
||||
else if (!groupHeaderMatches)
|
||||
{
|
||||
// Hide
|
||||
_highlights?.Clear();
|
||||
Visible = false;
|
||||
}
|
||||
Visible = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check archetype synonyms
|
||||
if (_archetype.AlternativeTitles!= null && _archetype.AlternativeTitles.Any(altTitle => QueryFilterHelper.Match(filterText, altTitle, out ranges)))
|
||||
{
|
||||
// Update highlights
|
||||
if (_highlights == null)
|
||||
_highlights = new List<Rectangle>(1);
|
||||
else
|
||||
_highlights.Clear();
|
||||
var style = Style.Current;
|
||||
var font = style.FontSmall;
|
||||
var start = font.GetCharPosition(_archetype.Title, 0);
|
||||
var end = font.GetCharPosition(_archetype.Title, _archetype.Title.Length - 1);
|
||||
_highlights.Add(new Rectangle(start.X + textRect.X, 0, end.X - start.X, Height));
|
||||
|
||||
for (int i = 0; i < ranges.Length; i++)
|
||||
{
|
||||
if (ranges[i].StartIndex <= 0)
|
||||
{
|
||||
_isStartsWithMatch = true;
|
||||
}
|
||||
}
|
||||
|
||||
Visible = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Check archetype data (if it exists)
|
||||
if (NodeArchetype.TryParseText != null && NodeArchetype.TryParseText(filterText, out var data))
|
||||
{
|
||||
// Update highlights
|
||||
if (_highlights == null)
|
||||
_highlights = new List<Rectangle>(1);
|
||||
else
|
||||
_highlights.Clear();
|
||||
var style = Style.Current;
|
||||
var font = style.FontSmall;
|
||||
var start = font.GetCharPosition(_archetype.Title, 0);
|
||||
var end = font.GetCharPosition(_archetype.Title, _archetype.Title.Length - 1);
|
||||
_highlights.Add(new Rectangle(start.X + textRect.X, 0, end.X - start.X, Height));
|
||||
Visible = true;
|
||||
Data = data;
|
||||
return;
|
||||
}
|
||||
|
||||
_highlights?.Clear();
|
||||
|
||||
// Hide
|
||||
if (!groupHeaderMatches)
|
||||
Visible = false;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@@ -140,8 +140,7 @@ namespace FlaxEditor.Utilities
|
||||
// Check if start the matching sequence
|
||||
if (matchStartPos == -1)
|
||||
{
|
||||
if (ranges == null)
|
||||
ranges = new List<Range>();
|
||||
ranges ??= new List<Range>();
|
||||
matchStartPos = textPos;
|
||||
}
|
||||
}
|
||||
@@ -152,7 +151,7 @@ namespace FlaxEditor.Utilities
|
||||
{
|
||||
var length = textPos - matchStartPos;
|
||||
if (length >= MinLength)
|
||||
ranges.Add(new Range(matchStartPos, length));
|
||||
ranges!.Add(new Range(matchStartPos, length));
|
||||
textPos = matchStartPos + length;
|
||||
matchStartPos = -1;
|
||||
}
|
||||
@@ -165,13 +164,13 @@ namespace FlaxEditor.Utilities
|
||||
{
|
||||
var length = endPos - matchStartPos;
|
||||
if (length >= MinLength)
|
||||
ranges.Add(new Range(matchStartPos, length));
|
||||
ranges!.Add(new Range(matchStartPos, length));
|
||||
textPos = matchStartPos + length;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if has any range
|
||||
if (ranges != null && ranges.Count > 0)
|
||||
if (ranges is { Count: > 0 })
|
||||
{
|
||||
matches = ranges.ToArray();
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user