搜索类型 ID

This commit is contained in:
lanyi 2022-01-25 14:08:39 +01:00
parent bedc003966
commit 289f6551c1
4 changed files with 53 additions and 6 deletions

View File

@ -6,6 +6,10 @@
StartupUri="MainWindow.xaml">
<Application.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<c:ValueConverterAggregate x:Key="FalseToVisibilityConverter">
<c:BooleanInvertConverter />
<BooleanToVisibilityConverter />
</c:ValueConverterAggregate>
<c:ValueConverterAggregate x:Key="ValidInputEntryToVisibilityConverter">
<c:ValidInputEntryTypeToBooleanConverter />
<BooleanToVisibilityConverter />

View File

@ -13,9 +13,11 @@ namespace HashCalculator.GUI
public string Name { get; }
public string NameString { get; }
public IReadOnlyList<string> DisplayLabels { get; }
public uint InstanceId => SageHash.CalculateLowercaseHash(Name);
public uint InstanceId { get; }
public uint TypeId { get; }
public string InstanceIdString => $"{InstanceId:x8} ({InstanceId,10})";
public string InstanceIdString { get; }
public string TypeIdString { get; }
public string LocalizedNames
{
@ -79,6 +81,10 @@ namespace HashCalculator.GUI
var transformLabels = from name in element.Elements(ModXml.EalaAsset + "DisplayNameTransformed")
select name.Value;
DisplayLabels = labels.Concat(transformLabels).ToArray();
InstanceId = SageHash.CalculateLowercaseHash(Name);
TypeId = SageHash.CalculateBinaryHash(Type);
InstanceIdString = $"{InstanceId:x8} ({InstanceId,10})";
TypeIdString = $"{TypeId:x8} ({TypeId,10})";
}
public AssetEntry(Asset asset)
@ -91,10 +97,14 @@ namespace HashCalculator.GUI
Name = asset.InstanceName;
NameString = $"{Type}:{Name}";
DisplayLabels = Array.Empty<string>();
if (InstanceId != asset.InstanceId || SageHash.CalculateBinaryHash(Type) != asset.TypeId)
InstanceId = SageHash.CalculateLowercaseHash(Name);
TypeId = SageHash.CalculateBinaryHash(Type);
if (InstanceId != asset.InstanceId || TypeId != asset.TypeId)
{
throw new InvalidDataException();
}
InstanceIdString = $"{InstanceId:x8} ({InstanceId,10})";
TypeIdString = $"{TypeId:x8} ({TypeId,10})";
}
public bool Equals(AssetEntry? entry)

View File

@ -179,9 +179,20 @@
Content="只显示 GameObject"
IsChecked="{Binding GameObjectOnly}"
Command="{Binding FilterDisplayEntries}"
Width="155"
Padding="4,0"
Margin="8,0"
VerticalAlignment="Center"
/>
<CheckBox
DockPanel.Dock="Right"
Content="搜索类型 ID"
IsChecked="{Binding ConsiderTypeId}"
Command="{Binding FilterDisplayEntries}"
Padding="4,0"
Margin="8,0"
VerticalAlignment="Center"
Visibility="{Binding GameObjectOnly, Converter={StaticResource FalseToVisibilityConverter}}"
/>
<TextBlock
Text="{Binding DisplayEntries.Count, StringFormat=列表里显示了{0}个素材}"
Margin="5,0,0,0"
@ -238,6 +249,14 @@
Path=DataContext.IsXml,
Converter={StaticResource BooleanToVisibilityConverter}}"
/>
<DataGridTextColumn
Header="类型 ID"
Binding="{Binding TypeIdString}"
FontFamily="Courier New"
Visibility="{Binding Source={x:Reference Name=ReferenceProvider},
Path=DataContext.ConsiderTypeId,
Converter={StaticResource BooleanToVisibilityConverter}}"
/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>

View File

@ -67,6 +67,13 @@ namespace HashCalculator.GUI
set => SetField(ref _gameObjectOnly, value);
}
private bool _considerTypeId;
public bool ConsiderTypeId
{
get => _considerTypeId;
set => SetField(ref _considerTypeId, value);
}
public Command FilterDisplayEntries { get; }
private int _totalCount;
@ -188,11 +195,11 @@ namespace HashCalculator.GUI
foreach (var chunk in Filter!.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
{
if (entry.NameString.IndexOf(chunk, StringComparison.OrdinalIgnoreCase) != -1)
if (entry.NameString.Contains(chunk, StringComparison.OrdinalIgnoreCase))
{
return true;
}
if (entry.InstanceIdString.IndexOf(chunk, StringComparison.OrdinalIgnoreCase) != -1)
if (entry.InstanceIdString.Contains(chunk, StringComparison.OrdinalIgnoreCase))
{
return true;
}
@ -203,6 +210,13 @@ namespace HashCalculator.GUI
return true;
}
}
if (!GameObjectOnly && ConsiderTypeId)
{
if (entry.TypeIdString.Contains(chunk, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
}
return false;
}