public void Info(string text, MessageType messageType = MessageType.Info) { GUIStyle style = new GUIStyle(GUI.skin.box); style.alignment = TextAnchor.MiddleCenter; style.wordWrap = true; float height = 0; if (positionRect.width > 20f) { float width = positionRect.width; GUIContent content = new GUIContent(text); height = style.CalcHeight(content, positionRect.width); style.fixedHeight = height; Rect infoRect = new Rect(positionRect.x, positionRect.y, positionRect.width, height); EditorGUI.HelpBox(infoRect, text, messageType); EditorCache.SetCachedValue("height", height, GenerateKey() + text.GetHashCode()); // not the most optimal } else { EditorCache.GetCachedValue("height", ref height, GenerateKey() + text.GetHashCode()); } AdvancePosition(height + NUISettings.FIELD_SPACING); }
public void ReorderableList(string propertyName, string label = null, bool draggable = true, bool showAddRemoveButtons = true, Type baseType = null, float elementSpacing = 0) { SerializedProperty listProperty = FindProperty(propertyName); if (listProperty == null) { Debug.LogError("Property is null."); return; } ReorderableList reorderableList = null; EditorCache.GetCachedValue("ReorderableList", ref reorderableList, GenerateKey(listProperty)); if (reorderableList == null) { reorderableList = new ReorderableList(listProperty.serializedObject, listProperty, draggable, true, true, true); } reorderableList.serializedProperty = listProperty; reorderableList.displayAdd = showAddRemoveButtons; reorderableList.displayRemove = showAddRemoveButtons; string headerLabel = string.IsNullOrEmpty(label) ? listProperty.displayName : label; reorderableList.drawHeaderCallback = rect => { EditorGUI.LabelField(rect, new GUIContent(headerLabel)); }; reorderableList.drawElementCallback = (rect, index, active, focused) => { SerializedProperty p = listProperty.GetArrayElementAtIndex(index); EditorGUI.PropertyField(rect, p, true); }; reorderableList.elementHeightCallback = index => { SerializedProperty p = listProperty.GetArrayElementAtIndex(index); float height = EditorGUI.GetPropertyHeight(p, true); return(height + elementSpacing); }; float listHeight = reorderableList.GetHeight(); Rect listRect = new Rect(positionRect.x, positionRect.y + 3f, positionRect.width, listHeight); reorderableList.DoList(listRect); AdvancePosition(listHeight + NUISettings.FIELD_SPACING); EditorCache.SetCachedValue("ReorderableList", reorderableList, GenerateKey(listProperty)); }
public void EmbeddedObjectEditor(Object obj, Rect rect, float leftMargin = 0) { if (obj == null) { return; } Editor editor = null; string key = GenerateKey(obj); EditorCache.GetCachedValue("NUIEditor", ref editor, key); NUIEditor nuiEditor = editor as NUIEditor; if (nuiEditor == null) { nuiEditor = Editor.CreateEditor(obj) as NUIEditor; if (nuiEditor == null) { Debug.LogError("Failed to create scriptable object editor."); return; } EditorCache.SetCachedValue("NUIEditor", nuiEditor, GenerateKey(obj)); } rect.y += 8; if (nuiEditor != null) { Space(); nuiEditor.drawer.customPositionRect = positionRect; nuiEditor.drawer.parentKey = GenerateKey(); nuiEditor.OnInspectorNUI(); float editorHeight = GetHeight(key); GUILayout.Space( -editorHeight); // Negate space that embedded editor has already added to prevent overly-large final editor AdvancePosition(editorHeight); } else { Debug.LogError("Cannot draw null editor."); } UpdateCachedKey(); }
public Texture2D GetTexture(string resourcesPath) { Texture2D tex = null; EditorCache.GetCachedValue("Texture2D", ref tex, resourcesPath); if (tex == null) { tex = Resources.Load(resourcesPath) as Texture2D; if (tex == null) { Debug.LogError($"{resourcesPath} not found or not Texture2D."); } else { EditorCache.SetCachedValue("Texture2D", tex, resourcesPath); } } return(tex); }
public void SetHeight(string key, float height) { EditorCache.SetCachedValue("height", height, key); }
public int HorizontalToolbar(string name, string[] texts, bool fillWidth = true, bool singleLine = false, float targetButtonWidth = 80f, float buttonHeight = 18f) { float toolbarHeight = 0; int tabIndex = GetTabIndex(name); if (positionRect.width > 20f) { Rect initRect = positionRect; float rowHeight = buttonHeight; int buttonCount = texts.Length; float rowWidth = positionRect.width; float singleLineWidth = buttonCount * targetButtonWidth; int rowCount = singleLine ? 1 : rowWidth > 10 ? Mathf.CeilToInt(singleLineWidth / rowWidth) : 1; int maxButtonsPerRow = Mathf.FloorToInt(rowWidth / targetButtonWidth); int lastRowButtons = buttonCount - maxButtonsPerRow * (rowCount - 1); toolbarHeight = rowCount * rowHeight; Rect bottomLine = new Rect(initRect.x, initRect.y + toolbarHeight, initRect.width, 1f); EditorGUI.DrawRect(bottomLine, new Color(0.4f, 0.4f, 0.5f, 1f)); string[][] subTexts = new string[rowCount][]; int offset = 0; for (int i = 0; i < rowCount; i++) { if (i == rowCount - 1) { subTexts[i] = new string[lastRowButtons]; for (int j = 0; j < lastRowButtons; j++) { subTexts[i][j] = texts[offset++]; } } else { subTexts[i] = new string[maxButtonsPerRow]; for (int j = 0; j < maxButtonsPerRow; j++) { subTexts[i][j] = texts[offset++]; } } } int counter = 0; for (int x = 0; x < rowCount; x++) { float buttonWidth = fillWidth ? x == rowCount - 1 ? rowWidth / lastRowButtons : rowWidth / maxButtonsPerRow : targetButtonWidth; for (int y = 0; y < subTexts[x].Length; y++) { GUIStyle buttonStyle = new GUIStyle(EditorStyles.miniButtonMid); buttonStyle.fixedHeight = buttonHeight; Color initColor = GUI.color; Rect buttonRect = new Rect(initRect.x + y * buttonWidth, initRect.y, buttonWidth, rowHeight + 1); if (tabIndex == counter) { GUI.color = new Color(1f, 1f, 1f, 1f); } else { GUI.color = new Color(0.9f, 0.9f, 0.9f, 1f); } if (GUI.Button(buttonRect, subTexts[x][y], buttonStyle)) { tabIndex = counter; } if (tabIndex == counter) { Rect highlightRect = new Rect(buttonRect.x, buttonRect.y + buttonRect.height - 3, buttonRect.width, 3); EditorGUI.DrawRect(highlightRect, NUISettings.lightBlueColor); } GUI.color = initColor; counter++; } initRect.y += rowHeight; } SetTabIndex(name, tabIndex); EditorCache.SetCachedValue("height", toolbarHeight, GenerateKey() + name); } else { EditorCache.GetCachedValue("height", ref toolbarHeight, GenerateKey() + name); } AdvancePosition(toolbarHeight + 2); return(tabIndex); }
public int HorizontalToolbar(string name, string[] textureResourcePaths, float toolbarHeight) { int tabIndex = GetTabIndex(name); int n = textureResourcePaths.Length; if (n == 0) { return(-1); } if (positionRect.width > 20f) { Rect initRect = positionRect; float rowWidth = positionRect.width; Rect bottomLine = new Rect(initRect.x, initRect.y + toolbarHeight, initRect.width, 1f); EditorGUI.DrawRect(bottomLine, new Color(0.4f, 0.4f, 0.5f, 1f)); int counter = 0; float buttonWidth = rowWidth / n; Texture2D[] icons = new Texture2D[n]; for (int i = 0; i < n; i++) { icons[i] = GetTexture(textureResourcePaths[i]); } for (int i = 0; i < n; i++) { GUIStyle buttonStyle = new GUIStyle(EditorStyles.miniButtonMid); buttonStyle.fixedHeight = toolbarHeight; Color initColor = GUI.color; Rect buttonRect = new Rect(initRect.x + i * buttonWidth, initRect.y, buttonWidth, toolbarHeight); if (tabIndex == counter) { GUI.color = new Color(1f, 1f, 1f, 1f); } else { GUI.color = new Color(0.9f, 0.9f, 0.9f, 1f); } if (GUI.Button(buttonRect, icons[i], buttonStyle)) { tabIndex = counter; } if (tabIndex == counter) { Rect highlightRect = new Rect(buttonRect.x, buttonRect.y + buttonRect.height - 3, buttonRect.width, 3); EditorGUI.DrawRect(highlightRect, NUISettings.lightBlueColor); } GUI.color = initColor; counter++; } SetTabIndex(name, tabIndex); EditorCache.SetCachedValue("height", toolbarHeight, GenerateKey() + name); } else { EditorCache.GetCachedValue("height", ref toolbarHeight, GenerateKey() + name); } AdvancePosition(toolbarHeight + 2); return(tabIndex); }