Skip to content
Snippets Groups Projects
ScrollDetails.cs 4.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • using REST_JSON_API;
    using System.Collections.Generic;
    
    using System.Text.RegularExpressions;
    
    using TMPro;
    using UnityEngine;
    
    public class ScrollDetails : ScrollView
    {
        public static ScrollDetails Instance
        {
            get => _Instance;
            set
            {
                if (_Instance != value)
                    Destroy(_Instance);
    
                _Instance = value;
            }
        }
        private static ScrollDetails _Instance;
    
        public WorldCursor cursor;
        public GameObject parameterDisplayPrefab;
        public GameObject mmtAnswerPopUp;
        private PopupBehavior Popup;
    
        public static List<RenderedScrollFact> ParameterDisplays { get; private set; }
    
        void Awake()
        {
            Instance = this;
    
    
            if (cursor == null) cursor = FindObjectOfType<WorldCursor>();
    
    
            Popup = mmtAnswerPopUp.GetComponent<PopupBehavior>();
            Popup.gameObject.SetActive(true); // force Awake
        }
    
        private void OnEnable()
        {
    
            SwitchScrollUI.activeScrollData.OnScrollChanged.AddListener(ShowScroll);
            SwitchScrollUI.activeScrollData.OnFactAssignmentUpdated.AddListener(OnFactAssignmentUpdated);
            SwitchScrollUI.activeScrollData.OnScrollDynamicInfoUpdated.AddListener(UpdateScrollDescription);
    
            SwitchScrollUI.activeScrollData.OnScrollChanged.RemoveListener(ShowScroll);
            SwitchScrollUI.activeScrollData.OnFactAssignmentUpdated.RemoveListener(OnFactAssignmentUpdated);
            SwitchScrollUI.activeScrollData.OnScrollDynamicInfoUpdated.RemoveListener(UpdateScrollDescription);
    
        }
    
        private void OnDestroy()
        {
            _Instance = null;
        }
    
        /// <summary>
        /// Update the scroll details screen to display the currently active scroll
        /// </summary>
        /// <param name="activeScroll"></param>
    
        private void ShowScroll(Scroll newScroll)
    
        {
            Transform originalScroll = gameObject.transform.GetChild(1);
            Transform originalScrollView = originalScroll.GetChild(1);
            Transform originalViewport = originalScrollView.GetChild(0);
    
            //Clear all current ScrollFacts
            originalViewport.GetChild(0).gameObject.DestroyAllChildren();
    
    
            var description = newScroll.description;
            // if description is a html description, extract the alternative text representation
    
            if (Regex.IsMatch(newScroll.description, ".*<scroll-description.*"))
    
                description = Regex.Match(newScroll.description, "<scroll-description [^>]* alt=((?>\\\")|(?>\\'))([^>]*?)\\1[^>]*>").Groups[2].Value;
    
            }
            originalScroll.GetChild(0).GetComponent<TextMeshProUGUI>().text = description;
    
    
            //ParameterDisplays.ForEach(gameObj => Destroy(gameObj));
            ParameterDisplays = new();
            // generate parameter display slots
    
            foreach (var slot in SwitchScrollUI.activeScrollData.Assignments)
    
            {
                GameObject originalObj =
                    Instantiate(parameterDisplayPrefab, originalViewport.GetChild(0));
    
                RenderedScrollFact originalRSF =
                    originalObj.GetComponentInChildren<RenderedScrollFact>();
    
                ParameterDisplays.Add(originalRSF);
    
    
                originalRSF.Populate(newScroll, slot.Key);
    
                originalRSF.transform.parent.gameObject.SetActive(slot.Value.IsVisible);
            }
        }
    
        private void UpdateScrollDescription(Scroll rendered)
        {
    
            if (SwitchScrollUI.activeScrollData.DynamicScrollDescriptionsActive)
    
            { // Update scroll-description
                Transform scroll = gameObject.transform.GetChild(1).transform;
                scroll.GetChild(0).GetComponent<TextMeshProUGUI>().text = rendered.description;
            }
        }
    
        private void OnFactAssignmentUpdated(string slotUri, ActiveScroll.SlotAssignment slotAssignment)
        {
            RenderedScrollFact changed = ParameterDisplays.Find(RSF => RSF.ScrollFactURI == slotUri);
    
    
            // check if the RenderedScrollFact already contains the assigend fact
            // this is to prevent an endless loop because updating the Fact property will trigger the NewAssignmentEvent
            // TODO: BE: find an other solution beacause this results in requesting the scroll dynamic update twice from the server
            if (changed != null && (
                (!slotAssignment.IsSet && changed.IsSet) ||
                (slotAssignment.IsSet && changed.URI != slotAssignment.fact?.Id)
                ))