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/FlexalonMenu.cs | 404 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 404 insertions(+), 0 deletions(-) diff --git a/Assets/Flexalon/Editor/Windows/FlexalonMenu.cs b/Assets/Flexalon/Editor/Windows/FlexalonMenu.cs new file mode 100644 index 0000000..859696b --- /dev/null +++ b/Assets/Flexalon/Editor/Windows/FlexalonMenu.cs @@ -0,0 +1,404 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; + +namespace Flexalon.Editor +{ + [InitializeOnLoad] + internal class FlexalonMenu : EditorWindow + { + private static readonly string _website = "https://www.flexalon.com?utm_source=fxmenu"; + public static readonly string StoreLink = "https://assetstore.unity.com/packages/tools/utilities/flexalon-3d-layouts-230509?aid=1101lqSYn"; + private static readonly string _review = "https://assetstore.unity.com/packages/tools/utilities/flexalon-3d-layouts-230509#reviews"; + private static readonly string _discord = "https://discord.gg/VM9cWJ9rjH"; + private static readonly string _docs = "https://www.flexalon.com/docs?utm_source=fxmenu"; + private static readonly string _templates = "https://www.flexalon.com/templates?utm_source=fxmenu"; + private static readonly string _examples = "https://github.com/afarchy/flexalon-examples"; + // private static readonly string _proxima = "https://www.unityproxima.com?utm_source=pxmenu"; + // private static readonly string _copilot = "https://www.flexalon.com/ai?utm_source=pxmenu"; + private static readonly string _buildalon = "https://www.buildalon.com?utm_source=fxmenu"; + + private static readonly string _showOnStartKey = "FlexalonMenu_ShowOnStart"; + private static readonly string _versionKey = "FlexalonMenu_Version"; + + private GUIStyle _errorStyle; + private GUIStyle _buttonStyle; + private GUIStyle _bodyStyle; + private GUIStyle _versionStyle; + private GUIStyle _boldStyle; + private GUIStyle _semiboldStyle; + private GUIStyle _moreToolsButtonStyle; + private GUIStyle _moreLayoutsStyle; + private GUIStyle _buildalonStyle; + + private static ShowOnStart _showOnStart; + private static readonly string[] _showOnStartOptions = { + "Always", "On Update", "Never" + }; + + private Vector2 _scrollPosition; + + private List<string> _changelog = new List<string>(); + + private bool _haveAllLayouts = false; + + private enum ShowOnStart + { + Always, + OnUpdate, + Never + } + + static FlexalonMenu() + { + EditorApplication.update += OnEditorUpdate; + } + + private static void OnEditorUpdate() + { + EditorApplication.update -= OnEditorUpdate; + Initialize(); + } + + internal static void Initialize() + { + var shownKey = "FlexalonMenuShown"; + bool alreadyShown = SessionState.GetBool(shownKey, false); + SessionState.SetBool(shownKey, true); + + var version = WindowUtil.GetVersion(); + var lastVersion = EditorPrefs.GetString(_versionKey, "0.0.0"); + var newVersion = version.CompareTo(lastVersion) > 0; + if (newVersion) + { + EditorPrefs.SetString(_versionKey, version); + alreadyShown = false; + } + + _showOnStart = (ShowOnStart)EditorPrefs.GetInt(_showOnStartKey, 0); + bool showPref = _showOnStart == ShowOnStart.Always || + (_showOnStart == ShowOnStart.OnUpdate && newVersion); + if (!EditorApplication.isPlayingOrWillChangePlaymode && !alreadyShown && showPref && !Application.isBatchMode) + { + StartScreen(); + } + + if (!EditorApplication.isPlayingOrWillChangePlaymode && FlexalonSurvey.ShouldAsk()) + { + FlexalonSurvey.ShowSurvey(); + } + } + + private void OnDisable() + { + _bodyStyle = null; + FlexalonGUI.CleanupBackgroundTextures(StyleTag); + } + + [MenuItem("Tools/Flexalon/Start Screen")] + public static void StartScreen() + { + FlexalonMenu window = GetWindow<FlexalonMenu>(true, "Flexalon Start Screen", true); + window.minSize = new Vector2(800, 600); + window.maxSize = window.minSize; + window.Show(); + } + + [MenuItem("Tools/Flexalon/Website")] + public static void OpenStore() + { + Application.OpenURL(_website); + } + + [MenuItem("Tools/Flexalon/Write a Review")] + public static void OpenReview() + { + Application.OpenURL(_review); + } + + [MenuItem("Tools/Flexalon/Support (Discord)")] + public static void OpenSupport() + { + Application.OpenURL(_discord); + } + + private const string StyleTag = "FlexalonStartScreenStyles"; + + private void InitStyles() + { + if (_bodyStyle != null) return; + + FlexalonGUI.StyleTag = StyleTag; + FlexalonGUI.StyleFontSize = 14; + + _bodyStyle = new GUIStyle(EditorStyles.label); + _bodyStyle.wordWrap = true; + _bodyStyle.fontSize = 14; + _bodyStyle.margin.left = 10; + _bodyStyle.margin.top = 10; + _bodyStyle.stretchWidth = false; + _bodyStyle.richText = true; + + _buildalonStyle = FlexalonGUI.CreateStyle(FlexalonGUI.HexColor("#FF1E6F")); + _buildalonStyle.fontStyle = FontStyle.Bold; + _buildalonStyle.margin.left = 10; + _buildalonStyle.margin.top = 10; + + _boldStyle = new GUIStyle(_bodyStyle); + _boldStyle.fontStyle = FontStyle.Bold; + _boldStyle.fontSize = 16; + + _semiboldStyle = new GUIStyle(_bodyStyle); + _semiboldStyle.fontStyle = FontStyle.Bold; + + _errorStyle = new GUIStyle(_bodyStyle); + _errorStyle.fontStyle = FontStyle.Bold; + _errorStyle.margin.top = 10; + _errorStyle.normal.textColor = new Color(1, 0.2f, 0); + + _buttonStyle = new GUIStyle(_bodyStyle); + _buttonStyle.fontSize = 14; + _buttonStyle.margin.bottom = 5; + _buttonStyle.padding.top = 5; + _buttonStyle.padding.left = 10; + _buttonStyle.padding.right = 10; + _buttonStyle.padding.bottom = 5; + _buttonStyle.hover.background = Texture2D.grayTexture; + _buttonStyle.hover.textColor = Color.white; + _buttonStyle.active.background = Texture2D.grayTexture; + _buttonStyle.active.textColor = Color.white; + _buttonStyle.focused.background = Texture2D.grayTexture; + _buttonStyle.focused.textColor = Color.white; + _buttonStyle.normal.background = Texture2D.grayTexture; + _buttonStyle.normal.textColor = Color.white; + _buttonStyle.wordWrap = false; + _buttonStyle.stretchWidth = false; + + _versionStyle = new GUIStyle(EditorStyles.label); + _versionStyle.padding.right = 10; + + _moreToolsButtonStyle = new GUIStyle(_buttonStyle); + _moreToolsButtonStyle.normal.background = Texture2D.blackTexture; + _moreToolsButtonStyle.hover.background = Texture2D.blackTexture; + _moreToolsButtonStyle.focused.background = Texture2D.blackTexture; + _moreToolsButtonStyle.active.background = Texture2D.blackTexture; + _moreToolsButtonStyle.padding.left = 0; + _moreToolsButtonStyle.padding.right = 0; + _moreToolsButtonStyle.padding.bottom = 0; + _moreToolsButtonStyle.padding.top = 0; + _moreToolsButtonStyle.margin.bottom = 20; + + _moreLayoutsStyle = new GUIStyle(_buttonStyle); + _moreLayoutsStyle.normal.background = new Texture2D(1, 1); + _moreLayoutsStyle.normal.background.SetPixel(0, 0, new Color(0.18f, 0.47f, 0.63f)); + _moreLayoutsStyle.normal.background.Apply(); + _moreLayoutsStyle.hover.background = _moreLayoutsStyle.normal.background; + _moreLayoutsStyle.focused.background = _moreLayoutsStyle.normal.background; + _moreLayoutsStyle.active.background = _moreLayoutsStyle.normal.background; + _moreLayoutsStyle.normal.textColor = Color.white; + _moreLayoutsStyle.fontStyle = FontStyle.Bold; + + WindowUtil.CenterOnEditor(this); + + ReadChangeLog(); + + _haveAllLayouts = WindowUtil.AllLayoutsInstalled(); + } + + private void LinkButton(string label, string url, GUIStyle style = null, int width = 170) + { + if (style == null) style = _buttonStyle; + var labelContent = new GUIContent(label); + var position = GUILayoutUtility.GetRect(width, 35, style); + EditorGUIUtility.AddCursorRect(position, MouseCursor.Link); + if (GUI.Button(position, labelContent, style)) + { + Application.OpenURL(url); + } + } + + private bool Button(string label, GUIStyle style = null, int width = 170) + { + if (style == null) style = _buttonStyle; + var labelContent = new GUIContent(label); + var position = GUILayoutUtility.GetRect(width, 35, style); + EditorGUIUtility.AddCursorRect(position, MouseCursor.Link); + return GUI.Button(position, labelContent, style); + } + + private void Bullet(string text) + { + var ws = 1 + text.IndexOf('-'); + EditorGUILayout.BeginHorizontal(); + for (int i = 0; i < ws; i++) + { + GUILayout.Space(10); + } + GUILayout.Label("•", _bodyStyle); + + GUILayout.Label(text.Substring(ws + 1), _bodyStyle, GUILayout.ExpandWidth(true)); + + EditorGUILayout.EndHorizontal(); + } + + private void ReadChangeLog() + { + _changelog.Clear(); + var changelogPath = AssetDatabase.GUIDToAssetPath("b711ce346029a6f43969ef8de5691942"); + var changelogAsset = AssetDatabase.LoadAssetAtPath<TextAsset>(changelogPath); + _changelog = changelogAsset.text.Split('\n') + .Select(x => Regex.Replace(x.TrimEnd(), @"`(.*?)`", "<b>$1</b>")) + .Select(x => Regex.Replace(x.TrimEnd(), @"\*\*(.*?)\*\*", "<b>$1</b>")) + .Where(x => !string.IsNullOrEmpty(x)) + .ToList(); + var start = _changelog.FindIndex(l => l.StartsWith("## ")); + var end = _changelog.FindIndex(start + 1, l => l.StartsWith("---")); + _changelog = _changelog.GetRange(start, end - start); + } + + private void WhatsNew() + { + EditorGUILayout.Space(); + EditorGUILayout.Space(); + GUILayout.Label("What's New in Flexalon", _boldStyle); + EditorGUILayout.Space(); + + for (int i = 0; i < _changelog.Count; i++) + { + var line = _changelog[i]; + if (line.StartsWith("###")) + { + EditorGUILayout.Space(); + GUILayout.Label(line.Substring(4), _semiboldStyle); + EditorGUILayout.Space(); + } + else if (line.StartsWith("##")) + { + EditorGUILayout.Space(); + GUILayout.Label(line.Substring(3), _boldStyle, GUILayout.ExpandWidth(true)); + EditorGUILayout.Space(); + } + else + { + Bullet(line); + EditorGUILayout.Space(); + } + } + + EditorGUILayout.Space(); + } + + private void OnGUI() + { + InitStyles(); + + GUILayout.BeginHorizontal("In BigTitle", GUILayout.ExpandWidth(true)) ; + { + FlexalonGUI.Image("d0d1cda04ee3f144abf998efbfdfb8dc", 128, (int)(128 * 0.361f)); + GUILayout.FlexibleSpace(); + GUILayout.Label("Version: " + WindowUtil.GetVersion(), _versionStyle, GUILayout.ExpandHeight(true)); + } + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(GUILayout.ExpandHeight(true)); + { + GUILayout.BeginVertical(); + { + GUILayout.Label("Resources", _boldStyle); + LinkButton("Discord Invite", _discord); + LinkButton("Documentation", _docs); + if (_haveAllLayouts) + { + LinkButton("Templates", _templates); + LinkButton("More Examples", _examples); + } + else + { + LinkButton("Get More Layouts", _website, _moreLayoutsStyle); + } + + LinkButton("Write a Review", _review); + + if (!FlexalonSurvey.Completed) + { + if (Button("Feedback")) + { + FlexalonSurvey.ShowSurvey(); + } + } + + GUILayout.FlexibleSpace(); + GUILayout.Label("More Tools", _boldStyle); + if (FlexalonGUI.ImageButton("2d4f1ef6bb116dd439a01757e51b59de", 165, (int)(165 * 0.525f))) + { + Application.OpenURL(_buildalon); + } + + EditorGUIUtility.AddCursorRect(GUILayoutUtility.GetLastRect(), MouseCursor.Link); + } + GUILayout.EndVertical(); + + EditorGUILayout.Separator(); + + GUILayout.BeginVertical(); + { + _scrollPosition = GUILayout.BeginScrollView(_scrollPosition); + + GUILayout.Label("Thank you for using Flexalon!", _boldStyle); + + EditorGUILayout.Space(); + + GUILayout.Label("You're invited to join the Discord community for support and feedback. Let us know how to make Flexalon better for you!", _bodyStyle); + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + FlexalonGUI.Vertical(EditorStyles.helpBox, () => + { + GUILayout.Label("Unveiling our new tool for Unity developers:", _bodyStyle); + EditorGUILayout.Space(); + if (FlexalonGUI.Link("Buildalon: Automate Unity!", _buildalonStyle)) + { + Application.OpenURL(_buildalon); + } + EditorGUILayout.Space(); + GUILayout.Label("Buildalon is a comprehensive suite of build, test, and deploy automation solutions for Unity developers.", _bodyStyle); + EditorGUILayout.Space(); + }); + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + FlexalonGUI.Vertical(EditorStyles.helpBox, () => + { + GUILayout.Label("If you're enjoying Flexalon, please consider writing a review. It helps a ton!", _bodyStyle); + EditorGUILayout.Space(); + }); + + WhatsNew(); + + EditorGUILayout.EndScrollView(); + } + GUILayout.EndVertical(); + EditorGUILayout.Space(); + } + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal("In BigTitle", GUILayout.ExpandHeight(true)); + { + GUILayout.Label("Tools/Flexalon/Start Screen"); + GUILayout.FlexibleSpace(); + GUILayout.Label("Show On Start: "); + var newShowOnStart = (ShowOnStart)EditorGUILayout.Popup((int)_showOnStart, _showOnStartOptions); + if (_showOnStart != newShowOnStart) + { + _showOnStart = newShowOnStart; + EditorPrefs.SetInt(_showOnStartKey, (int)_showOnStart); + } + } + GUILayout.EndHorizontal(); + } + } +} \ No newline at end of file -- Gitblit v1.9.3