private void DrawOptionData(Rect rect, int index, bool isActive, bool isFocused) { SerializedProperty itemData = m_ReorderableList.serializedProperty.GetArrayElementAtIndex(index); SerializedProperty itemText = itemData.FindPropertyRelative("m_Text"); SerializedProperty itemSprite = itemData.FindPropertyRelative("m_ImageData.m_Sprite"); SerializedProperty itemCode = itemData.FindPropertyRelative("m_ImageData.m_VectorImageData.m_Glyph.m_Unicode"); SerializedProperty itemName = itemData.FindPropertyRelative("m_ImageData.m_VectorImageData.m_Glyph.m_Name"); GUIStyle iconStyle = new GUIStyle { font = (Font)itemData.FindPropertyRelative("m_ImageData.m_VectorImageData.m_Font").objectReferenceValue }; SerializedProperty itemImageType = itemData.FindPropertyRelative("m_ImageData.m_ImageDataType"); RectOffset offset = new RectOffset(0, 0, -1, -3); rect = offset.Add(rect); rect.height = EditorGUIUtility.singleLineHeight; float offsetH = 0; EditorGUI.LabelField(new Rect(rect.x, rect.y, 16, rect.height), index.ToString()); offsetH += 16; EditorGUI.LabelField(new Rect(rect.x + offsetH, rect.y, 35, rect.height), "Text", EditorStyles.boldLabel); offsetH += 35; EditorGUI.PropertyField(new Rect(rect.x + offsetH, rect.y, (rect.width / 3) - offsetH, rect.height), itemText, GUIContent.none); offsetH += (rect.width / 3) - offsetH + 8; EditorGUI.LabelField(new Rect(rect.x + offsetH, rect.y, 32, rect.height), "Icon", EditorStyles.boldLabel); offsetH += 32; itemImageType.enumValueIndex = m_ImageType.enumValueIndex; if (m_ImageType.enumValueIndex == 0) { EditorGUI.PropertyField(new Rect(rect.x + offsetH, rect.y, rect.width - offsetH, rect.height), itemSprite, GUIContent.none); } else { if (!string.IsNullOrEmpty(itemName.stringValue)) { EditorGUI.LabelField(new Rect(rect.x + offsetH, rect.y, 16, rect.height), IconDecoder.Decode(itemCode.stringValue), iconStyle); offsetH += 16; EditorGUI.LabelField(new Rect(rect.x + offsetH, rect.y, rect.width - offsetH - 80, rect.height), itemName.stringValue); } else { EditorGUI.LabelField(new Rect(rect.x + offsetH, rect.y, rect.width - offsetH - 80, rect.height), "No icon selected"); } if (GUI.Button(new Rect(rect.width - 60, rect.y, 70, rect.height), "Pick Icon")) { IOptionDataListContainer optionDataListContainer = itemData.serializedObject.targetObject as IOptionDataListContainer; VectorImagePickerWindow.Show(optionDataListContainer.optionDataList.options[index].imageData.vectorImageData, itemData.serializedObject.targetObject); } if (GUI.Button(new Rect(rect.width + 16, rect.y, 18, rect.height), IconDecoder.Decode(@"\ue14c"), new GUIStyle { font = VectorImageManager.GetIconFont(VectorImageManager.materialDesignIconsFontName) })) { IOptionDataListContainer optionDataListContainer = itemData.serializedObject.targetObject as IOptionDataListContainer; VectorImageData data = optionDataListContainer.optionDataList.options[index].imageData.vectorImageData; data.font = null; data.glyph = null; EditorUtility.SetDirty(itemData.serializedObject.targetObject); } } }
/// <summary>Inspector control (eg: EditorGUILayout.SpriteField) for VectorImageData. Supports undo/redo and multiple selected objects.</summary> /// <param name="label">The label to appear in the inspector control.</param> /// <param name="targetDatas">The VectorImageDatas to modify.</param> /// <param name="objectsToUndo">The objects to mark for undo/redo.</param> /// <param name="onIconPickAction">Action to call when an icon is picked.</param> /// <param name="visualReference">The VectorImageData to use for the 'current' values in the control if the VectorImageData values are different.</param> /// <returns>Whether the control was successfully able to be drawn.</returns> public static bool VectorImageDataMultiField(string label, VectorImageData[] targetDatas, Object[] objectsToUndo, Action onIconPickAction = null, VectorImageData visualReference = null) { if (targetDatas.ToList().TrueForAll(data => data == null)) { return(false); } if (visualReference == null) { visualReference = targetDatas.ToList().First(data => data != null); } string code = visualReference.glyph.unicode; string name = visualReference.glyph.name; Font font = visualReference.font; var vectorFont = visualReference.vectorFont; GUIStyle iconStyle = null; s_iconStyles.TryGetValue(visualReference, out iconStyle); if (iconStyle == null) { iconStyle = new GUIStyle { font = font, fontSize = font != null && font.dynamic ? vectorIconSize : 0 }; if (iconStyle.font == null && vectorFont != null && vectorFont.fontTMPro != null) { iconStyle.font = AssetDatabase.LoadAssetAtPath <Font>(AssetDatabase.GUIDToAssetPath(vectorFont.fontTMPro.creationSettings.sourceFontFileGUID)); } s_iconStyles[visualReference] = iconStyle; } iconStyle.fontSize = iconStyle.font != null && iconStyle.font.dynamic ? vectorIconSize : 0; using (new GUILayout.HorizontalScope()) { EditorGUILayout.PrefixLabel(label); if (EditorGUI.indentLevel > 0) { // 2 is a good 'base' offset when there are indents EditorGUILayout.LabelField("", GUILayout.MaxWidth(-(2 + vectorImageDataIndentOffsetSize * EditorGUI.indentLevel))); } if (!string.IsNullOrEmpty(name)) { GUIContent iconGUIContent = new GUIContent(IconDecoder.Decode(code), name); if (iconStyle.font != null && !iconStyle.font.dynamic) { CharacterInfo charInfo; iconStyle.font.GetCharacterInfo(iconGUIContent.text[0], out charInfo); var uvRect = Rect.MinMaxRect(charInfo.uvBottomLeft.x, charInfo.uvBottomLeft.y, charInfo.uvTopRight.x, charInfo.uvTopRight.y); EditorGUILayout.LabelField("", GUILayout.Width(vectorIconSize), GUILayout.Height(vectorIconSize)); GUI.DrawTextureWithTexCoords(GUILayoutUtility.GetLastRect(), iconStyle.font.material.mainTexture, uvRect); } else { EditorGUILayout.LabelField(iconGUIContent, iconStyle, GUILayout.MaxWidth(iconStyle.CalcSize(iconGUIContent).x)); } if (EditorGUI.indentLevel > 0) { EditorGUILayout.LabelField("", GUILayout.MaxWidth(vectorImageDataIndentOffsetSize * EditorGUI.indentLevel)); } } else { EditorGUILayout.LabelField("No icon selected", GUILayout.MaxWidth(vectorImageDataMaxLabelWidth)); GUILayout.FlexibleSpace(); } if (GUILayout.Button("Pick Icon", EditorStyles.miniButton, GUILayout.MinHeight(miniButtonHeight))) { VectorImagePickerWindow.Show(targetDatas, objectsToUndo, onIconPickAction); } if (visualReference != null && visualReference.ContainsData() && GUILayout.Button(IconDecoder.Decode(@"\ue14c"), new GUIStyle { fontSize = iconStyle.fontSize, font = VectorImageManager.GetIconFont(VectorImageManager.materialDesignIconsFontName) }, GUILayout.MaxWidth(20))) { if (objectsToUndo != null) { Undo.RecordObjects(objectsToUndo, "Set Icon"); } foreach (var imageData in targetDatas) { imageData.glyph = null; imageData.vectorFont = null; } } } return(true); }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { GetProperties(property); Rect pos = position; pos.height = EditorGUI.GetPropertyHeight(m_ImageDataType); float labelWidth = GUI.skin.GetStyle("Label").CalcSize(label).x; float i = EditorGUI.PrefixLabel(new Rect(pos.x, pos.y, labelWidth, pos.height), label).width; pos.x -= i - 54; pos.width += i - 55; if (property.name.Equals("m_ToggleOnIcon") || property.name.Equals("m_ToggleOffIcon")) { pos.x += 33; pos.width -= 33; } else if (property.name.Equals("m_TabIcon")) { pos.x -= 3; pos.width += 3; } if (m_ImageDataType.enumValueIndex == 0) { pos.height = EditorGUI.GetPropertyHeight(m_Sprite); EditorGUI.PropertyField(pos, m_Sprite, GUIContent.none); } if (m_ImageDataType.enumValueIndex == 1) { pos.height = EditorGUI.GetPropertyHeight(m_VectorImageData); SerializedProperty code = m_VectorImageData.FindPropertyRelative("m_Glyph.m_Unicode"); SerializedProperty name = m_VectorImageData.FindPropertyRelative("m_Glyph.m_Name"); SerializedProperty font = m_VectorImageData.FindPropertyRelative("m_Font"); GUIStyle iconStyle = new GUIStyle { font = (Font)font.objectReferenceValue }; float pickButtonWidth = 70; float pickButtonPadding = 88; float clearButtonWidth = 18; float clearButtonPadding = 14; if (!string.IsNullOrEmpty(name.stringValue)) { EditorGUI.LabelField(new Rect(pos.x, pos.y, 16, pos.height), IconDecoder.Decode(code.stringValue), iconStyle); pos.x += 16; pos.width -= 16; EditorGUI.LabelField(new Rect(pos.x, pos.y, pos.width, position.height), name.stringValue); } else { EditorGUI.LabelField( new Rect(pos.x, pos.y, pos.width - (pickButtonWidth + clearButtonWidth), pos.height), "No icon selected"); } if (GUI.Button(new Rect((pos.x + pos.width) - pickButtonPadding, pos.y, pickButtonWidth, pos.height), "Pick Icon")) { VectorImagePickerWindow.Show( ((ImageData)fieldInfo.GetValue(m_VectorImageData.serializedObject.targetObject)) .vectorImageData, property.serializedObject.targetObject); } if (GUI.Button(new Rect((pos.x + pos.width - 1) - clearButtonPadding, pos.y, clearButtonWidth, pos.height), IconDecoder.Decode(@"\ue14c"), new GUIStyle { font = VectorImageManager.GetIconFont(VectorImageManager.materialDesignIconsFontName) })) { VectorImageData data = (((ImageData)fieldInfo.GetValue(m_VectorImageData.serializedObject.targetObject)) .vectorImageData); data.font = null; data.glyph = null; EditorUtility.SetDirty(property.serializedObject.targetObject); } } }
public static bool VectorImageDataField(string label, VectorImageData targetData, Object objectToUndo, Action onIconPickAction = null, bool disableIfMultipleObjectsSelected = true) { if (targetData == null) { return(false); } using (new DisabledScope(TooManySelected(!disableIfMultipleObjectsSelected))) { string code = targetData.glyph.unicode; string name = targetData.glyph.name; Font font = targetData.font; var vectorFont = targetData.vectorFont; GUIStyle iconStyle = null; s_iconStyles.TryGetValue(targetData, out iconStyle); if (iconStyle == null) { iconStyle = new GUIStyle { font = font, fontSize = font != null && font.dynamic ? vectorIconSize : 0 }; if (iconStyle.font == null && vectorFont != null && vectorFont.fontTMPro != null) { iconStyle.font = AssetDatabase.LoadAssetAtPath <Font>(AssetDatabase.GUIDToAssetPath(vectorFont.fontTMPro.creationSettings.sourceFontFileGUID)); } s_iconStyles[targetData] = iconStyle; } iconStyle.fontSize = iconStyle.font != null && iconStyle.font.dynamic ? vectorIconSize : 0; using (new GUILayout.HorizontalScope()) { EditorGUILayout.PrefixLabel(label); if (EditorGUI.indentLevel > 0) { // 2 is a good 'base' offset when there are indents EditorGUILayout.LabelField("", GUILayout.MaxWidth(-(2 + vectorImageDataIndentOffsetSize * EditorGUI.indentLevel))); } if (!string.IsNullOrEmpty(name)) { GUIContent iconGUIContent = new GUIContent(IconDecoder.Decode(code), name); if (iconStyle.font != null && !iconStyle.font.dynamic) { CharacterInfo charInfo; iconStyle.font.GetCharacterInfo(iconGUIContent.text[0], out charInfo); var uvRect = Rect.MinMaxRect(charInfo.uvBottomLeft.x, charInfo.uvBottomLeft.y, charInfo.uvTopRight.x, charInfo.uvTopRight.y); EditorGUILayout.LabelField("", GUILayout.Width(vectorIconSize), GUILayout.Height(vectorIconSize)); GUI.DrawTextureWithTexCoords(GUILayoutUtility.GetLastRect(), iconStyle.font.material.mainTexture, uvRect); } else { EditorGUILayout.LabelField(iconGUIContent, iconStyle, GUILayout.MaxWidth(iconStyle.CalcSize(iconGUIContent).x)); } if (EditorGUI.indentLevel > 0) { EditorGUILayout.LabelField("", GUILayout.MaxWidth(vectorImageDataIndentOffsetSize * EditorGUI.indentLevel)); } } else { EditorGUILayout.LabelField("No icon selected", GUILayout.MaxWidth(vectorImageDataMaxLabelWidth)); } if (GUILayout.Button("Pick Icon", EditorStyles.miniButton, GUILayout.MinHeight(miniButtonHeight))) { VectorImagePickerWindow.Show(targetData, objectToUndo, onIconPickAction); } } } return(true); }
private void DrawIconList() { if (m_GlyphArray.Length == 0) { var guiStyle = new GUIStyle(); guiStyle.fontStyle = FontStyle.Bold; guiStyle.alignment = TextAnchor.MiddleCenter; EditorGUILayout.LabelField("No icon found for your search term: " + m_SearchText, guiStyle, GUILayout.Height(Screen.height - 80f)); return; } var padded = m_PreviewSize + 5f; var columns = Mathf.FloorToInt((Screen.width - 25f) / padded); if (columns < 1) { columns = 1; } var offset = 0; var rect = new Rect(0f, 0, m_PreviewSize, m_PreviewSize); GUILayout.Space(5f); using (var scrollViewScope = new GUILayout.ScrollViewScope(m_IconViewScrollPosition, GUILayout.Height(Screen.height - 80f))) { m_IconViewScrollPosition = scrollViewScope.scrollPosition; while (offset < m_GlyphArray.Length) { using (new GUILayout.HorizontalScope()) { var col = 0; rect.x = 0f; for (; offset < m_GlyphArray.Length; ++offset) { // Change color of the selected VectorImage if (m_VectorImageDatas[0].glyph.name == m_GlyphArray[offset].name) { GUI.backgroundColor = MaterialColor.iconDark; } if (GUI.Button(rect, new GUIContent("", m_GlyphArray[offset].name))) { if (Event.current.button == 0) { SetGlyph(offset); if (Time.realtimeSinceStartup - m_LastClickTime < 0.3f) { Close(); } m_LastClickTime = Time.realtimeSinceStartup; } } if (Event.current.type == EventType.Repaint) { drawTiledTexture(rect); m_GuiStyle.fontSize = m_PreviewSize; var iconText = IconDecoder.Decode(@"\u" + m_GlyphArray[offset].unicode); var size = m_GuiStyle.CalcSize(new GUIContent(iconText)); var maxSide = size.x > size.y ? size.x : size.y; var scaleFactor = m_PreviewSize / maxSide * 0.9f; m_GuiStyle.fontSize = Mathf.RoundToInt(m_PreviewSize * scaleFactor); size *= scaleFactor; var padding = new Vector2(rect.width - size.x, rect.height - size.y); var iconRect = new Rect(rect.x + padding.x / 2f, rect.y + padding.y / 2f, rect.width - padding.x, rect.height - padding.y); GUI.Label(iconRect, new GUIContent(iconText), m_GuiStyle); } GUI.backgroundColor = Color.white; if (++col >= columns) { ++offset; break; } rect.x += padded; } } GUILayout.Space(padded); rect.y += padded; } } }
private void UpdateFontAndText() { font = vectorImageData != null ? vectorImageData.font : null; text = vectorImageData != null?IconDecoder.Decode(vectorImageData.glyph.unicode) : string.Empty; }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { SerializedProperty code = property.FindPropertyRelative("m_Glyph.m_Unicode"); SerializedProperty name = property.FindPropertyRelative("m_Glyph.m_Name"); SerializedProperty font = property.FindPropertyRelative("m_Font"); var vectorFont = font.objectReferenceValue as VectorImageFont; if (iconStyle == null) { iconStyle = new GUIStyle { font = vectorFont != null ? vectorFont.font : font.objectReferenceValue as Font }; if (iconStyle.font == null && vectorFont != null && vectorFont.fontTMPro != null) { iconStyle.font = AssetDatabase.LoadAssetAtPath <Font>(AssetDatabase.GUIDToAssetPath(vectorFont.fontTMPro.creationSettings.sourceFontFileGUID)); } } if (iconStyle.font != null && iconStyle.font.dynamic) { iconStyle.fontSize = 16; } RectOffset offset = new RectOffset(0, 0, -1, -3); position = offset.Add(position); position.height = EditorGUIUtility.singleLineHeight; float offsetH = 0; offsetH -= EditorGUI.PrefixLabel(new Rect(position.x + offsetH, position.y, 40, position.height), label).width; offsetH += 40; if (!string.IsNullOrEmpty(name.stringValue)) { GUIContent iconLabel = new GUIContent(IconDecoder.Decode(code.stringValue)); if (iconStyle.font != null && !iconStyle.font.dynamic) { CharacterInfo charInfo; iconStyle.font.GetCharacterInfo(iconLabel.text[0], out charInfo); var uvRect = Rect.MinMaxRect(charInfo.uvBottomLeft.x, charInfo.uvBottomLeft.y, charInfo.uvTopRight.x, charInfo.uvTopRight.y); GUI.DrawTextureWithTexCoords(new Rect(position.x + offsetH, position.y, 16, position.height), iconStyle.font.material.mainTexture, uvRect); } else { EditorGUI.LabelField(new Rect(position.x + offsetH, position.y, 16, position.height), iconLabel, iconStyle); } float iconWidth = 16; // iconStyle.CalcSize(iconLabel).x; offsetH += iconWidth + 2f; EditorGUI.LabelField(new Rect(position.x + offsetH, position.y, position.width - offsetH - 80, position.height), name.stringValue); } else { EditorGUI.LabelField(new Rect(position.x + offsetH, position.y, position.width - 70 - 56, position.height), "No icon selected"); } if (GUI.Button(new Rect(position.width - 74, position.y, 70, position.height), "Pick Icon")) { var target = GetTargetFromSerializedProperty(property); VectorImagePickerWindow.Show((VectorImageData)fieldInfo.GetValue(target), property.serializedObject.targetObject); } if (GUI.Button(new Rect(position.width - 2, position.y, 18, position.height), IconDecoder.Decode(@"\ue14c"), new GUIStyle { fontSize = 16, font = VectorImageManager.GetIconFont(VectorImageManager.materialDesignIconsFontName) })) { var target = GetTargetFromSerializedProperty(property); VectorImageData data = (VectorImageData)fieldInfo.GetValue(target); data.vectorFont = null; data.glyph = null; EditorUtility.SetDirty(property.serializedObject.targetObject); } }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { SerializedProperty code = property.FindPropertyRelative("m_Glyph.m_Unicode"); SerializedProperty name = property.FindPropertyRelative("m_Glyph.m_Name"); SerializedProperty font = property.FindPropertyRelative("m_Font"); GUIStyle iconStyle = new GUIStyle { font = (Font)font.objectReferenceValue, fontSize = 16 }; RectOffset offset = new RectOffset(0, 0, -1, -3); position = offset.Add(position); position.height = EditorGUIUtility.singleLineHeight; float offsetH = 0; offsetH -= EditorGUI.PrefixLabel(new Rect(position.x + offsetH, position.y, 40, position.height), label).width; offsetH += 40; if (!string.IsNullOrEmpty(name.stringValue)) { GUIContent iconLabel = new GUIContent(IconDecoder.Decode(code.stringValue)); EditorGUI.LabelField(new Rect(position.x + offsetH, position.y, 16, position.height), iconLabel, iconStyle); float iconWidth = iconStyle.CalcSize(iconLabel).x; offsetH += iconWidth + 2f; EditorGUI.LabelField(new Rect(position.x + offsetH, position.y, position.width - offsetH - 80, position.height), name.stringValue); } else { EditorGUI.LabelField(new Rect(position.x + offsetH, position.y, position.width - 70 - 56, position.height), "No icon selected"); } if (GUI.Button(new Rect(position.width - 74, position.y, 70, position.height), "Pick Icon")) { VectorImagePickerWindow.Show((VectorImageData)fieldInfo.GetValue(property.serializedObject.targetObject), property.serializedObject.targetObject); } if (GUI.Button(new Rect(position.width - 2, position.y, 18, position.height), IconDecoder.Decode(@"\ue14c"), new GUIStyle { font = VectorImageManager.GetIconFont(VectorImageManager.materialDesignIconsFontName) })) { VectorImageData data = ((VectorImageData)fieldInfo.GetValue(property.serializedObject.targetObject)); data.font = null; data.glyph = null; EditorUtility.SetDirty(property.serializedObject.targetObject); } }