diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml b/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml index 58ccd8c2..24939cfb 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml +++ b/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml @@ -5,12 +5,13 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:shcm="using:Snap.Hutao.Control.Markup" + Loaded="OnRootControlLoaded" mc:Ignorable="d"> + Click="SplitButtonClick"> diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml.cs b/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml.cs index 344a1708..839e524f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml.cs @@ -11,7 +11,7 @@ namespace Snap.Hutao.Control.Panel; /// public sealed partial class PanelSelector : UserControl { - private static readonly DependencyProperty CurrentProperty = Property.Depend(nameof(Current), "List"); + private static readonly DependencyProperty CurrentProperty = Property.Depend(nameof(Current), "List", OnCurrentChanged); /// /// 构造一个新的面板选择器 @@ -30,51 +30,60 @@ public sealed partial class PanelSelector : UserControl set => SetValue(CurrentProperty, value); } - private void SplitButtonLoaded(object sender, RoutedEventArgs e) + private static void OnCurrentChanged(PanelSelector sender, string current) { - MenuFlyout menuFlyout = (MenuFlyout)((SplitButton)sender).Flyout; - ((RadioMenuFlyoutItem)menuFlyout.Items[0]).IsChecked = true; + MenuFlyout menuFlyout = (MenuFlyout)sender.RootSplitButton.Flyout; + RadioMenuFlyoutItem targetItem = menuFlyout.Items + .Cast() + .Single(i => (string)i.Tag == current); + targetItem.IsChecked = true; + sender.IconPresenter.Glyph = ((FontIcon)targetItem.Icon).Glyph; + } + + private static void OnCurrentChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + OnCurrentChanged((PanelSelector)obj, (string)args.NewValue); + } + + private void OnRootControlLoaded(object sender, RoutedEventArgs e) + { + // because the GroupName shares in global + // we have to impl a control scoped GroupName. + PanelSelector selector = (PanelSelector)sender; + MenuFlyout menuFlyout = (MenuFlyout)selector.RootSplitButton.Flyout; + int hash = GetHashCode(); + foreach (RadioMenuFlyoutItem item in menuFlyout.Items.Cast()) + { + item.GroupName = $"PanelSelector{hash}Group"; + } + + OnCurrentChanged(selector, Current); } private void SplitButtonClick(SplitButton sender, SplitButtonClickEventArgs args) { MenuFlyout menuFlyout = (MenuFlyout)sender.Flyout; + int i = 0; for (; i < menuFlyout.Items.Count; i++) { - RadioMenuFlyoutItem current = (RadioMenuFlyoutItem)menuFlyout.Items[i]; - if (current.IsChecked) + if ((string)menuFlyout.Items[i].Tag == Current) { break; } } - i++; - - if (i > menuFlyout.Items.Count) - { - i = 1; - } - - if (i == menuFlyout.Items.Count) - { - i = 0; - } + ++i; + i %= menuFlyout.Items.Count; // move the count index to 0 RadioMenuFlyoutItem item = (RadioMenuFlyoutItem)menuFlyout.Items[i]; item.IsChecked = true; - UpdateState(item); + Current = (string)item.Tag; } private void RadioMenuFlyoutItemClick(object sender, RoutedEventArgs e) { RadioMenuFlyoutItem item = (RadioMenuFlyoutItem)sender; - UpdateState(item); - } - - private void UpdateState(RadioMenuFlyoutItem item) - { Current = (string)item.Tag; - IconPresenter.Glyph = ((FontIcon)item.Icon).Glyph; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs b/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs index d6a01a1a..0c952a1f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs @@ -27,4 +27,9 @@ internal static class SettingKeys /// 静态资源合约V1 /// public const string StaticResourceV1Contract = "StaticResourceV1Contract"; + + /// + /// 静态资源合约V2 成就图标与物品图标 + /// + public const string StaticResourceV2Contract = "StaticResourceV2Contract"; } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs b/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs index fadd4954..099d21b5 100644 --- a/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs @@ -33,9 +33,11 @@ public sealed partial class MainWindow : Window, IExtendedWindowSource, IRecipie Ioc.Default.GetRequiredService().Register(this); - // Query the StaticResourceV1Contract. + // Query the StaticResourceV1Contract & StaticResourceV2Contract. // If not complete we should present the welcome view. - ContentSwitchPresenter.Value = !LocalSetting.Get(SettingKeys.StaticResourceV1Contract, false); + ContentSwitchPresenter.Value = + !LocalSetting.Get(SettingKeys.StaticResourceV1Contract, false) + || (!LocalSetting.Get(SettingKeys.StaticResourceV2Contract, false)); } /// diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml b/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml index 86694e47..3bad90a3 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml @@ -92,7 +92,6 @@ - @@ -124,7 +123,10 @@ FontSize="24" Text="{Binding TotalCount}" Visibility="{Binding ElementName=DetailExpander, Path=IsExpanded, Converter={StaticResource BoolToVisibilityRevertConverter}}"/> - + diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/WelcomeViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/WelcomeViewModel.cs index 6abb4156..80c498cd 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/WelcomeViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/WelcomeViewModel.cs @@ -51,18 +51,27 @@ internal class WelcomeViewModel : ObservableObject private async Task OpenUIAsync() { - List downloadSummaries = new() + List downloadSummaries = new(); + + if (!LocalSetting.Get(SettingKeys.StaticResourceV1Contract, false)) { - new(serviceProvider, "基础图标", "Bg"), - new(serviceProvider, "角色图标", "AvatarIcon"), - new(serviceProvider, "角色立绘图标", "GachaAvatarIcon"), - new(serviceProvider, "角色立绘图像", "GachaAvatarImg"), - new(serviceProvider, "武器图标", "EquipIcon"), - new(serviceProvider, "武器立绘图标", "GachaEquipIcon"), - new(serviceProvider, "名片图像", "NameCardPic"), - new(serviceProvider, "天赋图标", "Skill"), - new(serviceProvider, "命之座图标", "Talent"), - }; + downloadSummaries.Add(new(serviceProvider, "基础图标", "Bg")); + downloadSummaries.Add(new(serviceProvider, "角色图标", "AvatarIcon")); + downloadSummaries.Add(new(serviceProvider, "角色立绘图标", "GachaAvatarIcon")); + downloadSummaries.Add(new(serviceProvider, "角色立绘图像", "GachaAvatarImg")); + downloadSummaries.Add(new(serviceProvider, "武器图标", "EquipIcon")); + downloadSummaries.Add(new(serviceProvider, "武器立绘图标", "GachaEquipIcon")); + downloadSummaries.Add(new(serviceProvider, "名片图像", "NameCardPic")); + downloadSummaries.Add(new(serviceProvider, "天赋图标", "Skill")); + downloadSummaries.Add(new(serviceProvider, "命之座图标", "Talent")); + } + + if (!LocalSetting.Get(SettingKeys.StaticResourceV2Contract, false)) + { + downloadSummaries.Add(new(serviceProvider, "成就图标", "AchievementIcon")); + downloadSummaries.Add(new(serviceProvider, "物品图标", "ItemIcon")); + downloadSummaries.Add(new(serviceProvider, "元素图标", "IconElement")); + } DownloadSummaries = new(downloadSummaries); @@ -70,8 +79,9 @@ internal class WelcomeViewModel : ObservableObject serviceProvider.GetRequiredService().Send(new Message.WelcomeStateCompleteMessage()); - // Complete the StaticResourceV1Contract + // Complete StaticResourceContracts LocalSetting.Set(SettingKeys.StaticResourceV1Contract, true); + LocalSetting.Set(SettingKeys.StaticResourceV2Contract, true); new ToastContentBuilder() .AddText("下载完成") diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/Model/IJsResult.cs b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/Model/IJsResult.cs index cc633de8..0912faaf 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/Model/IJsResult.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/Model/IJsResult.cs @@ -11,7 +11,6 @@ public interface IJsResult /// /// 转换到Json字符串表示 /// - /// 序列化参数 /// JSON字符串 - string ToString(JsonSerializerOptions options); + string ToString(); } diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/Model/JsResult.cs b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/Model/JsResult.cs index 44c2d52f..90c93d47 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Bridge/Model/JsResult.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Bridge/Model/JsResult.cs @@ -29,7 +29,7 @@ public class JsResult : IJsResult public TData Data { get; set; } = default!; /// - string IJsResult.ToString(JsonSerializerOptions options) + string IJsResult.ToString() { return JsonSerializer.Serialize(this); } diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Response/KnownReturnCode.cs b/src/Snap.Hutao/Snap.Hutao/Web/Response/KnownReturnCode.cs index 6f9e7ff2..f6c91c94 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Response/KnownReturnCode.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Response/KnownReturnCode.cs @@ -6,7 +6,7 @@ namespace Snap.Hutao.Web.Response; /// /// 已知的返回代码 /// -public enum KnownReturnCode : int +public enum KnownReturnCode { /// /// 无效请求 diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Response/Response.cs b/src/Snap.Hutao/Snap.Hutao/Web/Response/Response.cs index 972264c8..b2d1d342 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Response/Response.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Response/Response.cs @@ -94,7 +94,7 @@ public class Response : Response, IJsResult } /// - string IJsResult.ToString(JsonSerializerOptions options) + string IJsResult.ToString() { return JsonSerializer.Serialize(this); }