Skip to content
Snippets Groups Projects
PopupBehavior.cs 5.58 KiB
Newer Older
  • Learn to ignore specific revisions
  • MaZiFAU's avatar
    MaZiFAU committed
    using REST_JSON_API;
    
    using System.Collections;
    using TMPro;
    
    MaZiFAU's avatar
    MaZiFAU committed
    using UnityEngine;
    
    using UnityEngine.UI;
    
    public class PopupBehavior : MonoBehaviour
    {
    
        [SerializeField] GameObject canvas;
        [SerializeField] Button CloseButton;
        [SerializeField] TMP_Text message;
    
    MaZiFAU's avatar
    MaZiFAU committed
        public string MessageText
        {
            get => message.text;
            set => message.text = value;
        }
    
    
        public string ServerErrorMessage = "unknown server error";
        public string NonTotalMessage = "Scroll application not complete";
        public string UnknownErrorMessage = "Unkown error - did you apply all facts?";
        public string InvalidAssignmentMessage = "Invalid Assignment";
    
    
    MaZiFAU's avatar
    MaZiFAU committed
        private string errorMessage;
    
        #region UnityMethods
    
            ActiveScroll.OnMMTServerComunicationError.AddListener(OnShowErrorMessage);
            ActiveScroll.OnScrollDynamicInfoError.AddListener(OnFailedScrollInput);
            ActiveScroll.OnScrollApplicationError.AddListener(OnFailedScrollInput);
            ActiveScroll.OnCancelErrorState.AddListener(HidePopUp);
        }
    
        void OnDisable()
        {
            ActiveScroll.OnMMTServerComunicationError.RemoveListener(OnShowErrorMessage);
            ActiveScroll.OnScrollDynamicInfoError.RemoveListener(OnFailedScrollInput);
            ActiveScroll.OnScrollApplicationError.RemoveListener(OnFailedScrollInput);
            ActiveScroll.OnCancelErrorState.RemoveListener(HidePopUp);
        }
        
        void Awake()
        {
    
            CloseButton.onClick.RemoveAllListeners();
    
    MaZiFAU's avatar
    MaZiFAU committed
            CloseButton.onClick.AddListener(HidePopUp);
    
    MaZiFAU's avatar
    MaZiFAU committed
            HidePopUp();
    
    MaZiFAU's avatar
    MaZiFAU committed
        #endregion UnityMethods
    
    MaZiFAU's avatar
    MaZiFAU committed
        public void ShowTimedPopUp()
    
        {
            canvas.SetActive(true);
    
    MaZiFAU's avatar
    MaZiFAU committed
            StartCoroutine(_BlossomAndDie());
    
    MaZiFAU's avatar
    MaZiFAU committed
    
    
    MaZiFAU's avatar
    MaZiFAU committed
            IEnumerator _BlossomAndDie()
    
    MaZiFAU's avatar
    MaZiFAU committed
                yield return new WaitForSeconds(GlobalBehaviour.HintAnimationDuration);
                HidePopUp();
    
    MaZiFAU's avatar
    MaZiFAU committed
        public void HidePopUp()
            => canvas.SetActive(false);
    
        /// <summary>
        /// this method creates a helpful error message and shows the popup. For it to work properly, the setScroll and setParameterDisplays must have been set.
        /// </summary>
        /// <param name="startfact"></param>
        /// <param name="errorInfo"></param>
    
    MaZiFAU's avatar
    MaZiFAU committed
        public void OnFailedScrollInput(ScrollApplicationCheckingError[] errorInfo)
    
    MaZiFAU's avatar
    MaZiFAU committed
            MessageText = generateHelpfulMessageAndAnimateScrollParam(errorInfo);
            ShowTimedPopUp();
    
        /// <summary>
        /// this method gets an error message as parameter and shows it in a popup.
        /// </summary>
        /// <param name="errorMsg"></param>
        public void OnShowErrorMessage(string errorMsg)
        {
            MessageText = errorMsg;
            ShowTimedPopUp();
        }
    
    MaZiFAU's avatar
    MaZiFAU committed
        private string generateHelpfulMessageAndAnimateScrollParam(ScrollApplicationCheckingError[] errorInfo)
    
    MaZiFAU's avatar
    MaZiFAU committed
            if (errorInfo == null)
    
                return ServerErrorMessage;
    
    MaZiFAU's avatar
    MaZiFAU committed
    
    
            int invAssCount = 0;
            errorMessage = "";
    
    MaZiFAU's avatar
    MaZiFAU committed
            for (int i = 0; i < errorInfo.Length; i++)
    
    MaZiFAU's avatar
    MaZiFAU committed
            {
    
    MaZiFAU's avatar
    MaZiFAU committed
                ScrollApplicationCheckingError error = errorInfo[i];
    
    MaZiFAU's avatar
    MaZiFAU committed
    
    
                //check which error ocurred and set Message to a helpful error message.
    
                if (error.kind == "nonTotal")
                {
                    errorMessage += NonTotalMessage;
                    errorMessage += '\n';
    
    MaZiFAU's avatar
    MaZiFAU committed
                }
                else if (error.kind == "invalidAssignment")
    
                    MMTFact fact = parseFactFromError(error);
    
                    if (ScrollDetails.ParameterDisplays != null && fact != null)
    
                        foreach (RenderedScrollFact scrollfact in ScrollDetails.ParameterDisplays)
    
    MaZiFAU's avatar
    MaZiFAU committed
                            if (scrollfact.ScrollFactURI == fact.@ref.uri)
    
    MaZiFAU's avatar
    MaZiFAU committed
                                scrollfact.HighlightAs(FactWrapper.FactMaterials.Hint);
    
    MaZiFAU's avatar
    MaZiFAU committed
                    }
                    else
    
                    {
                        Debug.Log("PopupBehavior: Error: scroll or parameterDisplays not set.");
    
    MaZiFAU's avatar
    MaZiFAU committed
                }
                else if (error.kind == "unknown")
    
                {
                    errorMessage += UnknownErrorMessage;
                    errorMessage += '\n';
                }
            }
    
            //invalid assignment message
    
    MaZiFAU's avatar
    MaZiFAU committed
            if (invAssCount > 0)
    
            {
                errorMessage += invAssCount.ToString() + " " + InvalidAssignmentMessage;
    
    MaZiFAU's avatar
    MaZiFAU committed
                if (invAssCount > 1) //plural for invalid assignments
    
                {
                    errorMessage += 's';
                }
                errorMessage += '\n';
            }
    
            return errorMessage;
        }
    
        //this should be changed, the Fact Object should be parsed by JSON. This is a workaround because the MMT servers JSON serialization contains a bug
    
        private MMTFact parseFactFromError(ScrollApplicationCheckingError error)
    
    MaZiFAU's avatar
    MaZiFAU committed
            if (error == null || error.msg == null)
    
            string message = error.msg;
    
            //cut start of string
            int indexFact = message.IndexOf('[');
            string factUri = message.Substring(indexFact + 1);
    
            // cut end of string
            int indexFactEnd = factUri.IndexOf(']');
            string rest = factUri.Substring(indexFactEnd);
            factUri = factUri.Substring(0, indexFactEnd);
    
            //get fact Label from the rest of the string
            int factNameLength = rest.IndexOf('?') - 2;
            string factLabel = rest.Substring(2, factNameLength);
    
    
            factUri += "?" + factLabel;
    
    
            //find the required fact in the active scroll thats invalidly assigned
    
            return ActiveScroll.Instance.Scroll.requiredFacts
    
                .Find(decl => decl.@ref.uri == error.fact.uri);