From d2ab30e7a69bfe7efda63ae75812207377917bd3 Mon Sep 17 00:00:00 2001 From: miepzerino <o.skotnik@gmail.com> Date: Sun, 30 Mar 2025 18:50:27 +0000 Subject: [PATCH] Merge branch 'Flexalon-UI-Layouts' into develop --- Assets/Flexalon/Editor/Windows/FlexalonGUI.cs | 393 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 393 insertions(+), 0 deletions(-) diff --git a/Assets/Flexalon/Editor/Windows/FlexalonGUI.cs b/Assets/Flexalon/Editor/Windows/FlexalonGUI.cs new file mode 100644 index 0000000..b4987bf --- /dev/null +++ b/Assets/Flexalon/Editor/Windows/FlexalonGUI.cs @@ -0,0 +1,393 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace Flexalon.Editor +{ + internal static class FlexalonGUI + { + private static Dictionary<string, List<Texture2D>> _bgTextures = new Dictionary<string, List<Texture2D>>(); + + internal static void Vertical(Action action) + { + EditorGUILayout.BeginVertical(); + action(); + EditorGUILayout.EndVertical(); + } + + internal static void Vertical(float width, Action action) + { + EditorGUILayout.BeginVertical(GUILayout.Width(width)); + action(); + EditorGUILayout.EndVertical(); + } + + internal static void Vertical(GUIStyle style, Action action) + { + EditorGUILayout.BeginVertical(style, GUILayout.ExpandWidth(false)); + action(); + EditorGUILayout.EndVertical(); + } + + internal static void Vertical(GUIStyle style, float width, Action action) + { + EditorGUILayout.BeginVertical(style, GUILayout.Width(width)); + action(); + EditorGUILayout.EndVertical(); + } + + internal static void VerticalExpanded(GUIStyle style, Action action) + { + EditorGUILayout.BeginVertical(style, GUILayout.ExpandHeight(true)); + action(); + EditorGUILayout.EndVertical(); + } + + internal static void Horizontal(Action action) + { + EditorGUILayout.BeginHorizontal(); + action(); + EditorGUILayout.EndHorizontal(); + } + + internal static void Horizontal(GUIStyle style, Action action) + { + EditorGUILayout.BeginHorizontal(style); + action(); + EditorGUILayout.EndHorizontal(); + } + + internal static void HorizontalExpanded(Action action) + { + EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true)); + action(); + EditorGUILayout.EndHorizontal(); + } + + internal static void HorizontalCentered(Action action) + { + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + action(); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + } + + internal static void HorizontalCentered(GUIStyle style, Action action) + { + EditorGUILayout.BeginHorizontal(style); + GUILayout.FlexibleSpace(); + action(); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + } + + internal static Vector2 Scroll(Vector2 scrollPosition, Action action) + { + scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, GUILayout.ExpandWidth(true)); + action(); + EditorGUILayout.EndScrollView(); + return scrollPosition; + } + + internal static Vector2 Scroll(Vector2 scrollPosition, float height, Action action) + { + scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, GUILayout.Height(height), GUILayout.ExpandWidth(true)); + action(); + EditorGUILayout.EndScrollView(); + return scrollPosition; + } + + internal static Vector2 Scroll(Vector2 scrollPosition, GUIStyle style, Action action) + { + scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, style, GUILayout.ExpandWidth(true)); + action(); + EditorGUILayout.EndScrollView(); + return scrollPosition; + } + + internal static void DisableGroup(bool disable, Action action) + { + EditorGUI.BeginDisabledGroup(disable); + action(); + EditorGUI.EndDisabledGroup(); + } + + private static Dictionary<string, Texture2D> _textures = new Dictionary<string, Texture2D>(); + + internal static bool ImageButton(string guid, int width, int height) + { + if (!_textures.TryGetValue(guid, out var texture)) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + texture = AssetDatabase.LoadAssetAtPath<Texture2D>(path); + _textures[guid] = texture; + } + + return GUILayout.Button(texture, GUILayout.Width(width), GUILayout.Height(height)); + } + + public static void Image(string guid, int width, int height) + { + if (!_textures.TryGetValue(guid, out var texture)) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + texture = AssetDatabase.LoadAssetAtPath<Texture2D>(path); + _textures[guid] = texture; + } + + GUILayout.Label(texture, GUILayout.Width(width), GUILayout.Height(height)); + } + + public static bool Checkbox(bool value, Action action) + { + Horizontal(() => + { + GUILayout.Space(10); + value = EditorGUILayout.Toggle(value, GUILayout.Width(20)); + action(); + }); + + return value; + } + + public static bool Checkbox(bool value, string label, GUIStyle labelStyle) + { + return Checkbox(value, () => GUILayout.Label(label, labelStyle)); + } + + public static bool Button(string label, GUIStyle style, int width, int height) + { + var labelContent = new GUIContent(label); + var position = GUILayoutUtility.GetRect(width, height, style); + EditorGUIUtility.AddCursorRect(position, MouseCursor.Link); + return GUI.Button(position, labelContent, style); + } + + public static Rect GetLinkRect(GUIContent labelContent, GUIStyle style, Vector2 position) + { + var size = style.CalcSize(labelContent); + return new Rect(position.x - size.x * 0.5f, position.y - size.y * 0.5f, size.x, size.y); + } + + public static bool Link(string label, GUIStyle style, float lineThickness = 0.5f) + { + var labelContent = new GUIContent(label); + var rect = GUILayoutUtility.GetRect(labelContent, style, GUILayout.ExpandWidth(false)); + return Link(labelContent, style, rect, lineThickness); + } + + public static bool Link(GUIContent labelContent, GUIStyle style, Rect rect, float lineThickness = 0.5f) + { + // Draw a box for the underline + var lineRect = new Rect(rect.xMin, rect.yMax - lineThickness / 2, rect.width, lineThickness); + EditorGUI.DrawRect(lineRect, style.normal.textColor); + EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link); + return GUI.Button(rect, labelContent, style); + } + + public static void HorizontalLine() + { + HorizontalLine(Color.white); + } + + public static void HorizontalLine(Color color, float thickness = 0.5f) + { + var position = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.ExpandWidth(true)); + HorizontalLine(position.xMin, position.xMax, position.y, color, thickness); + } + + public static void HorizontalLine(float startX, float endX, float y) + { + HorizontalLine(startX, endX, y, Color.white); + } + + public static void HorizontalLine(float startX, float endX, float y, Color color, float thickness = 0.5f) + { + EditorGUI.DrawRect(new Rect(startX, y - thickness / 2, endX - startX, thickness), color); + } + + public static void VerticalLine() + { + VerticalLine(Color.white); + } + + public static void VerticalLine(Color color, float thickness = 0.5f) + { + var position = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.ExpandHeight(true)); + VerticalLine(position.x, position.yMin, position.yMax, color, thickness); + } + + public static void VerticalLine(float x, float startY, float endY) + { + VerticalLine(x, startY, endY, Color.white); + } + + public static void VerticalLine(float x, float startY, float endY, Color color, float thickness = 0.5f) + { + EditorGUI.DrawRect(new Rect(x - thickness / 2, startY, thickness, endY - startY), color); + } + + public static int StyleFontSize; + public static string StyleTag; + public static Font StyleFont = null; + + public static GUIStyle CreateStyle() + { + var style = new GUIStyle(); + style.wordWrap = true; + style.richText = true; + style.fontSize = StyleFontSize; + style.font = StyleFont; + return style; + } + + public static GUIStyle CreateStyle(string textColor) + { + return CreateStyle(HexColor(textColor)); + } + + public static GUIStyle CreateStyle(Color textColor) + { + var style = CreateStyle(); + SetTextColor(style, textColor); + return style; + } + + public static GUIStyle CreateStyle(string textColor, string backgroundColor) + { + return CreateStyle(HexColor(textColor), HexColor(backgroundColor)); + } + + public static GUIStyle CreateStyle(Color textColor, Color backgroundColor) + { + var style = CreateStyle(textColor); + SetBackgroundColor(style, backgroundColor); + return style; + } + + public static void SetBackgroundColor(GUIStyle style, Color color) + { + var bgTex = new Texture2D(1, 1); + bgTex.SetPixel(0, 0, color); + bgTex.Apply(); + + style.normal.background = + style.active.background = + style.focused.background = + style.hover.background = bgTex; + + bgTex.hideFlags = HideFlags.DontSave; + + if (!_bgTextures.TryGetValue(StyleTag, out var textures)) + { + textures = new List<Texture2D>(); + _bgTextures[StyleTag] = textures; + } + + textures.Add(bgTex); + } + + public static void SetBackgroundImage(GUIStyle style, Texture2D image) + { + style.normal.background = + style.active.background = + style.focused.background = + style.hover.background = image; + } + + public static void CleanupBackgroundTextures(string styleTag) + { + if (_bgTextures.TryGetValue(styleTag, out var textures)) + { + foreach (var texture in textures) + { + UnityEngine.Object.DestroyImmediate(texture); + } + + _bgTextures.Remove(styleTag); + } + } + + public static void SetTextColor(GUIStyle style, Color color) + { + style.normal.textColor = + style.active.textColor = + style.focused.textColor = + style.hover.textColor = color; + } + + public static Color Gray(int gray) + { + return new Color(gray / 255f, gray / 255f, gray / 255f); + } + + public static Color HexColor(string hex) + { + ColorUtility.TryParseHtmlString(hex, out var color); + return color; + } + + public static bool HelpBoxLinkButton(string message, MessageType type) + { + Texture icon = null; + + switch (type) + { + case MessageType.Info: + icon = EditorGUIUtility.IconContent("console.infoicon").image; + break; + case MessageType.Warning: + icon = EditorGUIUtility.IconContent("console.warnicon").image; + break; + case MessageType.Error: + icon = EditorGUIUtility.IconContent("console.erroricon").image; + break; + } + + var style = new GUIStyle(EditorStyles.helpBox) + { + richText = true, + fontSize = EditorStyles.helpBox.fontSize + }; + EditorGUILayout.LabelField(GUIContent.none, new GUIContent(message, icon), style); + var position = GUILayoutUtility.GetLastRect(); + EditorGUIUtility.AddCursorRect(position, MouseCursor.Link); + return GUI.Button(position, GUIContent.none, EditorStyles.linkLabel); + } + + public static void Box(int width, int height, Color backgroundColor, Color borderColor, int borderThickness) + { + var rect = GUILayoutUtility.GetRect(width, height); + Rect outer = new Rect(rect); + Rect inner = new Rect(rect.x + borderThickness, + rect.y + borderThickness, + rect.width - borderThickness * 2, + rect.height - borderThickness * 2); + + EditorGUI.DrawRect(outer, borderColor); + EditorGUI.DrawRect(inner, backgroundColor); + } + + public static Rect GetRect(int width, int height) + { + return GUILayoutUtility.GetRect(width, height, GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(false)); + } + + public static bool BoxButton(GUIContent content, Rect rect, GUIStyle style, Color backgroundColor, Color borderColor, int borderThickness) + { + Rect inner = new Rect( + rect.x + borderThickness, + rect.y + borderThickness, + rect.width - borderThickness * 2, + rect.height - borderThickness * 2); + + EditorGUI.DrawRect(rect, borderColor); + EditorGUI.DrawRect(inner, backgroundColor); + + EditorGUIUtility.AddCursorRect(rect, MouseCursor.Link); + return GUI.Button(rect, content, style); + } + } +} \ No newline at end of file -- Gitblit v1.9.3