From c7f30477e48e2e77baa4e0a74faecdcb21f2c7d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E4=BA=91?= Date: Mon, 7 Jul 2025 21:17:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20js=E6=94=AF=E6=8C=81=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=20(#1843)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModel/Pages/ScriptControlViewModel.cs | 88 +++++++++++++++++-- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs index e965c9f7..dc80a335 100644 --- a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs @@ -640,18 +640,92 @@ public partial class ScriptControlViewModel : ViewModel private void OnAddJsScript() { var list = LoadAllJsScriptProjects(); - var combobox = new ComboBox(); + var stackPanel = CreateJsScriptSelectionPanel(list); - foreach (var scriptProject in list) + var result = PromptDialog.Prompt("请选择需要添加的JS脚本", "请选择需要添加的JS脚本", stackPanel, new Size(500, 600)); + if (!string.IsNullOrEmpty(result)) { - combobox.Items.Add(scriptProject.FolderName + " - " + scriptProject.Manifest.Name); + AddSelectedJsScripts((StackPanel)stackPanel.Content); + } + } + + private ScrollViewer CreateJsScriptSelectionPanel(List list) + { + var stackPanel = new StackPanel(); + + var filterTextBox = new TextBox + { + Margin = new Thickness(0, 0, 0, 10), + PlaceholderText = "输入搜索条件...", + }; + filterTextBox.TextChanged += delegate { ApplyJsScriptFilter(stackPanel, list, filterTextBox.Text); }; + stackPanel.Children.Add(filterTextBox); + + AddJsScriptsToPanel(stackPanel, list, filterTextBox.Text); + + var scrollViewer = new ScrollViewer + { + Content = stackPanel, + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + Height = 435 // 固定高度 + }; + + return scrollViewer; + } + + private void ApplyJsScriptFilter(StackPanel parentPanel, List scripts, string filter) + { + if (parentPanel.Children.Count > 0) + { + List removeElements = new List(); + foreach (UIElement parentPanelChild in parentPanel.Children) + { + if (parentPanelChild is FrameworkElement frameworkElement && frameworkElement.Name.StartsWith("dynamic_")) + { + removeElements.Add(frameworkElement); + } + } + + removeElements.ForEach(parentPanel.Children.Remove); } - var str = PromptDialog.Prompt("请选择需要添加的JS脚本", "请选择需要添加的JS脚本", combobox); - if (!string.IsNullOrEmpty(str)) + AddJsScriptsToPanel(parentPanel, scripts, filter); + } + + private void AddJsScriptsToPanel(StackPanel parentPanel, List scripts, string filter) + { + foreach (var script in scripts) { - var folderName = str.Split(" - ")[0]; - SelectedScriptGroup?.AddProject(new ScriptGroupProject(new ScriptProject(folderName))); + var displayText = script.FolderName + " - " + script.Manifest.Name; + + if (!string.IsNullOrEmpty(filter) && + !displayText.Contains(filter, StringComparison.OrdinalIgnoreCase) && + !script.FolderName.Contains(filter, StringComparison.OrdinalIgnoreCase) && + !script.Manifest.Name.Contains(filter, StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + var checkBox = new CheckBox + { + Content = displayText, + Tag = script.FolderName, + Margin = new Thickness(0, 2, 0, 2), + Name = "dynamic_" + Guid.NewGuid().ToString().Replace("-", "_") + }; + + parentPanel.Children.Add(checkBox); + } + } + + private void AddSelectedJsScripts(StackPanel stackPanel) + { + foreach (var child in stackPanel.Children) + { + if (child is CheckBox { IsChecked: true } checkBox && checkBox.Tag is string folderName) + { + SelectedScriptGroup?.AddProject(new ScriptGroupProject(new ScriptProject(folderName))); + } } }