Skip to content
Snippets Groups Projects
MenueLoader.cs 2.72 KiB
Newer Older
  • Learn to ignore specific revisions
  • using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    
    public class MenueLoader : MonoBehaviour
    {
        public UnityEngine.UI.Slider slider;
        public UnityEngine.UI.Scrollbar scroll;
        public GameObject Entry;
        public GameObject EntryBuffer;
    
        private MenueBarSlider selector;
        private int mode;
    
        private List<string> mode_string = new List<string>
        {
            "official",
            "local",
        };
    
        void Start()
        {
            selector = slider.GetComponent<MenueBarSlider>();
            mode = -1;
            Clear();
        }
    
        void Update()
        {
            if (mode == selector.last_active_slot)
                return;
    
            mode = selector.last_active_slot;
            GlobalStatic.SetStage("", mode == 1);
            GlobalStatic.ShallowLoadStages();
    
            Dictionary<string, Stage> dict = mode == 0 ? GlobalStatic.StageOfficial : GlobalStatic.StageLocal;
            ListButtons(dict);
    
            scroll.numberOfSteps = dict.Count;
            scroll.value = 1f;
        }
    
        private void Clear()
        {
            for (int i = 0; i < gameObject.transform.childCount; i++)
                Destroy(gameObject.transform.GetChild(i).gameObject);
        }
    
        private void Default()
        {
            Instantiate(Entry).transform.SetParent(gameObject.transform, false);
            Instantiate(EntryBuffer).transform.SetParent(gameObject.transform, false);
        }
    
        private void ListButtons(Dictionary<string, Stage> dict)
        {
            Clear();
    
            if (dict.Count == 0)
            {
                Default();
                return;
            }
    
            Instantiate(EntryBuffer).transform.SetParent(gameObject.transform, false);
    
            var list = mode == 0 ?
                dict.Values.OrderByDescending((v) => v.number) :
                dict.Values.OrderBy((v) => v.number);
    
            Destroy(gameObject.transform.GetChild(0));
    
            foreach(var stage in list)
            {
                GameObject prefab = Instantiate(Entry);
    
                prefab.transform.SetParent(gameObject.transform, false);
                prefab.transform.SetAsFirstSibling();
    
                var bar = prefab.transform.GetChild(0);
                WriteInChildText(bar.GetChild(0).gameObject, stage.number.ToString());
                WriteInChildText(bar.GetChild(1).gameObject, stage.name);
                WriteInChildText(bar.GetChild(2).gameObject, stage.description);
    
                // TODO: handle unable to load
                prefab.GetComponent<UnityEngine.UI.Button>().onClick.AddListener(delegate { Loader.LoadStage(stage.name, mode == 1); });
            }
    
            void WriteInChildText(GameObject entry, string content)
            {
                if (content == null)
                    return;
    
                entry.transform.GetChild(0).gameObject.GetComponent<TMPro.TextMeshProUGUI>().text = content;
            }
        }
    }