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