forked from xiaoyaocz/biliuwp-lite
-
Notifications
You must be signed in to change notification settings - Fork 41
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
18 changed files
with
759 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
<UserControl | ||
x:Class="BiliLite.Controls.FilterSettingsControl" | ||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | ||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | ||
xmlns:local="using:BiliLite.Controls" | ||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | ||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | ||
xmlns:controls="using:CommunityToolkit.WinUI.Controls" | ||
xmlns:settings="using:BiliLite.ViewModels.Settings" | ||
xmlns:models="using:BiliLite.Models.Common.Settings" | ||
xmlns:converters="using:BiliLite.Converters" | ||
mc:Ignorable="d" | ||
d:DesignHeight="300" | ||
d:DesignWidth="400"> | ||
<UserControl.Resources> | ||
<ResourceDictionary> | ||
<converters:FilterRuleTypeConverter x:Key="FilterRuleTypeConverter"></converters:FilterRuleTypeConverter> | ||
</ResourceDictionary> | ||
</UserControl.Resources> | ||
|
||
<StackPanel x:Name="FilterSettingsControlGrid" Orientation="Vertical"> | ||
<ListView ItemsSource="{x:Bind m_viewModel.RecommendFilterRules,Mode=OneWay}" | ||
x:Name="RecommendFilterRuleListView"> | ||
<ListView.Header> | ||
<Grid Margin="16 0"> | ||
<TextBlock VerticalAlignment="Center">推荐页过滤</TextBlock> | ||
<Button HorizontalAlignment="Right" x:Name="BtnAddRecommendFilterRule" Click="BtnAddRecommendFilterRule_OnClick">添加规则</Button> | ||
</Grid> | ||
</ListView.Header> | ||
<ListView.ItemTemplate> | ||
<DataTemplate x:DataType="settings:FilterRuleViewModel"> | ||
<controls:SettingsExpander Header="{x:Bind Rule,Mode=OneWay}"> | ||
<ToggleSwitch IsOn="{x:Bind Enable,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Toggled="OnFilterRuleChanged"></ToggleSwitch> | ||
<controls:SettingsExpander.Items> | ||
<controls:SettingsCard Header="过滤值" | ||
Description="{x:Bind RuleDesc,Mode=OneWay}"> | ||
<TextBox Text="{x:Bind Rule,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextChanged="OnFilterRuleChanged"></TextBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="规则类型" | ||
Description="{x:Bind FilterTypeDesc}"> | ||
<ComboBox ItemsSource="{x:Bind models:FilterRuleTypes.FilterTypeOptions}" | ||
Padding="8 0 0 0" | ||
SelectedItem="{x:Bind FilterType,Mode=TwoWay,Converter={StaticResource FilterRuleTypeConverter}}" | ||
SelectionChanged="OnFilterRuleChanged" | ||
DisplayMemberPath="Text"> | ||
</ComboBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="过滤目标" | ||
Description="{x:Bind FilterContentTypeDesc}"> | ||
<ComboBox ItemsSource="{x:Bind models:FilterRuleTypes.FilterTargetOptions}" | ||
Padding="8 0 0 0" | ||
SelectedItem="{x:Bind ContentType,Mode=TwoWay,Converter={StaticResource FilterRuleTypeConverter}}" | ||
SelectionChanged="OnFilterRuleChanged" | ||
DisplayMemberPath="Text"> | ||
</ComboBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="删除规则"> | ||
<Button Click="BtnDeleteFilterRule_OnClick">确认删除</Button> | ||
</controls:SettingsCard> | ||
</controls:SettingsExpander.Items> | ||
</controls:SettingsExpander> | ||
</DataTemplate> | ||
</ListView.ItemTemplate> | ||
</ListView> | ||
|
||
<ListView ItemsSource="{x:Bind m_viewModel.SearchFilterRules,Mode=OneWay}" | ||
Margin="0 16 0 0" | ||
x:Name="SearchFilterRuleListView"> | ||
<ListView.Header> | ||
<Grid Margin="16 0"> | ||
<TextBlock VerticalAlignment="Center">搜索页过滤</TextBlock> | ||
<Button HorizontalAlignment="Right" x:Name="BtnAddSearchFilterRule" Click="BtnAddSearchFilterRule_OnClick">添加规则</Button> | ||
</Grid> | ||
</ListView.Header> | ||
<ListView.ItemTemplate> | ||
<DataTemplate x:DataType="settings:FilterRuleViewModel"> | ||
<controls:SettingsExpander Header="{x:Bind Rule,Mode=OneWay}"> | ||
<ToggleSwitch IsOn="{x:Bind Enable,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Toggled="OnFilterRuleChanged"></ToggleSwitch> | ||
<controls:SettingsExpander.Items> | ||
<controls:SettingsCard Header="过滤值" | ||
Description="{x:Bind RuleDesc,Mode=OneWay}"> | ||
<TextBox Text="{x:Bind Rule,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextChanged="OnFilterRuleChanged"></TextBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="规则类型" | ||
Description="{x:Bind FilterTypeDesc}"> | ||
<ComboBox ItemsSource="{x:Bind models:FilterRuleTypes.FilterTypeOptions}" | ||
Padding="8 0 0 0" | ||
SelectedItem="{x:Bind FilterType,Mode=TwoWay,Converter={StaticResource FilterRuleTypeConverter}}" | ||
SelectionChanged="OnFilterRuleChanged" | ||
DisplayMemberPath="Text"> | ||
</ComboBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="过滤目标" | ||
Description="{x:Bind FilterContentTypeDesc}"> | ||
<ComboBox ItemsSource="{x:Bind models:FilterRuleTypes.FilterTargetOptions}" | ||
Padding="8 0 0 0" | ||
SelectedItem="{x:Bind ContentType,Mode=TwoWay,Converter={StaticResource FilterRuleTypeConverter}}" | ||
SelectionChanged="OnFilterRuleChanged" | ||
DisplayMemberPath="Text"> | ||
</ComboBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="删除规则"> | ||
<Button Click="BtnDeleteFilterRule_OnClick">确认删除</Button> | ||
</controls:SettingsCard> | ||
</controls:SettingsExpander.Items> | ||
</controls:SettingsExpander> | ||
</DataTemplate> | ||
</ListView.ItemTemplate> | ||
</ListView> | ||
|
||
<ListView ItemsSource="{x:Bind m_viewModel.DynamicFilterRules,Mode=OneWay}" | ||
Margin="0 16 0 0" | ||
x:Name="DynamicFilterRuleListView"> | ||
<ListView.Header> | ||
<Grid Margin="16 0"> | ||
<TextBlock VerticalAlignment="Center">动态页过滤</TextBlock> | ||
<Button HorizontalAlignment="Right" x:Name="BtnAddDynamicFilterRule" Click="BtnAddDynamicFilterRule_OnClick">添加规则</Button> | ||
</Grid> | ||
</ListView.Header> | ||
<ListView.ItemTemplate> | ||
<DataTemplate x:DataType="settings:FilterRuleViewModel"> | ||
<controls:SettingsExpander Header="{x:Bind Rule,Mode=OneWay}"> | ||
<ToggleSwitch IsOn="{x:Bind Enable,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Toggled="OnFilterRuleChanged"></ToggleSwitch> | ||
<controls:SettingsExpander.Items> | ||
<controls:SettingsCard Header="过滤值" | ||
Description="{x:Bind RuleDesc,Mode=OneWay}"> | ||
<TextBox Text="{x:Bind Rule,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextChanged="OnFilterRuleChanged"></TextBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="规则类型" | ||
Description="{x:Bind FilterTypeDesc}"> | ||
<ComboBox ItemsSource="{x:Bind models:FilterRuleTypes.FilterTypeOptions}" | ||
Padding="8 0 0 0" | ||
SelectedItem="{x:Bind FilterType,Mode=TwoWay,Converter={StaticResource FilterRuleTypeConverter}}" | ||
SelectionChanged="OnFilterRuleChanged" | ||
DisplayMemberPath="Text"> | ||
</ComboBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="过滤目标" | ||
Description="{x:Bind FilterContentTypeDesc}"> | ||
<ComboBox ItemsSource="{x:Bind models:FilterRuleTypes.FilterTargetOptions}" | ||
Padding="8 0 0 0" | ||
SelectedItem="{x:Bind ContentType,Mode=TwoWay,Converter={StaticResource FilterRuleTypeConverter}}" | ||
SelectionChanged="OnFilterRuleChanged" | ||
DisplayMemberPath="Text"> | ||
</ComboBox> | ||
</controls:SettingsCard> | ||
<controls:SettingsCard Header="删除规则"> | ||
<Button Click="BtnDeleteFilterRule_OnClick">确认删除</Button> | ||
</controls:SettingsCard> | ||
</controls:SettingsExpander.Items> | ||
</controls:SettingsExpander> | ||
</DataTemplate> | ||
</ListView.ItemTemplate> | ||
</ListView> | ||
</StackPanel> | ||
</UserControl> |
112 changes: 112 additions & 0 deletions
112
src/BiliLite.UWP/Controls/FilterSettingsControl.xaml.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Collections.ObjectModel; | ||
using Windows.UI.Xaml; | ||
using Windows.UI.Xaml.Controls; | ||
using AutoMapper; | ||
using BiliLite.Models.Common; | ||
using BiliLite.Models.Common.Settings; | ||
using BiliLite.Services; | ||
using BiliLite.ViewModels.Settings; | ||
using Microsoft.Extensions.DependencyInjection; | ||
using System.Threading.Tasks; | ||
|
||
//https://go.microsoft.com/fwlink/?LinkId=234236 上介绍了“用户控件”项模板 | ||
|
||
namespace BiliLite.Controls | ||
{ | ||
public sealed partial class FilterSettingsControl : UserControl | ||
{ | ||
private readonly ContentFilterService m_contentFilterService; | ||
private readonly FilterSettingsViewModel m_viewModel; | ||
private readonly IMapper m_mapper; | ||
|
||
public FilterSettingsControl() | ||
{ | ||
m_mapper = App.ServiceProvider.GetRequiredService<IMapper>(); | ||
m_viewModel = App.ServiceProvider.GetRequiredService<FilterSettingsViewModel>(); | ||
DataContext = m_viewModel; | ||
m_contentFilterService = App.ServiceProvider.GetRequiredService<ContentFilterService>(); | ||
m_viewModel.RecommendFilterRules = | ||
new ObservableCollection<FilterRuleViewModel>( | ||
m_mapper.Map<List<FilterRuleViewModel>>(m_contentFilterService.RecommendFilterRules) | ||
); | ||
m_viewModel.SearchFilterRules = | ||
new ObservableCollection<FilterRuleViewModel>( | ||
m_mapper.Map<List<FilterRuleViewModel>>(m_contentFilterService.SearchFilterRules) | ||
); | ||
m_viewModel.DynamicFilterRules = | ||
new ObservableCollection<FilterRuleViewModel>( | ||
m_mapper.Map<List<FilterRuleViewModel>>(m_contentFilterService.DynamicFilterRules) | ||
); | ||
this.InitializeComponent(); | ||
} | ||
|
||
private FilterRule CreateNewFilterRule(FilterRuleType filterRuleType) | ||
{ | ||
var rule = new FilterRule() | ||
{ | ||
Id = Guid.NewGuid().ToString(), | ||
Rule = "新规则", | ||
FilterRuleType = filterRuleType, | ||
ContentType = FilterContentType.Title, | ||
FilterType = FilterType.Word, | ||
Enable = true, | ||
}; | ||
return rule; | ||
} | ||
|
||
private void BtnAddRecommendFilterRule_OnClick(object sender, RoutedEventArgs e) | ||
{ | ||
var rule = CreateNewFilterRule(FilterRuleType.Recommend); | ||
m_contentFilterService.AddRecommendFilterRule(rule); | ||
var ruleViewModel = m_mapper.Map<FilterRuleViewModel>(rule); | ||
m_viewModel.RecommendFilterRules.Add(ruleViewModel); | ||
} | ||
|
||
private void UpdateFilterRule(FilterRuleViewModel filterRuleViewModel) | ||
{ | ||
var rule = m_mapper.Map<FilterRule>(filterRuleViewModel); | ||
m_contentFilterService.UpdateFilterRule(rule); | ||
} | ||
|
||
private async void OnFilterRuleChanged<T>(object sender, T e) | ||
{ | ||
if (sender is FrameworkElement { DataContext: FilterRuleViewModel filterRuleViewModel }) | ||
{ | ||
// 等待数据源更新 | ||
await Task.Delay(50); | ||
UpdateFilterRule(filterRuleViewModel); | ||
} | ||
} | ||
|
||
private void BtnDeleteFilterRule_OnClick(object sender, RoutedEventArgs e) | ||
{ | ||
if (sender is FrameworkElement { DataContext: FilterRuleViewModel filterRuleViewModel }) | ||
{ | ||
var rule = m_mapper.Map<FilterRule>(filterRuleViewModel); | ||
m_contentFilterService.DeleteFilterRule(rule); | ||
|
||
m_viewModel.RecommendFilterRules.Remove(filterRuleViewModel); | ||
m_viewModel.SearchFilterRules.Remove(filterRuleViewModel); | ||
m_viewModel.DynamicFilterRules.Remove(filterRuleViewModel); | ||
} | ||
} | ||
|
||
private void BtnAddSearchFilterRule_OnClick(object sender, RoutedEventArgs e) | ||
{ | ||
var rule = CreateNewFilterRule(FilterRuleType.Search); | ||
m_contentFilterService.AddSearchFilterRule(rule); | ||
var ruleViewModel = m_mapper.Map<FilterRuleViewModel>(rule); | ||
m_viewModel.SearchFilterRules.Add(ruleViewModel); | ||
} | ||
|
||
private void BtnAddDynamicFilterRule_OnClick(object sender, RoutedEventArgs e) | ||
{ | ||
var rule = CreateNewFilterRule(FilterRuleType.Dynamic); | ||
m_contentFilterService.AddDynamicFilterRule(rule); | ||
var ruleViewModel = m_mapper.Map<FilterRuleViewModel>(rule); | ||
m_viewModel.DynamicFilterRules.Add(ruleViewModel); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
using BiliLite.Models.Common; | ||
using System; | ||
using System.Linq; | ||
using Windows.UI.Xaml.Data; | ||
using BiliLite.Models.Common.Settings; | ||
|
||
namespace BiliLite.Converters | ||
{ | ||
public class FilterRuleTypeConverter : IValueConverter | ||
{ | ||
public object Convert(object value, Type targetType, object parameter, string language) | ||
{ | ||
if (value is FilterType filterType) | ||
{ | ||
return FilterRuleTypes.FilterTypeOptions.FirstOrDefault(x => x.Type == filterType); | ||
} | ||
else if(value is FilterContentType contentType) | ||
{ | ||
return FilterRuleTypes.FilterTargetOptions.FirstOrDefault(x => x.Type == contentType); | ||
} | ||
|
||
return null; | ||
} | ||
|
||
public object ConvertBack(object value, Type targetType, object parameter, string language) | ||
{ | ||
if (value is FilterTypeOption filterType) | ||
{ | ||
return filterType.Type; | ||
} | ||
else if (value is FilterTargetOption contentType) | ||
{ | ||
return contentType.Type; | ||
} | ||
|
||
if (targetType == typeof(FilterType)) | ||
{ | ||
return FilterType.Word; | ||
} | ||
if (targetType == typeof(FilterContentType)) | ||
{ | ||
return FilterContentType.Title; | ||
} | ||
|
||
return null; | ||
} | ||
} | ||
} |
Oops, something went wrong.