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.10.0