2025-05-01 01:48:08 -07:00

185 lines
5.7 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Metadata;
using UnityEngine.Localization.Tables;
using Object = UnityEngine.Object;
namespace UnityEditor.Localization.UI
{
class AssetTableTreeViewItem : GenericAssetTableTreeViewItem<AssetTable>
{
static readonly Dictionary<(string, Type), Object> s_CachedAssets = new Dictionary<(string, Type), Object>();
(Object value, AssetTable table)[] m_TableProperties;
List<LocalizationTable> m_SortedTables;
int m_StartIndex;
SharedTableData m_SharedTableData;
AssetTypeMetadata m_AssetTypeMetadata;
AssetTableCollection m_AssetTableCollection;
public Type AssetType => m_AssetTypeMetadata == null ? typeof(Object) : m_AssetTypeMetadata.Type;
public override string displayName
{
get
{
DelayedInit();
return base.displayName;
}
set => base.displayName = value;
}
static Object GetAssetFromCache(AssetTableEntry entry, Type type)
{
if (s_CachedAssets.TryGetValue((entry.Address, type), out var foundAsset))
return foundAsset;
var asset = AssetUtility.LoadAssetFromAddress(entry.Address, type);
s_CachedAssets[(entry.Address, type)] = asset;
return asset;
}
public override void Initialize(LocalizationTableCollection collection, int startIdx, List<LocalizationTable> sortedTables)
{
m_SortedTables = sortedTables;
m_StartIndex = startIdx;
m_AssetTableCollection = (AssetTableCollection)collection;
m_TableProperties = new(Object, AssetTable)[startIdx + sortedTables.Count];
// Get the shared data
m_SharedTableData = collection.SharedData;
Debug.Assert(m_SharedTableData != null);
for (int i = startIdx; i < m_TableProperties.Length; ++i)
{
m_TableProperties[i] = (null, sortedTables[i - startIdx] as AssetTable);
}
RefreshFields();
}
void DelayedInit()
{
if (m_TableProperties == null)
{
m_TableProperties = new(Object, AssetTable)[m_StartIndex + m_SortedTables.Count];
// Get the shared data
m_SharedTableData = m_AssetTableCollection.SharedData;
Debug.Assert(m_SharedTableData != null);
for (int i = m_StartIndex; i < m_TableProperties.Length; ++i)
{
m_TableProperties[i] = (null, m_SortedTables[i - m_StartIndex] as AssetTable);
}
RefreshFields();
}
}
public void RefreshFields()
{
UpdateType();
var type = AssetType;
for (int i = 0; i < m_TableProperties.Length; ++i)
{
var table = m_TableProperties[i].table;
if (table == null)
continue;
var entry = table.GetEntry(SharedEntry.Id);
Object asset = null;
if (entry != null)
{
asset = GetAssetFromCache(entry, type);
}
m_TableProperties[i].value = asset;
}
UpdateSearchString();
}
void UpdateType()
{
m_AssetTypeMetadata = null;
foreach (var md in m_SharedTableData.Metadata.MetadataEntries)
{
if (md is AssetTypeMetadata at)
{
if (at.Contains(KeyId))
{
m_AssetTypeMetadata = at;
return;
}
}
}
}
public Object GetTableAsset(int colIdx)
{
DelayedInit();
return m_TableProperties[colIdx].value;
}
public void SetAsset(Object asset, int colIdx)
{
DelayedInit();
try
{
if (asset == null)
{
m_AssetTableCollection.RemoveAssetFromTable(m_TableProperties[colIdx].table, KeyId, true);
}
else
{
m_AssetTableCollection.AddAssetToTable(m_TableProperties[colIdx].table, KeyId, asset, true);
}
}
catch (Exception ex)
{
Debug.LogException(ex);
return;
}
m_TableProperties[colIdx].value = asset;
UpdateType();
UpdateSearchString();
}
public override void OnDeleteKey()
{
DelayedInit();
foreach (var tableProperties in m_TableProperties)
{
if (tableProperties.table != null && tableProperties.value != null)
{
m_AssetTableCollection.RemoveAssetFromTable(tableProperties.table, KeyId, true);
}
}
}
void UpdateSearchString()
{
DelayedInit();
using (StringBuilderPool.Get(out var sb))
{
sb.AppendLine(SharedEntry.Id.ToString());
sb.AppendLine(SharedEntry.Key);
foreach (var tableAsset in m_TableProperties)
{
if (tableAsset.value != null)
{
sb.AppendLine(tableAsset.value.name);
}
}
displayName = sb.ToString();
}
}
}
}