//********************************** 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(Font))] internal class FontInspector : Inspector { private GUIArrayField fontSizes; private GUIArrayField charRanges; private GUIEnumField renderModeField; private GUIToggleField boldField; private GUIToggleField italicField; private GUIIntField dpiField; private GUIButton reimportButton; private FontImportOptions importOptions; /// protected internal override void Initialize() { importOptions = GetImportOptions(); BuildGUI(); } /// protected internal override InspectableState Refresh() { FontImportOptions newImportOptions = GetImportOptions(); bool rebuildGUI = false; int[] newFontSizes = newImportOptions.FontSizes; if (newFontSizes == null) rebuildGUI |= fontSizes.Array != null; else { if (fontSizes.Array == null) rebuildGUI = true; else rebuildGUI |= newFontSizes.Length != fontSizes.Array.GetLength(0); } CharRange[] newCharRanges = newImportOptions.CharRanges; if (newCharRanges == null) rebuildGUI |= charRanges.Array != null; else { if (charRanges.Array == null) rebuildGUI = true; else rebuildGUI |= newCharRanges.Length != charRanges.Array.GetLength(0); } if (rebuildGUI) BuildGUI(); fontSizes.Refresh(); charRanges.Refresh(); renderModeField.Value = (ulong)newImportOptions.RenderMode; boldField.Value = newImportOptions.Bold; italicField.Value = newImportOptions.Italic; dpiField.Value = newImportOptions.DPI; importOptions = newImportOptions; return InspectableState.NotModified; } /// /// Recreates all the GUI elements used by this inspector. /// private void BuildGUI() { Layout.Clear(); fontSizes = GUIArrayField.Create( new LocEdString("Font sizes"), importOptions.FontSizes, Layout); fontSizes.OnChanged += x => importOptions.FontSizes = x; fontSizes.IsExpanded = Persistent.GetBool("fontSizes_Expanded"); fontSizes.OnExpand += x => Persistent.SetBool("fontSizes_Expanded", x); charRanges = GUIArrayField.Create( new LocEdString("Character ranges"), importOptions.CharRanges, Layout); charRanges.OnChanged += x => importOptions.CharRanges = x; charRanges.IsExpanded = Persistent.GetBool("charRanges_Expanded"); charRanges.OnExpand += x => Persistent.SetBool("charRanges_Expanded", x); renderModeField = new GUIEnumField(typeof(FontRenderMode), new LocEdString("Render mode")); renderModeField.OnSelectionChanged += x => importOptions.RenderMode = (FontRenderMode)x; boldField = new GUIToggleField(new LocEdString("Bold")); boldField.OnChanged += x => importOptions.Bold = x; italicField = new GUIToggleField(new LocEdString("Italic")); italicField.OnChanged += x => importOptions.Italic = x; dpiField = new GUIIntField(new LocEdString("DPI")); dpiField.OnChanged += x => importOptions.DPI = x; reimportButton = new GUIButton(new LocEdString("Reimport")); reimportButton.OnClick += TriggerReimport; Layout.AddElement(renderModeField); Layout.AddElement(boldField); Layout.AddElement(italicField); Layout.AddElement(dpiField); Layout.AddSpace(10); GUILayout reimportButtonLayout = Layout.AddLayoutX(); reimportButtonLayout.AddFlexibleSpace(); reimportButtonLayout.AddElement(reimportButton); } /// /// Retrieves import options for the texture we're currently inspecting. /// /// Font import options object. private FontImportOptions GetImportOptions() { FontImportOptions output = null; LibraryEntry texEntry = ProjectLibrary.GetEntry(InspectedResourcePath); if (texEntry != null && texEntry.Type == LibraryEntryType.File) { FileEntry texFileEntry = (FileEntry)texEntry; output = texFileEntry.Options as FontImportOptions; } if (output == null) { if (importOptions == null) output = new FontImportOptions(); else output = importOptions; } return output; } /// /// Reimports the texture resource according to the currently set import options. /// private void TriggerReimport() { Texture texture = (Texture)InspectedObject; string resourcePath = ProjectLibrary.GetPath(texture); ProjectLibrary.Reimport(resourcePath, importOptions, true); } /// /// Row element used for displaying GUI for font size array elements. /// internal class FontSizeArrayRow : GUIListFieldRow { private GUIIntField sizeField; /// protected override GUILayoutX CreateGUI(GUILayoutY layout) { GUILayoutX titleLayout = layout.AddLayoutX(); sizeField = new GUIIntField(new LocEdString(SeqIndex + ". ")); titleLayout.AddElement(sizeField); sizeField.OnChanged += x => { SetValue(x); MarkAsModified(); }; sizeField.OnFocusLost += ConfirmModify; sizeField.OnConfirmed += ConfirmModify; return titleLayout; } /// protected internal override InspectableState Refresh() { sizeField.Value = GetValue(); return base.Refresh(); } } /// /// Row element used for displaying GUI for character range array elements. /// internal class CharRangeArrayRow : GUIListFieldRow { private GUIIntField rangeStartField; private GUIIntField rangeEndField; /// protected override GUILayoutX CreateGUI(GUILayoutY layout) { GUILayoutX titleLayout = layout.AddLayoutX(); rangeStartField = new GUIIntField(new LocEdString(SeqIndex + ". Start")); rangeEndField = new GUIIntField(new LocEdString("End")); titleLayout.AddElement(rangeStartField); titleLayout.AddElement(rangeEndField); rangeStartField.OnChanged += x => { CharRange range = GetValue(); range.start = x; SetValue(range); MarkAsModified(); }; rangeEndField.OnChanged += x => { CharRange range = GetValue(); range.end = x; SetValue(range); MarkAsModified(); }; rangeStartField.OnFocusLost += ConfirmModify; rangeStartField.OnConfirmed += ConfirmModify; rangeEndField.OnFocusLost += ConfirmModify; rangeEndField.OnConfirmed += ConfirmModify; return titleLayout; } /// protected internal override InspectableState Refresh() { CharRange newValue = GetValue(); rangeStartField.Value = newValue.start; rangeEndField.Value = newValue.end; return base.Refresh(); } } } /** @} */ }