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/FlexalonSurvey.cs |  325 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 325 insertions(+), 0 deletions(-)

diff --git a/Assets/Flexalon/Editor/Windows/FlexalonSurvey.cs b/Assets/Flexalon/Editor/Windows/FlexalonSurvey.cs
new file mode 100644
index 0000000..0f8ac85
--- /dev/null
+++ b/Assets/Flexalon/Editor/Windows/FlexalonSurvey.cs
@@ -0,0 +1,325 @@
+using System;
+using UnityEditor;
+using UnityEngine;
+using UnityEngine.Networking;
+
+namespace Flexalon.Editor
+{
+    internal class FlexalonSurvey : EditorWindow
+    {
+        private struct SurveyData
+        {
+            public string version;
+            public string unityVersion;
+            public string buildTarget;
+            public int xr;
+            public int experience;
+            public string benefits;
+            public string improvements;
+            public string layouts;
+        }
+
+        private enum SurveyState
+        {
+            Ask,
+            DontAsk,
+            Completed
+        }
+
+        private enum XRType
+        {
+            None,
+            XRI,
+            Oculus
+        }
+
+        private static readonly string[] _options = new string[] { "Very Disappointed", "Somewhat Disappointed", "Not Disappointed" };
+        private static readonly Vector2 _initialSize = new Vector2(580, 400);
+        private static readonly Vector2 _expandedSize = new Vector2(580, 520);
+        private static readonly string _stateKey = "FlexalonSurveyState";
+        private static readonly string _dateKey = "FlexalonSurveyDate";
+        private static readonly string _attemptKey = "FlexalonSurveyAttempt";
+        private static readonly TimeSpan _askFrequency = new TimeSpan(3, 0, 0, 0);
+
+        private GUIStyle _bodyStyle;
+        private GUIStyle _boldStyle;
+        private GUIStyle _toggleStyle;
+        private GUIStyle _buttonStyle;
+        private GUIStyle _dontAskButtonStyle;
+        private GUIStyle _textAreaStyle;
+        private SurveyData _surveyData;
+        private Texture _surveyImg;
+
+        public static bool Completed => EditorPrefs.GetInt(_stateKey, 0) == (int)SurveyState.Completed;
+
+        public static void ResetState()
+        {
+            EditorPrefs.SetInt(_stateKey, 0);
+        }
+
+        public static bool ShouldAsk()
+        {
+            if (SessionState.GetBool(_attemptKey, false))
+            {
+                return false;
+            }
+
+            SessionState.SetBool(_attemptKey, true);
+
+            if (EditorPrefs.GetInt(_stateKey, 0) != (int)SurveyState.Ask)
+            {
+                return false;
+            }
+
+            if (!EditorPrefs.HasKey(_dateKey))
+            {
+                EditorPrefs.SetString(_dateKey, DateTime.Now.ToBinary().ToString());
+                return false;
+            }
+
+            var lastAsked = DateTime.FromBinary(Convert.ToInt64(EditorPrefs.GetString(_dateKey, "0")));
+            if (DateTime.Now - lastAsked < _askFrequency)
+            {
+                return false;
+            }
+
+            return true;
+        }
+
+        public static void ShowSurvey()
+        {
+            var window = GetWindow<FlexalonSurvey>(true, "Flexalon Feedback", true);
+            window.Show();
+        }
+
+        private void Init()
+        {
+            if (_surveyData.version != null) return;
+
+            _bodyStyle = new GUIStyle(EditorStyles.label);
+            _bodyStyle.wordWrap = true;
+            _bodyStyle.fontSize = 14;
+            _bodyStyle.margin.left = 10;
+            _bodyStyle.margin.bottom = 10;
+            _bodyStyle.stretchWidth = false;
+            _bodyStyle.alignment = TextAnchor.MiddleCenter;
+
+            _boldStyle = new GUIStyle(_bodyStyle);
+            _boldStyle.fontStyle = FontStyle.Bold;
+
+            _toggleStyle = new GUIStyle(EditorStyles.miniButton);
+            _toggleStyle.margin = new RectOffset(10, 10, 10, 10);
+            _toggleStyle.fixedHeight = 45;
+            _toggleStyle.fixedWidth = 180;
+            _toggleStyle.fontSize = 14;
+            _toggleStyle.alignment = TextAnchor.MiddleCenter;
+
+            _buttonStyle = new GUIStyle(EditorStyles.miniButton);
+            _buttonStyle.margin = new RectOffset(10, 10, 10, 10);
+            _buttonStyle.fixedHeight = 35;
+            _buttonStyle.fixedWidth = 170;
+            _buttonStyle.fontSize = 14;
+            _buttonStyle.alignment = TextAnchor.MiddleCenter;
+
+            _dontAskButtonStyle = new GUIStyle(EditorStyles.miniButton);
+            _dontAskButtonStyle.normal.background = null;
+            _dontAskButtonStyle.margin = new RectOffset(10, 10, 10, 10);
+            _dontAskButtonStyle.fixedWidth = 110;
+
+            _textAreaStyle = new GUIStyle(EditorStyles.textArea);
+            _textAreaStyle.margin.left = 10;
+            _textAreaStyle.margin.right = 10;
+
+            this.titleContent = new GUIContent("Flexalon Feedback");
+
+            this.minSize = this.maxSize = _expandedSize;
+            WindowUtil.CenterOnEditor(this);
+
+            _surveyData = new SurveyData
+            {
+                version = WindowUtil.GetVersion(),
+                unityVersion = Application.unityVersion,
+                buildTarget = EditorUserBuildSettings.activeBuildTarget.ToString(),
+#if FLEXALON_OCULUS
+                xr = (int)XRType.Oculus,
+#elif UNITY_XRI
+                xr = (int)XRType.XRI,
+#else
+                xr = (int)XRType.None,
+#endif
+                experience = -1,
+                benefits = "",
+                improvements = "",
+                layouts = string.Join(",", WindowUtil.GetInstalledLayouts())
+            };
+
+            var surveyImgPath = AssetDatabase.GUIDToAssetPath("0ea942e8eabc7e34c8cfd062416108ac");
+            _surveyImg = AssetDatabase.LoadAssetAtPath<Texture>(surveyImgPath);
+
+            EditorPrefs.SetString(_dateKey, DateTime.Now.ToBinary().ToString());
+        }
+
+        private int ToggleGroup(int selected, string[] options)
+        {
+            int newSelected = selected;
+            EditorGUILayout.BeginHorizontal();
+
+            for (int i = 0; i < options.Length; i++)
+            {
+                var option = options[i];
+                if (GUILayout.Toggle(selected == i, option, _toggleStyle))
+                {
+                    newSelected = i;
+                }
+
+                if (i < options.Length - 1)
+                {
+                    GUILayout.FlexibleSpace();
+                }
+            }
+
+            EditorGUILayout.EndHorizontal();
+            return newSelected;
+        }
+
+        private void BeginCenter()
+        {
+            EditorGUILayout.BeginHorizontal();
+            GUILayout.FlexibleSpace();
+        }
+
+        private void EndCenter()
+        {
+            GUILayout.FlexibleSpace();
+            EditorGUILayout.EndHorizontal();
+        }
+
+        private void CenterLabel(string text, GUIStyle style)
+        {
+            BeginCenter();
+            GUILayout.Label(text, style);
+            EndCenter();
+        }
+
+        private void CenterImage(Texture image, params GUILayoutOption[] options)
+        {
+            BeginCenter();
+            GUILayout.Label(image, options);
+            EndCenter();
+        }
+
+        private void OnGUI()
+        {
+            Init();
+
+            EditorGUILayout.BeginVertical();
+
+                GUILayout.FlexibleSpace();
+
+                BeginCenter();
+                FlexalonGUI.Image("d0d1cda04ee3f144abf998efbfdfb8dc", 128, (int)(128 * 0.361f));
+                EndCenter();
+
+                GUILayout.FlexibleSpace();
+
+                CenterLabel("Please help improve Flexalon by answering 3 quick questions.", _boldStyle);
+
+                if (_surveyData.experience == -1)
+                {
+                    CenterImage(_surveyImg, GUILayout.Width(300), GUILayout.Height(200));
+                }
+
+                CenterLabel("How would you feel if you could no longer use Flexalon 3D Layouts?", _bodyStyle);
+
+                _surveyData.experience = ToggleGroup(_surveyData.experience, _options);
+
+                if (_surveyData.experience == -1)
+                {
+                    this.minSize = this.maxSize = _initialSize;
+
+                    GUILayout.FlexibleSpace();
+                    EditorGUILayout.BeginHorizontal();
+                        GUILayout.FlexibleSpace();
+                        if (GUILayout.Button("Ask me later", _dontAskButtonStyle))
+                        {
+                            Close();
+                        }
+                        if (GUILayout.Button("Don't ask again", _dontAskButtonStyle))
+                        {
+                            EditorPrefs.SetInt(_stateKey, (int)SurveyState.DontAsk);
+                            Close();
+                        }
+                    EditorGUILayout.EndHorizontal();
+                }
+                else if (_surveyData.experience == 0 || _surveyData.experience == 1)
+                {
+                    this.minSize = this.maxSize = _expandedSize;
+
+                    GUILayout.FlexibleSpace();
+
+                    GUILayout.Label("What is the main benefit you get from Flexalon?", _bodyStyle);
+                    _surveyData.benefits = GUILayout.TextArea(_surveyData.benefits, _textAreaStyle, GUILayout.Height(100));
+
+                    GUILayout.FlexibleSpace();
+
+                    GUILayout.Label("How can Flexalon be improved for you?", _bodyStyle);
+                    _surveyData.improvements = GUILayout.TextArea(_surveyData.improvements, _textAreaStyle, GUILayout.Height(100));
+
+                    GUILayout.FlexibleSpace();
+
+                    EditorGUILayout.BeginHorizontal();
+                        GUILayout.FlexibleSpace();
+                        if (GUILayout.Button("Send Feedback", _buttonStyle))
+                        {
+                            SendSurvey();
+                            Close();
+                        }
+                        GUILayout.FlexibleSpace();
+                    EditorGUILayout.EndHorizontal();
+                    GUILayout.FlexibleSpace();
+                }
+                else
+                {
+                    SendSurvey();
+                    Close();
+                }
+
+            EditorGUILayout.EndVertical();
+        }
+
+        private void SendSurvey()
+        {
+#if UNITY_WEB_REQUEST
+            var request = new UnityWebRequest("https://www.flexalon.com/api/survey", UnityWebRequest.kHttpVerbPOST);
+            request.SetRequestHeader("Content-Type", "application/json");
+            request.SetRequestHeader("Accept", "application/json");
+
+            var json = JsonUtility.ToJson(_surveyData);
+            var jsonData = System.Text.Encoding.UTF8.GetBytes(json);
+            request.uploadHandler = new UploadHandlerRaw(jsonData);
+            request.downloadHandler = new DownloadHandlerBuffer();
+
+            request.SendWebRequest().completed += op => {
+                if (request.responseCode == 200)
+                {
+                    Debug.Log("Flexalon feedback sent successfully.");
+                    EditorPrefs.SetInt(_stateKey, (int)SurveyState.Completed);
+                }
+                else if (request.responseCode == 400)
+                {
+                    Debug.LogError("Failed to send Flexalon feedback: " + request.downloadHandler.text);
+                }
+                else
+                {
+                    Debug.LogError("Failed to send Flexalon feedback: " + request.error);
+
+                }
+
+                request.Dispose();
+            };
+#else
+            EditorPrefs.SetInt(_stateKey, (int)SurveyState.Completed);
+#endif
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3