diff --git a/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/AutoSuggestTokenBox.cs b/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/AutoSuggestTokenBox.cs index 03c90f31..00a5a25c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/AutoSuggestTokenBox.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/AutoSuggestTokenBox.cs @@ -57,6 +57,7 @@ internal sealed partial class AutoSuggestTokenBox : TokenizingTextBox sender.ItemsSource = AvailableTokens .Where(kvp => kvp.Value.Value.Contains(Text, StringComparison.OrdinalIgnoreCase)) .OrderBy(kvp => kvp.Value.Kind) + .ThenBy(kvp => kvp.Value.Order) .Select(kvp => kvp.Value) .DefaultIfEmpty(SearchToken.NotFound); } diff --git a/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/SearchToken.cs b/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/SearchToken.cs index dc4588ef..21cec83e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/SearchToken.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/SearchToken.cs @@ -7,15 +7,16 @@ namespace Snap.Hutao.Control.AutoSuggestBox; internal sealed class SearchToken { - public static readonly SearchToken NotFound = new(SearchTokenKind.None, SH.ControlAutoSuggestBoxNotFoundValue); + public static readonly SearchToken NotFound = new(SearchTokenKind.None, SH.ControlAutoSuggestBoxNotFoundValue, 0); - public SearchToken(SearchTokenKind kind, string value, Uri? iconUri = null, Uri? sideIconUri = null, Color? quality = null) + public SearchToken(SearchTokenKind kind, string value, int order, Uri? iconUri = null, Uri? sideIconUri = null, Color? quality = null) { Value = value; Kind = kind; IconUri = iconUri; SideIconUri = sideIconUri; Quality = quality; + Order = order; } public SearchTokenKind Kind { get; } @@ -28,6 +29,8 @@ internal sealed class SearchToken public Color? Quality { get; } + public int Order { get; } + public override string ToString() { return Value; diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/Frozen/IntrinsicFrozen.cs b/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/Frozen/IntrinsicFrozen.cs index 6963ff37..7d9604a8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/Frozen/IntrinsicFrozen.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/Frozen/IntrinsicFrozen.cs @@ -11,34 +11,26 @@ namespace Snap.Hutao.Model.Intrinsic.Frozen; [HighQuality] internal static class IntrinsicFrozen { - /// - /// 所属地区 - /// public static FrozenSet AssociationTypes { get; } = Enum.GetValues().Select(e => e.GetLocalizedDescriptionOrDefault()).OfType().ToFrozenSet(); - /// - /// 武器类型 - /// + public static FrozenSet> AssociationTypeNameValues { get; } = Enum.GetValues().Select(e => new NameValue(e.GetLocalizedDescriptionOrDefault()!, e)).Where(nv => !string.IsNullOrEmpty(nv.Name)).ToFrozenSet(); + public static FrozenSet WeaponTypes { get; } = Enum.GetValues().Select(e => e.GetLocalizedDescriptionOrDefault()).OfType().ToFrozenSet(); - /// - /// 物品类型 - /// + public static FrozenSet> WeaponTypeNameValues { get; } = Enum.GetValues().Select(e => new NameValue(e.GetLocalizedDescriptionOrDefault()!, e)).Where(nv => !string.IsNullOrEmpty(nv.Name)).ToFrozenSet(); + public static FrozenSet ItemQualities { get; } = Enum.GetValues().Select(e => e.GetLocalizedDescriptionOrDefault()).OfType().ToFrozenSet(); - /// - /// 身材类型 - /// + public static FrozenSet> ItemQualityNameValues { get; } = Enum.GetValues().Select(e => new NameValue(e.GetLocalizedDescriptionOrDefault()!, e)).Where(nv => !string.IsNullOrEmpty(nv.Name)).ToFrozenSet(); + public static FrozenSet BodyTypes { get; } = Enum.GetValues().Select(e => e.GetLocalizedDescriptionOrDefault()).OfType().ToFrozenSet(); - /// - /// 战斗属性 - /// + public static FrozenSet> BodyTypeNameValues { get; } = Enum.GetValues().Select(e => new NameValue(e.GetLocalizedDescriptionOrDefault()!, e)).Where(nv => !string.IsNullOrEmpty(nv.Name)).ToFrozenSet(); + public static FrozenSet FightProperties { get; } = Enum.GetValues().Select(e => e.GetLocalizedDescriptionOrDefault()).OfType().ToFrozenSet(); - /// - /// 元素名称 - /// + public static FrozenSet> FightPropertyNameValues { get; } = Enum.GetValues().Select(e => new NameValue(e.GetLocalizedDescriptionOrDefault()!, e)).Where(nv => !string.IsNullOrEmpty(nv.Name)).ToFrozenSet(); + public static FrozenSet ElementNames { get; } = FrozenSet.ToFrozenSet( [ SH.ModelIntrinsicElementNameFire, @@ -50,6 +42,17 @@ internal static class IntrinsicFrozen SH.ModelIntrinsicElementNameRock, ]); + public static FrozenSet> ElementNameValues { get; } = FrozenSet.ToFrozenSet( + [ + new NameValue(SH.ModelIntrinsicElementNameFire, 1), + new NameValue(SH.ModelIntrinsicElementNameWater, 2), + new NameValue(SH.ModelIntrinsicElementNameGrass, 3), + new NameValue(SH.ModelIntrinsicElementNameElec, 4), + new NameValue(SH.ModelIntrinsicElementNameWind, 5), + new NameValue(SH.ModelIntrinsicElementNameIce, 6), + new NameValue(SH.ModelIntrinsicElementNameRock, 7), + ]); + public static FrozenSet MaterialTypeDescriptions { get; } = FrozenSet.ToFrozenSet( [ SH.ModelMetadataMaterialCharacterAndWeaponEnhancementMaterial, diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AssociationTypeIconConverter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AssociationTypeIconConverter.cs index e307895f..5db2c9cb 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AssociationTypeIconConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AssociationTypeIconConverter.cs @@ -9,24 +9,6 @@ namespace Snap.Hutao.Model.Metadata.Converter; internal sealed class AssociationTypeIconConverter : ValueConverter { - private static readonly FrozenDictionary LocalizedNameToAssociationType = FrozenDictionary.ToFrozenDictionary( - [ - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeMondstadt, AssociationType.ASSOC_TYPE_MONDSTADT), - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeLiyue, AssociationType.ASSOC_TYPE_LIYUE), - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeFatui, AssociationType.ASSOC_TYPE_FATUI), - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeInazuma, AssociationType.ASSOC_TYPE_INAZUMA), - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeRanger, AssociationType.ASSOC_TYPE_RANGER), - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeSumeru, AssociationType.ASSOC_TYPE_SUMERU), - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeFontaine, AssociationType.ASSOC_TYPE_FONTAINE), - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeNatlan, AssociationType.ASSOC_TYPE_NATLAN), - KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeSnezhnaya, AssociationType.ASSOC_TYPE_SNEZHNAYA), - ]); - - public static Uri? AssociationTypeNameToIconUri(string associationTypeName) - { - return AssociationTypeToIconUri(LocalizedNameToAssociationType.GetValueOrDefault(associationTypeName)); - } - public static Uri? AssociationTypeToIconUri(AssociationType type) { string? association = type switch diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs index fdb9e631..52c1475b 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs @@ -119,12 +119,12 @@ internal sealed partial class WikiAvatarViewModel : Abstraction.ViewModel availableTokens = FrozenDictionary.ToFrozenDictionary( [ - .. avatars.Select(avatar => KeyValuePair.Create(avatar.Name, new SearchToken(SearchTokenKind.Avatar, avatar.Name, sideIconUri: AvatarSideIconConverter.IconNameToUri(avatar.SideIcon)))), - .. IntrinsicFrozen.AssociationTypes.Select(assoc => KeyValuePair.Create(assoc, new SearchToken(SearchTokenKind.AssociationType, assoc, iconUri: AssociationTypeIconConverter.AssociationTypeNameToIconUri(assoc)))), - .. IntrinsicFrozen.BodyTypes.Select(b => KeyValuePair.Create(b, new SearchToken(SearchTokenKind.BodyType, b))), - .. IntrinsicFrozen.ElementNames.Select(e => KeyValuePair.Create(e, new SearchToken(SearchTokenKind.ElementName, e, iconUri: ElementNameIconConverter.ElementNameToIconUri(e)))), - .. IntrinsicFrozen.ItemQualities.Select(i => KeyValuePair.Create(i, new SearchToken(SearchTokenKind.ItemQuality, i, quality: QualityColorConverter.QualityNameToColor(i)))), - .. IntrinsicFrozen.WeaponTypes.Select(w => KeyValuePair.Create(w, new SearchToken(SearchTokenKind.WeaponType, w, iconUri: WeaponTypeIconConverter.WeaponTypeNameToIconUri(w)))), + .. avatars.Select((avatar, index) => KeyValuePair.Create(avatar.Name, new SearchToken(SearchTokenKind.Avatar, avatar.Name, index, sideIconUri: AvatarSideIconConverter.IconNameToUri(avatar.SideIcon)))), + .. IntrinsicFrozen.AssociationTypeNameValues.Select(nv => KeyValuePair.Create(nv.Name, new SearchToken(SearchTokenKind.AssociationType, nv.Name, (int)nv.Value, iconUri: AssociationTypeIconConverter.AssociationTypeToIconUri(nv.Value)))), + .. IntrinsicFrozen.BodyTypeNameValues.Select(nv => KeyValuePair.Create(nv.Name, new SearchToken(SearchTokenKind.BodyType, nv.Name, (int)nv.Value))), + .. IntrinsicFrozen.ElementNameValues.Select(nv => KeyValuePair.Create(nv.Name, new SearchToken(SearchTokenKind.ElementName, nv.Name, nv.Value, iconUri: ElementNameIconConverter.ElementNameToIconUri(nv.Name)))), + .. IntrinsicFrozen.ItemQualityNameValues.Select(nv => KeyValuePair.Create(nv.Name, new SearchToken(SearchTokenKind.ItemQuality, nv.Name, (int)nv.Value, quality: QualityColorConverter.QualityToColor(nv.Value)))), + .. IntrinsicFrozen.WeaponTypeNameValues.Select(nv => KeyValuePair.Create(nv.Name, new SearchToken(SearchTokenKind.WeaponType, nv.Name, (int)nv.Value, iconUri: WeaponTypeIconConverter.WeaponTypeToIconUri(nv.Value)))), ]); return true; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs index efa792e0..69e19d14 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs @@ -119,10 +119,10 @@ internal sealed partial class WikiWeaponViewModel : Abstraction.ViewModel availableTokens = FrozenDictionary.ToFrozenDictionary( [ - .. weapons.Select(w => KeyValuePair.Create(w.Name, new SearchToken(SearchTokenKind.Weapon, w.Name, sideIconUri: EquipIconConverter.IconNameToUri(w.Icon)))), - .. IntrinsicFrozen.FightProperties.Select(f => KeyValuePair.Create(f, new SearchToken(SearchTokenKind.FightProperty, f))), - .. IntrinsicFrozen.ItemQualities.Select(i => KeyValuePair.Create(i, new SearchToken(SearchTokenKind.ItemQuality, i, quality: QualityColorConverter.QualityNameToColor(i)))), - .. IntrinsicFrozen.WeaponTypes.Select(w => KeyValuePair.Create(w, new SearchToken(SearchTokenKind.WeaponType, w, iconUri: WeaponTypeIconConverter.WeaponTypeNameToIconUri(w)))), + .. weapons.Select((weapon, index) => KeyValuePair.Create(weapon.Name, new SearchToken(SearchTokenKind.Weapon, weapon.Name, index, sideIconUri: EquipIconConverter.IconNameToUri(weapon.Icon)))), + .. IntrinsicFrozen.FightPropertyNameValues.Select(nv => KeyValuePair.Create(nv.Name, new SearchToken(SearchTokenKind.FightProperty, nv.Name, (int)nv.Value))), + .. IntrinsicFrozen.ItemQualityNameValues.Select(nv => KeyValuePair.Create(nv.Name, new SearchToken(SearchTokenKind.ItemQuality, nv.Name, (int)nv.Value, quality: QualityColorConverter.QualityToColor(nv.Value)))), + .. IntrinsicFrozen.WeaponTypeNameValues.Select(nv => KeyValuePair.Create(nv.Name, new SearchToken(SearchTokenKind.WeaponType, nv.Name, (int)nv.Value, iconUri: WeaponTypeIconConverter.WeaponTypeToIconUri(nv.Value)))), ]); } catch (OperationCanceledException)