refactor localization

This commit is contained in:
DismissedLight
2023-03-03 16:49:27 +08:00
parent 63e1273d6a
commit 706fb3404b
63 changed files with 148 additions and 8569 deletions

View File

@@ -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}";

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -83,9 +83,10 @@ internal sealed class Material : Display
return TypeDescription switch
{
"角色与武器培养素材" => true,
"角色经验素材" => true,
"角色培养素材" => true,
"天赋培养素材" => true,
"角色突破素材" => true,
"角色天赋素材" => true,
"武器强化素材" => true,
"武器突破素材" => true,
_ => false,

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}
}
}

View File

@@ -432,6 +432,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Control\Extension\" />
<Folder Include="Model\Binding\Gacha\" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resource\Localization\SH.Designer.cs">

View File

@@ -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"

View File

@@ -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=&#xE8CB;}"
IsChecked="{Binding IsIncompletedItemsFirst}"
IsChecked="{Binding IsUncompletedItemsFirst}"
Label="{shcm:ResourceString Name=ViewPageAchievementSortIncompletedItemsFirst}"/>
</CommandBar>
</Grid>

View File

@@ -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">

View File

@@ -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;

View File

@@ -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>

View File

@@ -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;

View File

@@ -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">

View File

@@ -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;

View File

@@ -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 内的代码运行完成
/// 防止 视图资源被回收

View File

@@ -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;

View File

@@ -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;

View File

@@ -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>

View File

@@ -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));
}

View File

@@ -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)
{

View File

@@ -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
{
}
}
}
}

View File

@@ -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))
{

View File

@@ -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)
{

View File

@@ -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
{

View File

@@ -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

View File

@@ -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>
/// 祈愿统计

View File

@@ -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>
/// 历史卡池概览

View File

@@ -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>
/// 历史物品

View File

@@ -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>
/// 据上次

View File

@@ -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>
/// 类型化的祈愿概览

View File

@@ -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>
/// 祈愿基类