mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-05-25 10:05:49 +08:00
新增搜索功能,优化JS脚本选择窗口的用户体验
This commit is contained in:
@@ -52,6 +52,7 @@
|
||||
CornerRadius="8">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="Auto" />
|
||||
@@ -77,11 +78,18 @@
|
||||
Padding="8,4" />
|
||||
</Grid>
|
||||
|
||||
<!-- 搜索框 -->
|
||||
<ui:TextBox Grid.Row="1"
|
||||
Margin="12,0,12,8"
|
||||
Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}"
|
||||
PlaceholderText="搜索脚本名称或描述..."
|
||||
ClearButtonEnabled="True" />
|
||||
|
||||
<!-- 脚本列表 -->
|
||||
<ScrollViewer Grid.Row="1"
|
||||
<ScrollViewer Grid.Row="2"
|
||||
Margin="4,0,4,8"
|
||||
VerticalScrollBarVisibility="Auto">
|
||||
<ListBox ItemsSource="{Binding JsScripts}"
|
||||
<ListBox ItemsSource="{Binding FilteredJsScripts}"
|
||||
SelectedItem="{Binding SelectedScript}"
|
||||
BorderThickness="0"
|
||||
Padding="0">
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using BetterGenshinImpact.Core.Script;
|
||||
using BetterGenshinImpact.Core.Script.Project;
|
||||
@@ -17,9 +18,15 @@ public partial class JsScriptSelectionViewModel : ViewModel
|
||||
[ObservableProperty]
|
||||
private ObservableCollection<JsScriptInfo> _jsScripts = [];
|
||||
|
||||
[ObservableProperty]
|
||||
private ObservableCollection<JsScriptInfo> _filteredJsScripts = [];
|
||||
|
||||
[ObservableProperty]
|
||||
private JsScriptInfo? _selectedScript;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _searchText = string.Empty;
|
||||
|
||||
[ObservableProperty]
|
||||
private string _readmeContent = string.Empty;
|
||||
|
||||
@@ -75,6 +82,8 @@ public partial class JsScriptSelectionViewModel : ViewModel
|
||||
}
|
||||
|
||||
JsScripts = scripts;
|
||||
ApplyFilter();
|
||||
SelectFirstScript();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -170,6 +179,41 @@ public partial class JsScriptSelectionViewModel : ViewModel
|
||||
}
|
||||
}
|
||||
|
||||
partial void OnSearchTextChanged(string value)
|
||||
{
|
||||
ApplyFilter();
|
||||
SelectFirstScript();
|
||||
}
|
||||
|
||||
private void ApplyFilter()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(SearchText))
|
||||
{
|
||||
FilteredJsScripts = new ObservableCollection<JsScriptInfo>(JsScripts);
|
||||
}
|
||||
else
|
||||
{
|
||||
var filtered = JsScripts.Where(script =>
|
||||
script.FolderName.Contains(SearchText, StringComparison.OrdinalIgnoreCase) ||
|
||||
script.Manifest.Name.Contains(SearchText, StringComparison.OrdinalIgnoreCase) ||
|
||||
script.Description.Contains(SearchText, StringComparison.OrdinalIgnoreCase)
|
||||
).ToList();
|
||||
FilteredJsScripts = new ObservableCollection<JsScriptInfo>(filtered);
|
||||
}
|
||||
}
|
||||
|
||||
private void SelectFirstScript()
|
||||
{
|
||||
if (FilteredJsScripts.Count > 0)
|
||||
{
|
||||
SelectedScript = FilteredJsScripts[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedScript = null;
|
||||
}
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private void RefreshScripts()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user