using System; using System.Collections.Generic; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.Localization.Tables; using UnityEngine.UIElements; namespace UnityEditor.Localization.UI { /// /// Displays all the asset tables for the project collated by type. /// #if UNITY_2023_3_OR_NEWER [UxmlElement] #endif partial class ProjectTablesPopup : PopupField, IDisposable { internal class NoTables : LocalizationTableCollection { protected internal override Type TableType => null; protected internal override Type RequiredExtensionAttribute => null; protected internal override string DefaultGroupName => "No Tables"; public override string ToString() => k_NoTablesMessage; public override void RemoveEntry(TableEntryReference entryReference) {} } const string k_EditorPrefValueKey = "Localization-SelectedAssetTable"; const string k_NoTablesMessage = "No Tables Found. Please Create One"; #if !UNITY_2023_3_OR_NEWER internal new class UxmlFactory : UxmlFactory {} #endif static readonly NoTables k_NoTables = NoTables.CreateInstance(); static readonly List s_Tables = new List(); public ProjectTablesPopup() : base(GetChoices(), GetDefaultIndex(), FormatSelectedLabel, FormatListLabel) { label = "Selected collection"; RegisterCallback(evt => { LocalizationEditorSettings.EditorEvents.CollectionAdded += OnCollectionAdded; LocalizationEditorSettings.EditorEvents.CollectionRemoved += OnCollectionRemoved; LocalizationEditorSettings.EditorEvents.CollectionModified += OnCollectionModified; }); RegisterCallback(evt => { ((IDisposable)this).Dispose(); }); } void IDisposable.Dispose() { LocalizationEditorSettings.EditorEvents.CollectionAdded -= OnCollectionAdded; LocalizationEditorSettings.EditorEvents.CollectionRemoved -= OnCollectionRemoved; LocalizationEditorSettings.EditorEvents.CollectionModified -= OnCollectionModified; } void OnCollectionModified(object called, LocalizationTableCollection col) { OnCollectionAdded(col); } void OnCollectionAdded(LocalizationTableCollection col) { bool isEmpty = value is NoTables; GetChoices(); // If we currently have no tables then select the new collection. if (isEmpty) value = col; } void OnCollectionRemoved(LocalizationTableCollection col) { var choices = GetChoices(); if (value == col) value = choices[0]; } static int GetDefaultIndex() { var selection = EditorPrefs.GetString(k_EditorPrefValueKey, null); if (!string.IsNullOrEmpty(selection)) { for (int i = 0; i < s_Tables.Count; ++i) { if (s_Tables[i]?.ToString() == selection) return i; } } return 0; } public override LocalizationTableCollection value { get => base.value; set { if (value == null) EditorPrefs.DeleteKey(k_EditorPrefValueKey); else EditorPrefs.SetString(k_EditorPrefValueKey, value.ToString()); base.value = value; } } public void RefreshLabels() { GetChoices(); var newValue = Mathf.Clamp(s_Tables.FindIndex(o => value.Equals(o)), 0, s_Tables.Count); SetValueWithoutNotify(s_Tables[newValue]); } static string FormatListLabel(LocalizationTableCollection atc) { return atc is NoTables ? atc.ToString() : $"{atc.Group}/{atc.TableCollectionName}"; } static string FormatSelectedLabel(LocalizationTableCollection atc) { if (atc != null) return atc.ToString(); return k_NoTablesMessage; } static List GetChoices() { s_Tables.Clear(); s_Tables.AddRange(LocalizationEditorSettings.Instance.TableCollectionCache.StringTableCollections); s_Tables.AddRange(LocalizationEditorSettings.Instance.TableCollectionCache.AssetTableCollections); if (s_Tables.Count == 0) s_Tables.Add(k_NoTables); return s_Tables; } } }