feat: 插件筛选

This commit is contained in:
denglihong2007
2025-07-31 22:32:22 +08:00
parent c9f7961839
commit 3e82e534f0
5 changed files with 61 additions and 16 deletions

View File

@@ -13,16 +13,16 @@ public interface IPluginService
/// </summary>
public static readonly string PluginPackageExtension = ".crsp";
internal static ObservableCollection<PluginInfo> LoadedPluginsInternal { get; } = [];
internal static List<PluginInfo> LoadedPluginsInternal { get; } = [];
/// <summary>
/// 已加载的插件信息列表。
/// </summary>
public static ObservableCollection<PluginInfo> LoadedPlugins => LoadedPluginsInternal;
public static List<PluginInfo> LoadedPlugins => LoadedPluginsInternal;
internal static ObservableCollection<PluginInfo> OnlinePluginsInternal { get; } = [];
internal static List<PluginInfo> OnlinePluginsInternal { get; } = [];
public static ObservableCollection<PluginInfo> OnlinePlugins => OnlinePluginsInternal;
public static List<PluginInfo> OnlinePlugins => OnlinePluginsInternal;
Task InstallPluginOnlineAsync(PluginInfo plugin);
Task InstallPluginLocalAsync(string filePath);

View File

@@ -1,7 +1,4 @@
using CRSim.Core.Abstractions;
using CRSim.Core.Models;
using CRSim.Core.Models.Plugin;
using CRSim.Core.Services;
using CRSim.Core.Models.Plugin;
using System.Diagnostics;
namespace CRSim.ViewModels;
@@ -11,10 +8,20 @@ public partial class PluginManagementPageViewModel : ObservableObject
[ObservableProperty]
public partial string PageTitle { get; set; } = "插件管理";
[ObservableProperty]
public partial string SearchText { get; set; } = "";
[ObservableProperty]
public partial PluginInfo? SelectedPlugin { get; set; }
public ObservableCollection<PluginInfo> Plugins = IPluginService.OnlinePlugins;
public List<PluginInfo> Plugins = IPluginService.OnlinePlugins;
public List<PluginInfo> FilteredPlugins => [.. Plugins.Where(x => x.Manifest.Name.Contains(SearchText) && (SelectedAuthor == "全体作者" || x.Manifest.Author == SelectedAuthor))];
public List<string> Authors => ["全体作者",.. Plugins.Select(x => x.Manifest.Author).Distinct()];
[ObservableProperty]
public partial string SelectedAuthor { get; set; } = "全体作者";
private readonly IPluginService _pluginService;
private readonly IDialogService _dialogService;
@@ -23,7 +30,12 @@ public partial class PluginManagementPageViewModel : ObservableObject
{
_pluginService = pluginService;
_dialogService = dialogService;
_pluginService.LoadOnlinePluginsAsync();
_ = InitAsync();
}
private async Task InitAsync()
{
await _pluginService.LoadOnlinePluginsAsync();
OnPropertyChanged(nameof(FilteredPlugins));
}
[RelayCommand]
@@ -102,7 +114,9 @@ public partial class PluginManagementPageViewModel : ObservableObject
{
SelectedPlugin = null;
Plugins = (selectorBarItem?.Text == "本地") ? IPluginService.OnlinePlugins : IPluginService.LoadedPlugins;
OnPropertyChanged(nameof(Plugins));
OnPropertyChanged(nameof(Authors));
SelectedAuthor = "全体作者";
OnPropertyChanged(nameof(FilteredPlugins));
}
}
@@ -120,5 +134,14 @@ public partial class PluginManagementPageViewModel : ObservableObject
public async Task Refresh()
{
await _pluginService.LoadOnlinePluginsAsync();
OnPropertyChanged(nameof(Authors));
SelectedAuthor = "全体作者";
OnPropertyChanged(nameof(FilteredPlugins));
}
[RelayCommand]
public void Search(object args)
{
OnPropertyChanged(nameof(FilteredPlugins));
}
}

View File

@@ -37,10 +37,11 @@
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid Grid.Row="0" Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
@@ -63,8 +64,30 @@
</CommandBar.SecondaryCommands>
</CommandBar>
</Grid>
<Border Style="{StaticResource ListViewBorder}" Grid.Row="1">
<ListView ItemsSource="{x:Bind ViewModel.Plugins,Mode=OneWay}" Width="290" SelectionMode="Single">
<Grid Grid.Row="1" Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<AutoSuggestBox Grid.Column="0" PlaceholderText="搜索插件" QueryIcon="Find" Text="{x:Bind ViewModel.SearchText,Mode=TwoWay}"
Margin="0,0,8,0" HorizontalAlignment="Stretch" MaxWidth="186.4">
<interactivity:Interaction.Behaviors>
<interactivity:EventTriggerBehavior EventName="TextChanged">
<interactivity:InvokeCommandAction Command="{x:Bind ViewModel.SearchCommand}" />
</interactivity:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</AutoSuggestBox>
<ComboBox Grid.Column="1" HorizontalAlignment="Stretch" ItemsSource="{x:Bind ViewModel.Authors,Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.SelectedAuthor,Mode=TwoWay}">
<interactivity:Interaction.Behaviors>
<interactivity:EventTriggerBehavior EventName="SelectionChanged">
<interactivity:InvokeCommandAction Command="{x:Bind ViewModel.SearchCommand}" />
</interactivity:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</ComboBox>
</Grid>
<Border Style="{StaticResource ListViewBorder}" Grid.Row="2">
<ListView ItemsSource="{x:Bind ViewModel.FilteredPlugins,Mode=OneWay}" Width="290" SelectionMode="Single">
<interactivity:Interaction.Behaviors>
<interactivity:EventTriggerBehavior EventName="SelectionChanged">
<interactivity:InvokeCommandAction Command="{x:Bind ViewModel.PluginSelectedCommand}" />

View File

@@ -14,6 +14,5 @@ public sealed partial class PluginManagementPage : Page
private void SelectorBar_SelectionChanged(SelectorBar sender, SelectorBarSelectionChangedEventArgs args)
{
Console.WriteLine($"SelectorBar selection changed");
}
}

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>2.3.104.0</Version>
<Version>2.3.105.0</Version>
<Authors>电排骨</Authors>
<RepositoryUrl>https://github.com/denglihong2007/CRSim</RepositoryUrl>
</PropertyGroup>