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