mirror of
https://github.com/denglihong2007/CRSim
synced 2026-08-04 16:26:24 +08:00
feat: 插件筛选
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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}" />
|
||||
|
||||
@@ -14,6 +14,5 @@ public sealed partial class PluginManagementPage : Page
|
||||
|
||||
private void SelectorBar_SelectionChanged(SelectorBar sender, SelectorBarSelectionChangedEventArgs args)
|
||||
{
|
||||
Console.WriteLine($"SelectorBar selection changed");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user