From cd6a61a04869a81a80ffeb0a4b7a1ced58f9d193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E6=B0=B4?= <1123993881@qq.com> Date: Fri, 18 Aug 2023 08:52:32 +0800 Subject: [PATCH] fix: changed searching strategy. --- .../ActionSequencer/ConditionHelper.cs | 3 +-- RotationSolver/Localization/Strings.cs | 3 +++ RotationSolver/RotationSolver.csproj | 1 - RotationSolver/UI/RotationConfigWindow.cs | 16 ++++++++-------- RotationSolver/UI/RotationConfigWindow_Config.cs | 16 ++++++++++++---- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/RotationSolver/ActionSequencer/ConditionHelper.cs b/RotationSolver/ActionSequencer/ConditionHelper.cs index 32ba78824..3c9c46bdb 100644 --- a/RotationSolver/ActionSequencer/ConditionHelper.cs +++ b/RotationSolver/ActionSequencer/ConditionHelper.cs @@ -88,8 +88,7 @@ internal static void SearchItemsReflection(string popId, string name, ref str var searchingKey = searchTxt; var members = actions.Select(m => (m, m.GetMemberName())) - .OrderBy(s => s.Item2.Split(' ') - .Min(c => RotationConfigWindow.StringComparer.Distance(c, searchingKey))); + .OrderByDescending(s => RotationConfigWindow.Similarity(s.Item2, searchingKey)); ImGui.SetNextItemWidth(Math.Max(50 * ImGuiHelpers.GlobalScale, members.Max(i => ImGuiHelpers.GetButtonSize(i.Item2).X))); ImGui.InputTextWithHint("##Searching the member", LocalizationManager.RightLang.ConfigWindow_Actions_MemberName, ref searchTxt, 128); diff --git a/RotationSolver/Localization/Strings.cs b/RotationSolver/Localization/Strings.cs index d3502deab..5954869e5 100644 --- a/RotationSolver/Localization/Strings.cs +++ b/RotationSolver/Localization/Strings.cs @@ -699,4 +699,7 @@ internal partial class Strings public string ConfigWindow_Actions_MoveUp { get; set; } = "Move Up"; public string ConfigWindow_Actions_MoveDown { get; set; } = "Move Down"; public string ConfigWindow_NotInJob { get; set; } = "This option is unavailable while using your current job\n \nRoles or jobs needed:\n{0}"; + + public string ConfigWindow_Searching { get; set; } = "Searching..."; + } \ No newline at end of file diff --git a/RotationSolver/RotationSolver.csproj b/RotationSolver/RotationSolver.csproj index d3da8bc19..2c6ca6a05 100644 --- a/RotationSolver/RotationSolver.csproj +++ b/RotationSolver/RotationSolver.csproj @@ -7,7 +7,6 @@ - diff --git a/RotationSolver/UI/RotationConfigWindow.cs b/RotationSolver/UI/RotationConfigWindow.cs index 7abba20b4..dff8a527b 100644 --- a/RotationSolver/UI/RotationConfigWindow.cs +++ b/RotationSolver/UI/RotationConfigWindow.cs @@ -1447,8 +1447,8 @@ private static void DrawStatusList(string name, HashSet statuses, Status[] foreach (var status in statuses.Select(a => Service.GetSheet().GetRow(a)) .Where(a => a != null) - .OrderBy(s => Math.Min(StringComparer.Distance(s.Name, _statusSearching) - , StringComparer.Distance(s.RowId.ToString(), _statusSearching)))) + .OrderByDescending(s => Math.Min(Similarity(s.Name, _statusSearching) + , Similarity(s.RowId.ToString(), _statusSearching)))) { void Delete() => removeId = status.RowId; @@ -1491,8 +1491,8 @@ internal static void StatusPopUp(string popupId, Status[] allStatus, ref string var index = 0; var searchingKey = searching; - foreach (var status in allStatus.OrderBy(s => Math.Min(StringComparer.Distance(s.Name, searchingKey) - , StringComparer.Distance(s.RowId.ToString(), searchingKey)))) + foreach (var status in allStatus.OrderByDescending(s => Math.Min(Similarity(s.Name, searchingKey) + , Similarity(s.RowId.ToString(), searchingKey)))) { if (IconSet.GetTexture(status.Icon, out var texture, notLoadId)) { @@ -1570,8 +1570,8 @@ private static void DrawActionsList(string name, HashSet actions) if (ImGui.BeginChild("Rotation Solver Add action", new Vector2(-1, 400 * _scale))) { - foreach (var action in AllActions.OrderBy(s => Math.Min(StringComparer.Distance(s.Name, _actionSearching) - , StringComparer.Distance(s.RowId.ToString(), _actionSearching)))) + foreach (var action in AllActions.OrderByDescending(s => Math.Min(Similarity(s.Name, _actionSearching) + , Similarity(s.RowId.ToString(), _actionSearching)))) { var selected = ImGui.Selectable($"{action.Name} ({action.RowId})"); if (ImGui.IsItemHovered()) @@ -1601,8 +1601,8 @@ private static void DrawActionsList(string name, HashSet actions) foreach (var action in actions.Select(a => Service.GetSheet().GetRow(a)) .Where(a => a != null) - .OrderBy(s => Math.Min(StringComparer.Distance(s.Name, _actionSearching) - , StringComparer.Distance(s.RowId.ToString(), _actionSearching)))) + .OrderByDescending(s => Math.Min(Similarity(s.Name, _actionSearching) + , Similarity(s.RowId.ToString(), _actionSearching)))) { void Reset() => removeId = action.RowId; diff --git a/RotationSolver/UI/RotationConfigWindow_Config.cs b/RotationSolver/UI/RotationConfigWindow_Config.cs index f457a2fb9..6be46e5f2 100644 --- a/RotationSolver/UI/RotationConfigWindow_Config.cs +++ b/RotationSolver/UI/RotationConfigWindow_Config.cs @@ -1,6 +1,5 @@ using Dalamud.Game.ClientState.Keys; using ECommons.ImGuiMethods; -using F23.StringSimilarity; using RotationSolver.Basic.Configuration; using RotationSolver.Localization; using RotationSolver.UI.SearchableConfigs; @@ -10,13 +9,22 @@ namespace RotationSolver.UI; public partial class RotationConfigWindow { - internal static readonly Levenshtein StringComparer = new (); + internal static float Similarity(string text, string key) + { + var chars = text.Split(new char[] { ' ', ',', '、', '.', '。' }, StringSplitOptions.RemoveEmptyEntries); + + var startWithCount = chars.Count(i => i.StartsWith(key, StringComparison.OrdinalIgnoreCase)); + + var containCount = chars.Count(i => i.Contains(key, StringComparison.OrdinalIgnoreCase)); + + return startWithCount * 3 + containCount; + } private string _searchText = string.Empty; private ISearchable[] _searchResults = Array.Empty(); private void SearchingBox() { - if (ImGui.InputTextWithHint("##Rotation Solver Search Box", "Searching...", ref _searchText, 128, ImGuiInputTextFlags.AutoSelectAll)) + if (ImGui.InputTextWithHint("##Rotation Solver Search Box", LocalizationManager.RightLang.ConfigWindow_Searching, ref _searchText, 128, ImGuiInputTextFlags.AutoSelectAll)) { if (!string.IsNullOrEmpty(_searchText)) { @@ -28,7 +36,7 @@ private void SearchingBox() .Where(f => f.FieldType == typeof(ISearchable[]) && f.IsInitOnly) .SelectMany(f => (ISearchable[])f.GetValue(this)) .SelectMany(GetChildren) - .OrderBy(i => i.SearchingKeys.Split(' ').Min(k => StringComparer.Distance(k, _searchText))) + .OrderByDescending(i => Similarity(i.SearchingKeys, _searchText)) .Select(GetParent).GetEnumerator(); int index = 0;