mirror of
https://jihulab.com/DGP-Studio/Snap.Hutao.git
synced 2025-11-19 21:02:53 +08:00
refactor localization
This commit is contained in:
@@ -33,7 +33,7 @@ internal static class IocConfiguration
|
||||
/// </summary>
|
||||
/// <param name="services">集合</param>
|
||||
/// <returns>可继续操作的集合</returns>
|
||||
public static IServiceCollection AddDatebase(this IServiceCollection services)
|
||||
public static IServiceCollection AddDatabase(this IServiceCollection services)
|
||||
{
|
||||
string dbFile = System.IO.Path.Combine(CoreEnvironment.DataFolder, "Userdata.db");
|
||||
string sqlConnectionString = $"Data Source={dbFile}";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
namespace Snap.Hutao.Model.Metadata.Abstraction;
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Intrinsic;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
namespace Snap.Hutao.Model.Metadata.Abstraction;
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Binding.Hutao;
|
||||
using Snap.Hutao.Model.Calculable;
|
||||
using Snap.Hutao.Model.Metadata.Abstraction;
|
||||
using Snap.Hutao.Model.Metadata.Converter;
|
||||
using Snap.Hutao.Model.Metadata.Item;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
namespace Snap.Hutao.Model.Metadata.Avatar;
|
||||
|
||||
|
||||
@@ -83,9 +83,10 @@ internal sealed class Material : Display
|
||||
|
||||
return TypeDescription switch
|
||||
{
|
||||
"角色与武器培养素材" => true,
|
||||
"角色经验素材" => true,
|
||||
"角色培养素材" => true,
|
||||
"天赋培养素材" => true,
|
||||
"角色突破素材" => true,
|
||||
"角色天赋素材" => true,
|
||||
"武器强化素材" => true,
|
||||
"武器突破素材" => true,
|
||||
_ => false,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Binding.Hutao;
|
||||
using Snap.Hutao.Model.Calculable;
|
||||
using Snap.Hutao.Model.Intrinsic;
|
||||
using Snap.Hutao.Model.Metadata.Abstraction;
|
||||
using Snap.Hutao.Model.Metadata.Converter;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
namespace Snap.Hutao.Model.Metadata.Weapon;
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ public static partial class Program
|
||||
|
||||
// Hutao extensions
|
||||
.AddJsonOptions()
|
||||
.AddDatebase()
|
||||
.AddDatabase()
|
||||
.AddInjections()
|
||||
.AddHttpClients()
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,7 @@ using Snap.Hutao.Core.ExceptionService;
|
||||
using Snap.Hutao.Model.Entity.Database;
|
||||
using Snap.Hutao.Model.InterChange.Achievement;
|
||||
using System.Collections.ObjectModel;
|
||||
using BindingAchievement = Snap.Hutao.Model.Binding.Achievement.AchievementView;
|
||||
using BindingAchievement = Snap.Hutao.ViewModel.Achievement.AchievementView;
|
||||
using EntityAchievement = Snap.Hutao.Model.Entity.Achievement;
|
||||
using EntityArchive = Snap.Hutao.Model.Entity.AchievementArchive;
|
||||
using MetadataAchievement = Snap.Hutao.Model.Metadata.Achievement.Achievement;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
using Snap.Hutao.Model.InterChange.Achievement;
|
||||
using System.Collections.ObjectModel;
|
||||
using BindingAchievement = Snap.Hutao.Model.Binding.Achievement.AchievementView;
|
||||
using BindingAchievement = Snap.Hutao.ViewModel.Achievement.AchievementView;
|
||||
using EntityArchive = Snap.Hutao.Model.Entity.AchievementArchive;
|
||||
using MetadataAchievement = Snap.Hutao.Model.Metadata.Achievement.Achievement;
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Metadata.Abstraction;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using Windows.UI;
|
||||
@@ -41,12 +41,12 @@ internal static class GachaStatisticsExtension
|
||||
// we can't trust first item's prev state.
|
||||
bool isPreviousUp = true;
|
||||
|
||||
// mark the IsGuarentee
|
||||
// mark the IsGuarantee
|
||||
foreach (SummaryItem item in summaryItems)
|
||||
{
|
||||
if (item.IsUp && (!isPreviousUp))
|
||||
{
|
||||
item.IsGuarentee = true;
|
||||
item.IsGuarantee = true;
|
||||
}
|
||||
|
||||
isPreviousUp = item.IsUp;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
using Snap.Hutao.Core.Database;
|
||||
using Snap.Hutao.Core.ExceptionService;
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Entity;
|
||||
using Snap.Hutao.Model.Entity.Database;
|
||||
using Snap.Hutao.Model.Intrinsic;
|
||||
@@ -12,6 +11,7 @@ using Snap.Hutao.Model.Metadata.Avatar;
|
||||
using Snap.Hutao.Model.Metadata.Weapon;
|
||||
using Snap.Hutao.Model.Primitive;
|
||||
using Snap.Hutao.Service.Metadata;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
namespace Snap.Hutao.Service.GachaLog.Factory;
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Metadata;
|
||||
using Snap.Hutao.Model.Metadata.Abstraction;
|
||||
using Snap.Hutao.Model.Metadata.Avatar;
|
||||
using Snap.Hutao.Model.Metadata.Weapon;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
using Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo;
|
||||
|
||||
namespace Snap.Hutao.Service.GachaLog.Factory;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Entity;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
namespace Snap.Hutao.Service.GachaLog.Factory;
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Entity;
|
||||
using Snap.Hutao.Model.Intrinsic;
|
||||
using Snap.Hutao.Model.Metadata.Abstraction;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
using Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo;
|
||||
|
||||
namespace Snap.Hutao.Service.GachaLog.Factory;
|
||||
|
||||
@@ -8,7 +8,6 @@ using Snap.Hutao.Core.Database;
|
||||
using Snap.Hutao.Core.Diagnostics;
|
||||
using Snap.Hutao.Core.ExceptionService;
|
||||
using Snap.Hutao.Model.Binding;
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Entity;
|
||||
using Snap.Hutao.Model.Entity.Database;
|
||||
using Snap.Hutao.Model.InterChange.GachaLog;
|
||||
@@ -17,6 +16,7 @@ using Snap.Hutao.Model.Primitive;
|
||||
using Snap.Hutao.Service.GachaLog.Factory;
|
||||
using Snap.Hutao.Service.GachaLog.QueryProvider;
|
||||
using Snap.Hutao.Service.Metadata;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
using Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo;
|
||||
using Snap.Hutao.Web.Response;
|
||||
using System.Collections.Immutable;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Entity;
|
||||
using Snap.Hutao.Model.InterChange.GachaLog;
|
||||
using Snap.Hutao.Service.GachaLog.QueryProvider;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace Snap.Hutao.Service.GachaLog;
|
||||
|
||||
@@ -295,9 +295,9 @@ internal sealed class PackageConverter
|
||||
}
|
||||
|
||||
// Cache no item, download it anyway.
|
||||
using (FileStream fileStream = File.Create(targetFilePath))
|
||||
while (true)
|
||||
{
|
||||
while (true)
|
||||
using (FileStream fileStream = File.Create(targetFilePath))
|
||||
{
|
||||
using (HttpResponseMessage response = await httpClient.GetAsync($"{scatteredFilesUrl}/{info.Target}", HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false))
|
||||
{
|
||||
@@ -319,7 +319,6 @@ internal sealed class PackageConverter
|
||||
// System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
|
||||
|
||||
// We want to retry forever.
|
||||
fileStream.Seek(0, SeekOrigin.Begin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -432,6 +432,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Control\Extension\" />
|
||||
<Folder Include="Model\Binding\Gacha\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Update="Resource\Localization\SH.Designer.cs">
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
xmlns:shcp="using:Snap.Hutao.Control.Panel"
|
||||
xmlns:shmbg="using:Snap.Hutao.Model.Binding.Gacha"
|
||||
xmlns:shvc="using:Snap.Hutao.View.Control"
|
||||
d:DataContext="{d:DesignInstance shmbg:TypedWishSummary}"
|
||||
d:DataContext="{d:DesignInstance shmbg:Snap.Hutao.ViewModel.GachaLog.TypedWishSummary}"
|
||||
mc:Ignorable="d">
|
||||
|
||||
<UserControl.Resources>
|
||||
@@ -45,7 +45,7 @@
|
||||
VerticalAlignment="Center"
|
||||
Foreground="#FF0063FF"
|
||||
Text="{shcm:ResourceString Name=ViewControlStatisticsCardGuarenteeText}"
|
||||
Visibility="{Binding IsGuarentee, Converter={StaticResource BoolToVisibilityConverter}}"/>
|
||||
Visibility="{Binding IsGuarantee, Converter={StaticResource BoolToVisibilityConverter}}"/>
|
||||
<TextBlock
|
||||
Margin="0,0,8,0"
|
||||
VerticalAlignment="Center"
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
|
||||
xmlns:shci="using:Snap.Hutao.Control.Image"
|
||||
xmlns:shcm="using:Snap.Hutao.Control.Markup"
|
||||
xmlns:shv="using:Snap.Hutao.ViewModel"
|
||||
d:DataContext="{d:DesignInstance shv:AchievementViewModel}"
|
||||
xmlns:shva="using:Snap.Hutao.ViewModel.Achievement"
|
||||
d:DataContext="{d:DesignInstance shva:AchievementViewModel}"
|
||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
||||
mc:Ignorable="d">
|
||||
|
||||
@@ -105,9 +105,9 @@
|
||||
<AppBarSeparator/>
|
||||
|
||||
<AppBarToggleButton
|
||||
Command="{Binding SortIncompletedSwitchCommand}"
|
||||
Command="{Binding SortUncompletedSwitchCommand}"
|
||||
Icon="{shcm:FontIcon Glyph=}"
|
||||
IsChecked="{Binding IsIncompletedItemsFirst}"
|
||||
IsChecked="{Binding IsUncompletedItemsFirst}"
|
||||
Label="{shcm:ResourceString Name=ViewPageAchievementSortIncompletedItemsFirst}"/>
|
||||
</CommandBar>
|
||||
</Grid>
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
xmlns:shcm="using:Snap.Hutao.Control.Markup"
|
||||
xmlns:shcp="using:Snap.Hutao.Control.Panel"
|
||||
xmlns:shct="using:Snap.Hutao.Control.Text"
|
||||
xmlns:shv="using:Snap.Hutao.ViewModel"
|
||||
xmlns:shva="using:Snap.Hutao.ViewModel.AvatarProperty"
|
||||
xmlns:shvcont="using:Snap.Hutao.View.Control"
|
||||
xmlns:wsc="using:WinUICommunity.SettingsUI.Controls"
|
||||
d:DataContext="{d:DesignInstance shv:AvatarPropertyViewModel}"
|
||||
d:DataContext="{d:DesignInstance shva:AvatarPropertyViewModel}"
|
||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
||||
mc:Ignorable="d">
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Control;
|
||||
using Snap.Hutao.ViewModel;
|
||||
using Snap.Hutao.ViewModel.AvatarProperty;
|
||||
|
||||
namespace Snap.Hutao.View.Page;
|
||||
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
|
||||
xmlns:shci="using:Snap.Hutao.Control.Image"
|
||||
xmlns:shcm="using:Snap.Hutao.Control.Markup"
|
||||
xmlns:shv="using:Snap.Hutao.ViewModel"
|
||||
xmlns:shvc="using:Snap.Hutao.View.Control"
|
||||
xmlns:shvco="using:Snap.Hutao.View.Control"
|
||||
xmlns:shvcu="using:Snap.Hutao.ViewModel.Cultivation"
|
||||
xmlns:wsc="using:WinUICommunity.SettingsUI.Controls"
|
||||
d:DataContext="{d:DesignInstance shv:CultivationViewModel}"
|
||||
d:DataContext="{d:DesignInstance shvcu:CultivationViewModel}"
|
||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
||||
mc:Ignorable="d">
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<shvc:ItemIcon
|
||||
<shvco:ItemIcon
|
||||
Width="48"
|
||||
Height="48"
|
||||
Icon="{Binding Icon}"
|
||||
@@ -152,7 +152,7 @@
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid>
|
||||
<shvc:ItemIcon
|
||||
<shvco:ItemIcon
|
||||
Width="32"
|
||||
Height="32"
|
||||
Icon="{Binding Inner.Icon, Converter={StaticResource ItemIconConverter}}"
|
||||
@@ -256,7 +256,7 @@
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<shvc:ItemIcon
|
||||
<shvco:ItemIcon
|
||||
Grid.Column="0"
|
||||
Width="32"
|
||||
Height="32"
|
||||
@@ -330,9 +330,9 @@
|
||||
BorderBrush="{x:Null}"
|
||||
BorderThickness="0"
|
||||
CornerRadius="{StaticResource CompatCornerRadius}">
|
||||
<shvc:BottomTextControl Text="{Binding Count, Mode=OneWay}">
|
||||
<shvc:ItemIcon Icon="{Binding Inner.Icon, Converter={StaticResource ItemIconConverter}}" Quality="{Binding Inner.RankLevel}"/>
|
||||
</shvc:BottomTextControl>
|
||||
<shvco:BottomTextControl Text="{Binding Count, Mode=OneWay}">
|
||||
<shvco:ItemIcon Icon="{Binding Inner.Icon, Converter={StaticResource ItemIconConverter}}" Quality="{Binding Inner.RankLevel}"/>
|
||||
</shvco:BottomTextControl>
|
||||
<Button.Flyout>
|
||||
<Flyout>
|
||||
<Grid>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Control;
|
||||
using Snap.Hutao.ViewModel;
|
||||
using Snap.Hutao.ViewModel.Cultivation;
|
||||
|
||||
namespace Snap.Hutao.View.Page;
|
||||
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
xmlns:shci="using:Snap.Hutao.Control.Image"
|
||||
xmlns:shcm="using:Snap.Hutao.Control.Markup"
|
||||
xmlns:shcp="using:Snap.Hutao.Control.Panel"
|
||||
xmlns:shv="using:Snap.Hutao.ViewModel"
|
||||
xmlns:shvc="using:Snap.Hutao.View.Control"
|
||||
xmlns:shvg="using:Snap.Hutao.ViewModel.GachaLog"
|
||||
xmlns:wsc="using:WinUICommunity.SettingsUI.Controls"
|
||||
d:DataContext="{d:DesignInstance shv:GachaLogViewModel}"
|
||||
d:DataContext="{d:DesignInstance shvg:GachaLogViewModel}"
|
||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
||||
mc:Ignorable="d">
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using Snap.Hutao.Control;
|
||||
using Snap.Hutao.ViewModel;
|
||||
using Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
namespace Snap.Hutao.View.Page;
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
|
||||
namespace Snap.Hutao.ViewModel.Abstraction;
|
||||
|
||||
@@ -13,6 +14,14 @@ internal abstract class ViewModel : ObservableObject, IViewModel
|
||||
{
|
||||
private bool isInitialized;
|
||||
|
||||
/// <summary>
|
||||
/// 构造一个新的视图模型
|
||||
/// </summary>
|
||||
public ViewModel()
|
||||
{
|
||||
OpenUICommand = new AsyncRelayCommand(OpenUIAsync);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否初始化完成
|
||||
/// </summary>
|
||||
@@ -27,6 +36,17 @@ internal abstract class ViewModel : ObservableObject, IViewModel
|
||||
/// <inheritdoc/>
|
||||
public bool IsViewDisposed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 打开页面命令
|
||||
/// </summary>
|
||||
public ICommand OpenUICommand { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 异步初始化UI
|
||||
/// </summary>
|
||||
/// <returns>任务</returns>
|
||||
protected abstract Task OpenUIAsync();
|
||||
|
||||
/// <summary>
|
||||
/// 保证 using scope 内的代码运行完成
|
||||
/// 防止 视图资源被回收
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
using CommunityToolkit.WinUI.UI;
|
||||
using System.Runtime.InteropServices;
|
||||
using BindingAchievement = Snap.Hutao.Model.Binding.Achievement.AchievementView;
|
||||
using BindingAchievementGoal = Snap.Hutao.Model.Binding.Achievement.AchievementGoalView;
|
||||
using BindingAchievement = Snap.Hutao.ViewModel.Achievement.AchievementView;
|
||||
using BindingAchievementGoal = Snap.Hutao.ViewModel.Achievement.AchievementGoalView;
|
||||
|
||||
namespace Snap.Hutao.ViewModel.Achievement;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using BindingAchievementGoal = Snap.Hutao.Model.Binding.Achievement.AchievementGoalView;
|
||||
using BindingAchievementGoal = Snap.Hutao.ViewModel.Achievement.AchievementGoalView;
|
||||
|
||||
namespace Snap.Hutao.ViewModel.Achievement;
|
||||
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Snap.Hutao.Model.Binding;
|
||||
using Snap.Hutao.Model.Metadata.Achievement;
|
||||
using Snap.Hutao.Model.Metadata.Converter;
|
||||
|
||||
namespace Snap.Hutao.Model.Binding.Achievement;
|
||||
namespace Snap.Hutao.ViewModel.Achievement;
|
||||
|
||||
/// <summary>
|
||||
/// 绑定成就分类
|
||||
@@ -18,12 +21,12 @@ internal sealed class AchievementGoalView : ObservableObject, INameIcon
|
||||
/// 构造一个新的成就分类
|
||||
/// </summary>
|
||||
/// <param name="goal">分类</param>
|
||||
public AchievementGoalView(Metadata.Achievement.AchievementGoal goal)
|
||||
public AchievementGoalView(AchievementGoal goal)
|
||||
{
|
||||
Id = goal.Id;
|
||||
Order = goal.Order;
|
||||
Name = goal.Name;
|
||||
Icon = Metadata.Converter.AchievementIconConverter.IconNameToUri(goal.Icon);
|
||||
Icon = AchievementIconConverter.IconNameToUri(goal.Icon);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -2,14 +2,16 @@
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Snap.Hutao.Model.Binding;
|
||||
using Snap.Hutao.Model.Intrinsic;
|
||||
|
||||
namespace Snap.Hutao.Model.Binding.Achievement;
|
||||
namespace Snap.Hutao.ViewModel.Achievement;
|
||||
|
||||
/// <summary>
|
||||
/// 用于视图绑定的成就
|
||||
/// </summary>
|
||||
[HighQuality]
|
||||
internal sealed class AchievementView : ObservableObject, IEntityWithMetadata<Entity.Achievement, Metadata.Achievement.Achievement>
|
||||
internal sealed class AchievementView : ObservableObject, IEntityWithMetadata<Model.Entity.Achievement, Model.Metadata.Achievement.Achievement>
|
||||
{
|
||||
/// <summary>
|
||||
/// 满进度占位符
|
||||
@@ -23,7 +25,7 @@ internal sealed class AchievementView : ObservableObject, IEntityWithMetadata<En
|
||||
/// </summary>
|
||||
/// <param name="entity">实体部分</param>
|
||||
/// <param name="inner">元数据部分</param>
|
||||
public AchievementView(Entity.Achievement entity, Metadata.Achievement.Achievement inner)
|
||||
public AchievementView(Model.Entity.Achievement entity, Model.Metadata.Achievement.Achievement inner)
|
||||
{
|
||||
Entity = entity;
|
||||
Inner = inner;
|
||||
@@ -34,12 +36,12 @@ internal sealed class AchievementView : ObservableObject, IEntityWithMetadata<En
|
||||
/// <summary>
|
||||
/// 实体
|
||||
/// </summary>
|
||||
public Entity.Achievement Entity { get; }
|
||||
public Model.Entity.Achievement Entity { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 元数据
|
||||
/// </summary>
|
||||
public Metadata.Achievement.Achievement Inner { get; }
|
||||
public Model.Metadata.Achievement.Achievement Inner { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否选中
|
||||
@@ -54,7 +56,7 @@ internal sealed class AchievementView : ObservableObject, IEntityWithMetadata<En
|
||||
// Only update state when checked
|
||||
if (value)
|
||||
{
|
||||
Entity.Status = Intrinsic.AchievementInfoStatus.STATUS_REWARD_TAKEN;
|
||||
Entity.Status = AchievementInfoStatus.STATUS_REWARD_TAKEN;
|
||||
Entity.Time = DateTimeOffset.Now;
|
||||
OnPropertyChanged(nameof(Time));
|
||||
}
|
||||
@@ -17,8 +17,6 @@ using Snap.Hutao.Service.Navigation;
|
||||
using Snap.Hutao.View.Dialog;
|
||||
using System.Collections.ObjectModel;
|
||||
using Windows.Storage.Pickers;
|
||||
using BindingAchievement = Snap.Hutao.Model.Binding.Achievement.AchievementView;
|
||||
using BindingAchievementGoal = Snap.Hutao.Model.Binding.Achievement.AchievementGoalView;
|
||||
using EntityAchievementArchive = Snap.Hutao.Model.Entity.AchievementArchive;
|
||||
using MetadataAchievement = Snap.Hutao.Model.Metadata.Achievement.Achievement;
|
||||
using MetadataAchievementGoal = Snap.Hutao.Model.Metadata.Achievement.AchievementGoal;
|
||||
@@ -32,8 +30,8 @@ namespace Snap.Hutao.ViewModel.Achievement;
|
||||
[Injection(InjectAs.Scoped)]
|
||||
internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationRecipient
|
||||
{
|
||||
private static readonly SortDescription IncompletedItemsFirstSortDescription = new(nameof(BindingAchievement.IsChecked), SortDirection.Ascending);
|
||||
private static readonly SortDescription CompletionTimeSortDescription = new(nameof(BindingAchievement.Time), SortDirection.Descending);
|
||||
private static readonly SortDescription UncompletedItemsFirstSortDescription = new(nameof(AchievementView.IsChecked), SortDirection.Ascending);
|
||||
private static readonly SortDescription CompletionTimeSortDescription = new(nameof(AchievementView.Time), SortDirection.Descending);
|
||||
|
||||
private readonly IAchievementService achievementService;
|
||||
private readonly IMetadataService metadataService;
|
||||
@@ -47,11 +45,11 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
private readonly TaskCompletionSource<bool> openUICompletionSource = new();
|
||||
|
||||
private AdvancedCollectionView? achievements;
|
||||
private List<BindingAchievementGoal>? achievementGoals;
|
||||
private BindingAchievementGoal? selectedAchievementGoal;
|
||||
private List<AchievementGoalView>? achievementGoals;
|
||||
private AchievementGoalView? selectedAchievementGoal;
|
||||
private ObservableCollection<EntityAchievementArchive>? archives;
|
||||
private EntityAchievementArchive? selectedArchive;
|
||||
private bool isIncompletedItemsFirst = true;
|
||||
private bool isUncompletedItemsFirst = true;
|
||||
private string searchText = string.Empty;
|
||||
private string? finishDescription;
|
||||
|
||||
@@ -83,15 +81,14 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
achievementFinishPercentUpdater = new(this);
|
||||
achievementImporter = new(serviceProvider);
|
||||
|
||||
OpenUICommand = new AsyncRelayCommand(OpenUIAsync);
|
||||
ImportUIAFFromClipboardCommand = new AsyncRelayCommand(ImportUIAFFromClipboardAsync);
|
||||
ImportUIAFFromFileCommand = new AsyncRelayCommand(ImportUIAFFromFileAsync);
|
||||
ExportAsUIAFToFileCommand = new AsyncRelayCommand(ExportAsUIAFToFileAsync);
|
||||
AddArchiveCommand = new AsyncRelayCommand(AddArchiveAsync);
|
||||
RemoveArchiveCommand = new AsyncRelayCommand(RemoveArchiveAsync);
|
||||
SearchAchievementCommand = new RelayCommand<string>(UpdateAchievementsFilterBySerach);
|
||||
SortIncompletedSwitchCommand = new RelayCommand(UpdateAchievementsSort);
|
||||
SaveAchievementCommand = new RelayCommand<BindingAchievement>(SaveAchievement);
|
||||
SearchAchievementCommand = new RelayCommand<string>(UpdateAchievementsFilterBySearch);
|
||||
SortUncompletedSwitchCommand = new RelayCommand(UpdateAchievementsSort);
|
||||
SaveAchievementCommand = new RelayCommand<AchievementView>(SaveAchievement);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -114,10 +111,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
if (SetProperty(ref selectedArchive, value))
|
||||
{
|
||||
achievementService.CurrentArchive = value;
|
||||
if (value != null)
|
||||
{
|
||||
UpdateAchievementsAsync(value).SafeForget();
|
||||
}
|
||||
UpdateAchievementsAsync(value).SafeForget();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -134,7 +128,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
/// <summary>
|
||||
/// 成就分类
|
||||
/// </summary>
|
||||
public List<BindingAchievementGoal>? AchievementGoals
|
||||
public List<AchievementGoalView>? AchievementGoals
|
||||
{
|
||||
get => achievementGoals;
|
||||
set => SetProperty(ref achievementGoals, value);
|
||||
@@ -143,7 +137,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
/// <summary>
|
||||
/// 选中的成就分类
|
||||
/// </summary>
|
||||
public BindingAchievementGoal? SelectedAchievementGoal
|
||||
public AchievementGoalView? SelectedAchievementGoal
|
||||
{
|
||||
get => selectedAchievementGoal;
|
||||
set
|
||||
@@ -166,10 +160,10 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
/// <summary>
|
||||
/// 未完成优先
|
||||
/// </summary>
|
||||
public bool IsIncompletedItemsFirst
|
||||
public bool IsUncompletedItemsFirst
|
||||
{
|
||||
get => isIncompletedItemsFirst;
|
||||
set => SetProperty(ref isIncompletedItemsFirst, value);
|
||||
get => isUncompletedItemsFirst;
|
||||
set => SetProperty(ref isUncompletedItemsFirst, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -181,11 +175,6 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
set => SetProperty(ref finishDescription, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 打开页面命令
|
||||
/// </summary>
|
||||
public ICommand OpenUICommand { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 添加存档命令
|
||||
/// </summary>
|
||||
@@ -219,7 +208,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
/// <summary>
|
||||
/// 筛选未完成项开关命令
|
||||
/// </summary>
|
||||
public ICommand SortIncompletedSwitchCommand { get; }
|
||||
public ICommand SortUncompletedSwitchCommand { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 保存单个成就命令
|
||||
@@ -241,7 +230,8 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
return false;
|
||||
}
|
||||
|
||||
private async Task OpenUIAsync()
|
||||
/// <inheritdoc/>
|
||||
protected override async Task OpenUIAsync()
|
||||
{
|
||||
bool metaInitialized = await metadataService.InitializeAsync().ConfigureAwait(false);
|
||||
|
||||
@@ -249,7 +239,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
{
|
||||
try
|
||||
{
|
||||
List<BindingAchievementGoal> sortedGoals;
|
||||
List<AchievementGoalView> sortedGoals;
|
||||
ObservableCollection<EntityAchievementArchive> archives;
|
||||
|
||||
using (await EnterCriticalExecutionAsync().ConfigureAwait(false))
|
||||
@@ -257,7 +247,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
List<MetadataAchievementGoal> goals = await metadataService.GetAchievementGoalsAsync(CancellationToken).ConfigureAwait(false);
|
||||
sortedGoals = goals
|
||||
.OrderBy(goal => goal.Order)
|
||||
.Select(goal => new BindingAchievementGoal(goal))
|
||||
.Select(goal => new AchievementGoalView(goal))
|
||||
.ToList();
|
||||
archives = await achievementService.GetArchiveCollectionAsync().ConfigureAwait(false);
|
||||
}
|
||||
@@ -387,11 +377,16 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
}
|
||||
}
|
||||
|
||||
private async Task UpdateAchievementsAsync(EntityAchievementArchive archive)
|
||||
private async Task UpdateAchievementsAsync(EntityAchievementArchive? archive)
|
||||
{
|
||||
if (archive == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
List<MetadataAchievement> rawAchievements = await metadataService.GetAchievementsAsync(CancellationToken).ConfigureAwait(false);
|
||||
|
||||
if (TryGetAchievements(archive, rawAchievements, out List<BindingAchievement>? combined))
|
||||
if (TryGetAchievements(archive, rawAchievements, out List<AchievementView>? combined))
|
||||
{
|
||||
// Assemble achievements on the UI thread.
|
||||
await ThreadHelper.SwitchToMainThreadAsync();
|
||||
@@ -403,7 +398,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryGetAchievements(EntityAchievementArchive archive, List<MetadataAchievement> achievements, out List<BindingAchievement>? combined)
|
||||
private bool TryGetAchievements(EntityAchievementArchive archive, List<MetadataAchievement> achievements, out List<AchievementView>? combined)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -422,9 +417,9 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
{
|
||||
if (Achievements != null)
|
||||
{
|
||||
if (IsIncompletedItemsFirst)
|
||||
if (IsUncompletedItemsFirst)
|
||||
{
|
||||
Achievements.SortDescriptions.Add(IncompletedItemsFirstSortDescription);
|
||||
Achievements.SortDescriptions.Add(UncompletedItemsFirstSortDescription);
|
||||
Achievements.SortDescriptions.Add(CompletionTimeSortDescription);
|
||||
}
|
||||
else
|
||||
@@ -434,7 +429,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateAchievementsFilterByGoal(BindingAchievementGoal? goal)
|
||||
private void UpdateAchievementsFilterByGoal(AchievementGoalView? goal)
|
||||
{
|
||||
if (Achievements != null)
|
||||
{
|
||||
@@ -445,12 +440,12 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
else
|
||||
{
|
||||
int goalId = goal.Id;
|
||||
Achievements.Filter = (object o) => o is BindingAchievement achi && achi.Inner.Goal == goalId;
|
||||
Achievements.Filter = (object o) => o is AchievementView view && view.Inner.Goal == goalId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateAchievementsFilterBySerach(string? search)
|
||||
private void UpdateAchievementsFilterBySearch(string? search)
|
||||
{
|
||||
if (Achievements != null)
|
||||
{
|
||||
@@ -458,16 +453,16 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
|
||||
if (!string.IsNullOrEmpty(search))
|
||||
{
|
||||
if (search.Length == 5 && int.TryParse(search, out int achiId))
|
||||
if (search.Length == 5 && int.TryParse(search, out int entityId))
|
||||
{
|
||||
Achievements.Filter = obj => ((BindingAchievement)obj).Inner.Id == achiId;
|
||||
Achievements.Filter = obj => ((AchievementView)obj).Inner.Id == entityId;
|
||||
}
|
||||
else
|
||||
{
|
||||
Achievements.Filter = obj =>
|
||||
{
|
||||
BindingAchievement achi = (BindingAchievement)obj;
|
||||
return achi.Inner.Title.Contains(search) || achi.Inner.Description.Contains(search);
|
||||
AchievementView view = (AchievementView)obj;
|
||||
return view.Inner.Title.Contains(search) || view.Inner.Description.Contains(search);
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -480,7 +475,7 @@ internal sealed class AchievementViewModel : Abstraction.ViewModel, INavigationR
|
||||
achievementFinishPercentUpdater.Update();
|
||||
}
|
||||
|
||||
private void SaveAchievement(BindingAchievement? achievement)
|
||||
private void SaveAchievement(AchievementView? achievement)
|
||||
{
|
||||
if (achievement != null)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using Snap.Hutao.Service.Abstraction;
|
||||
using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement;
|
||||
|
||||
@@ -25,8 +24,6 @@ internal sealed class AnnouncementViewModel : Abstraction.ViewModel
|
||||
public AnnouncementViewModel(IAnnouncementService announcementService)
|
||||
{
|
||||
this.announcementService = announcementService;
|
||||
|
||||
OpenUICommand = new AsyncRelayCommand(OpenUIAsync);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -38,12 +35,8 @@ internal sealed class AnnouncementViewModel : Abstraction.ViewModel
|
||||
set => SetProperty(ref announcement, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 打开界面触发的命令
|
||||
/// </summary>
|
||||
public ICommand OpenUICommand { get; }
|
||||
|
||||
private async Task OpenUIAsync()
|
||||
/// <inheritdoc/>
|
||||
protected override async Task OpenUIAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -53,4 +46,4 @@ internal sealed class AnnouncementViewModel : Abstraction.ViewModel
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@ using CalcConsumption = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.Consumptio
|
||||
using CalcItem = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.Item;
|
||||
using CalcItemHelper = Snap.Hutao.Web.Hoyolab.Takumi.Event.Calculate.ItemHelper;
|
||||
|
||||
namespace Snap.Hutao.ViewModel;
|
||||
namespace Snap.Hutao.ViewModel.AvatarProperty;
|
||||
|
||||
/// <summary>
|
||||
/// 角色属性视图模型
|
||||
@@ -57,7 +57,6 @@ internal sealed class AvatarPropertyViewModel : Abstraction.ViewModel, IRecipien
|
||||
infoBarService = serviceProvider.GetRequiredService<IInfoBarService>();
|
||||
this.serviceProvider = serviceProvider;
|
||||
|
||||
OpenUICommand = new AsyncRelayCommand(OpenUIAsync);
|
||||
RefreshFromEnkaApiCommand = new AsyncRelayCommand(RefreshByEnkaApiAsync);
|
||||
RefreshFromHoyolabGameRecordCommand = new AsyncRelayCommand(RefreshByHoyolabGameRecordAsync);
|
||||
RefreshFromHoyolabCalculateCommand = new AsyncRelayCommand(RefreshByHoyolabCalculateAsync);
|
||||
@@ -77,11 +76,6 @@ internal sealed class AvatarPropertyViewModel : Abstraction.ViewModel, IRecipien
|
||||
/// </summary>
|
||||
public AvatarView? SelectedAvatar { get => selectedAvatar; set => SetProperty(ref selectedAvatar, value); }
|
||||
|
||||
/// <summary>
|
||||
/// 加载界面命令
|
||||
/// </summary>
|
||||
public ICommand OpenUICommand { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 从 Enka Api 同步命令
|
||||
/// </summary>
|
||||
@@ -116,7 +110,8 @@ internal sealed class AvatarPropertyViewModel : Abstraction.ViewModel, IRecipien
|
||||
}
|
||||
}
|
||||
|
||||
private Task OpenUIAsync()
|
||||
/// <inheritdoc/>
|
||||
protected override Task OpenUIAsync()
|
||||
{
|
||||
if (UserAndUid.TryFromUser(userService.Current, out UserAndUid? userAndUid))
|
||||
{
|
||||
@@ -13,7 +13,7 @@ using Snap.Hutao.Service.Navigation;
|
||||
using Snap.Hutao.View.Dialog;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace Snap.Hutao.ViewModel;
|
||||
namespace Snap.Hutao.ViewModel.Cultivation;
|
||||
|
||||
/// <summary>
|
||||
/// 养成视图模型
|
||||
@@ -48,7 +48,6 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel
|
||||
logger = serviceProvider.GetRequiredService<ILogger<CultivationViewModel>>();
|
||||
this.serviceProvider = serviceProvider;
|
||||
|
||||
OpenUICommand = new AsyncRelayCommand(OpenUIAsync);
|
||||
AddProjectCommand = new AsyncRelayCommand(AddProjectAsync);
|
||||
RemoveProjectCommand = new AsyncRelayCommand<CultivateProject>(RemoveProjectAsync);
|
||||
RemoveEntryCommand = new AsyncRelayCommand<CultivateEntryView>(RemoveEntryAsync);
|
||||
@@ -72,10 +71,7 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel
|
||||
if (SetProperty(ref selectedProject, value))
|
||||
{
|
||||
cultivationService.Current = value;
|
||||
if (value != null)
|
||||
{
|
||||
UpdateEntryCollectionAsync(value).SafeForget(logger);
|
||||
}
|
||||
UpdateEntryCollectionAsync(value).SafeForget(logger);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -95,11 +91,6 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel
|
||||
/// </summary>
|
||||
public ObservableCollection<StatisticsCultivateItem>? StatisticsItems { get => statisticsItems; set => SetProperty(ref statisticsItems, value); }
|
||||
|
||||
/// <summary>
|
||||
/// 打开界面命令
|
||||
/// </summary>
|
||||
public ICommand OpenUICommand { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 添加项目命令
|
||||
/// </summary>
|
||||
@@ -130,7 +121,8 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel
|
||||
/// </summary>
|
||||
public ICommand FinishStateCommand { get; }
|
||||
|
||||
private async Task OpenUIAsync()
|
||||
/// <inheritdoc/>
|
||||
protected override async Task OpenUIAsync()
|
||||
{
|
||||
bool metaInitialized = await metadataService.InitializeAsync().ConfigureAwait(true);
|
||||
if (metaInitialized)
|
||||
@@ -201,7 +193,7 @@ internal sealed class CultivationViewModel : Abstraction.ViewModel
|
||||
}
|
||||
}
|
||||
|
||||
private async Task RemoveEntryAsync(Model.Binding.Cultivation.CultivateEntryView? entry)
|
||||
private async Task RemoveEntryAsync(CultivateEntryView? entry)
|
||||
{
|
||||
if (entry != null)
|
||||
{
|
||||
@@ -59,7 +59,6 @@ internal sealed class DailyNoteViewModel : Abstraction.ViewModel
|
||||
appDbContext = serviceProvider.GetRequiredService<AppDbContext>();
|
||||
this.serviceProvider = serviceProvider;
|
||||
|
||||
OpenUICommand = new AsyncRelayCommand(OpenUIAsync);
|
||||
TrackRoleCommand = new AsyncRelayCommand<UserAndUid>(TrackRoleAsync);
|
||||
RefreshCommand = new AsyncRelayCommand(RefreshAsync);
|
||||
RemoveDailyNoteCommand = new AsyncRelayCommand<DailyNoteEntry>(RemoveDailyNoteAsync);
|
||||
@@ -140,11 +139,6 @@ internal sealed class DailyNoteViewModel : Abstraction.ViewModel
|
||||
/// </summary>
|
||||
public ObservableCollection<DailyNoteEntry>? DailyNoteEntries { get => dailyNoteEntries; set => SetProperty(ref dailyNoteEntries, value); }
|
||||
|
||||
/// <summary>
|
||||
/// 打开界面命令
|
||||
/// </summary>
|
||||
public ICommand OpenUICommand { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 跟踪角色命令
|
||||
/// </summary>
|
||||
@@ -170,7 +164,8 @@ internal sealed class DailyNoteViewModel : Abstraction.ViewModel
|
||||
/// </summary>
|
||||
public ICommand DailyNoteVerificationCommand { get; }
|
||||
|
||||
private async Task OpenUIAsync()
|
||||
/// <inheritdoc/>
|
||||
protected override async Task OpenUIAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
@@ -7,7 +7,6 @@ using Snap.Hutao.Control.Extension;
|
||||
using Snap.Hutao.Core.ExceptionService;
|
||||
using Snap.Hutao.Core.IO;
|
||||
using Snap.Hutao.Factory.Abstraction;
|
||||
using Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Entity;
|
||||
using Snap.Hutao.Model.InterChange.GachaLog;
|
||||
using Snap.Hutao.Service.Abstraction;
|
||||
@@ -17,7 +16,7 @@ using Snap.Hutao.View.Dialog;
|
||||
using System.Collections.ObjectModel;
|
||||
using Windows.Storage.Pickers;
|
||||
|
||||
namespace Snap.Hutao.ViewModel;
|
||||
namespace Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
/// <summary>
|
||||
/// 祈愿记录视图模型
|
||||
@@ -59,7 +58,6 @@ internal sealed class GachaLogViewModel : Abstraction.ViewModel
|
||||
this.contentDialogFactory = contentDialogFactory;
|
||||
this.options = options;
|
||||
|
||||
OpenUICommand = new AsyncRelayCommand(OpenUIAsync);
|
||||
RefreshByWebCacheCommand = new AsyncRelayCommand(RefreshByWebCacheAsync);
|
||||
RefreshByStokenCommand = new AsyncRelayCommand(RefreshByStokenAsync);
|
||||
RefreshByManualInputCommand = new AsyncRelayCommand(RefreshByManualInputAsync);
|
||||
@@ -93,7 +91,7 @@ internal sealed class GachaLogViewModel : Abstraction.ViewModel
|
||||
{
|
||||
if (SetProperty(ref statistics, value))
|
||||
{
|
||||
SelectedHistoryWish = statistics?.HistoryWishes[0];
|
||||
SelectedHistoryWish = statistics?.HistoryWishes.FirstOrDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -108,11 +106,6 @@ internal sealed class GachaLogViewModel : Abstraction.ViewModel
|
||||
/// </summary>
|
||||
public bool IsAggressiveRefresh { get => isAggressiveRefresh; set => SetProperty(ref isAggressiveRefresh, value); }
|
||||
|
||||
/// <summary>
|
||||
/// 页面加载命令
|
||||
/// </summary>
|
||||
public ICommand OpenUICommand { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 浏览器缓存刷新命令
|
||||
/// </summary>
|
||||
@@ -143,7 +136,8 @@ internal sealed class GachaLogViewModel : Abstraction.ViewModel
|
||||
/// </summary>
|
||||
public ICommand RemoveArchiveCommand { get; }
|
||||
|
||||
private async Task OpenUIAsync()
|
||||
/// <inheritdoc/>
|
||||
protected override async Task OpenUIAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -332,7 +326,7 @@ internal sealed class GachaLogViewModel : Abstraction.ViewModel
|
||||
{
|
||||
if (archive == null)
|
||||
{
|
||||
// no gachalog
|
||||
// no gacha log
|
||||
IsInitialized = true;
|
||||
}
|
||||
else
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace Snap.Hutao.Model.Binding.Gacha;
|
||||
namespace Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
/// <summary>
|
||||
/// 祈愿统计
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace Snap.Hutao.Model.Binding.Gacha;
|
||||
namespace Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
/// <summary>
|
||||
/// 历史卡池概览
|
||||
@@ -1,7 +1,9 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Binding;
|
||||
|
||||
namespace Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
/// <summary>
|
||||
/// 历史物品
|
||||
@@ -1,7 +1,9 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace Snap.Hutao.Model.Binding.Gacha;
|
||||
using Snap.Hutao.Model.Binding;
|
||||
|
||||
namespace Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
/// <summary>
|
||||
/// 祈愿卡池列表物品
|
||||
@@ -17,7 +19,7 @@ internal sealed class SummaryItem : Item
|
||||
/// <summary>
|
||||
/// 是否为大保底
|
||||
/// </summary>
|
||||
public bool IsGuarentee { get; set; }
|
||||
public bool IsGuarantee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 据上次
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace Snap.Hutao.Model.Binding.Gacha;
|
||||
namespace Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
/// <summary>
|
||||
/// 类型化的祈愿概览
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright (c) DGP Studio. All rights reserved.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace Snap.Hutao.Model.Binding.Gacha;
|
||||
namespace Snap.Hutao.ViewModel.GachaLog;
|
||||
|
||||
/// <summary>
|
||||
/// 祈愿基类
|
||||
Reference in New Issue
Block a user