//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// using System; using System.Collections.Generic; using BansheeEngine; namespace BansheeEditor { /** @addtogroup Inspectors * @{ */ /// /// Renders an inspector for the resource. /// [CustomInspector(typeof(StringTable))] internal class StringTableInspector : Inspector { private GUIEnumField languageField; private GUIDictionaryField valuesField; private Dictionary strings = new Dictionary(); /// protected internal override void Initialize() { LoadResource(); BuildGUI(); } /// protected internal override InspectableState Refresh() { // Note: We're ignoring changes to the string table made externally here in order to avoid a lot of checks. if ((Language) languageField.Value != StringTables.ActiveLanguage) { languageField.Value = (ulong)StringTables.ActiveLanguage; BuildGUI(); } valuesField.Refresh(); return InspectableState.NotModified; } /// /// Recreates all the GUI elements used by this inspector. /// private void BuildGUI() { Layout.Clear(); strings.Clear(); StringTable stringTable = InspectedObject as StringTable; if(stringTable == null) return; string[] identifiers = stringTable.Identifiers; foreach (var identifier in identifiers) strings[identifier] = stringTable.GetString(identifier, StringTables.ActiveLanguage); languageField = new GUIEnumField(typeof (Language)); languageField.OnSelectionChanged += x => { StringTables.ActiveLanguage = (Language)x; BuildGUI(); Refresh(); }; Layout.AddElement(languageField); valuesField = GUIDictionaryField.Create( new LocEdString("Strings"), strings, Layout); valuesField.IsExpanded = Persistent.GetBool("valuesField_Expanded"); valuesField.OnExpand += x => Persistent.SetBool("valuesField_Expanded", x); valuesField.OnChanged += x => { if (x != null) { foreach (var KVP in x) { if (stringTable.Contains(KVP.Key)) { string oldValue = stringTable.GetString(KVP.Key, StringTables.ActiveLanguage); if (oldValue != KVP.Value) stringTable.SetString(KVP.Key, StringTables.ActiveLanguage, KVP.Value); } else stringTable.SetString(KVP.Key, StringTables.ActiveLanguage, KVP.Value); } string[] oldIdentifiers = stringTable.Identifiers; foreach (var identifier in oldIdentifiers) { if (!x.ContainsKey(identifier)) stringTable.RemoveString(identifier); } strings = x; } else { foreach (var KVP in strings) stringTable.RemoveString(KVP.Key); strings.Clear(); } EditorApplication.SetDirty(stringTable); }; valuesField.OnValueChanged += x => { stringTable.SetString(x, StringTables.ActiveLanguage, strings[x]); EditorApplication.SetDirty(stringTable); }; valuesField.OnValueRemoved += x => { stringTable.RemoveString(x); EditorApplication.SetDirty(stringTable); }; Layout.AddSpace(10); } /// /// Row element used for displaying GUI for string table dictionary elements. /// internal class StringTableEntry : GUIDictionaryFieldRow { private GUITextField keyField; private GUITextField valueField; /// protected override GUILayoutX CreateKeyGUI(GUILayoutY layout) { GUILayoutX titleLayout = layout.AddLayoutX(); keyField = new GUITextField(new LocEdString("Identifier")); titleLayout.AddElement(keyField); keyField.OnChanged += SetKey; return titleLayout; } /// protected override void CreateValueGUI(GUILayoutY layout) { string value = GetValue(); valueField = new GUITextField(new LocEdString(value)); layout.AddElement(valueField); valueField.OnChanged += x => { SetValue(x); MarkAsModified(); }; valueField.OnConfirmed += ConfirmModify; valueField.OnFocusLost += ConfirmModify; } /// protected override void OnEditModeChanged(bool editMode) { keyField.Disabled = !editMode; } /// internal protected override InspectableState Refresh() { keyField.Value = GetKey(); valueField.Value = GetValue(); return base.Refresh(); } } } /** @} */ }