Browse Source

Added Selected Button script

James Peret 2 years ago
parent
commit
4a0a9a2339

+ 8 - 2
Runtime/Encyclopedia/DefaultEncyclopediaArticle.cs

@@ -11,17 +11,23 @@ public class DefaultEncyclopediaArticle : ScriptableObject, IEncyclopediaArticle
     public Sprite image;
     public string author;
     public string date;
+    public string description;
     [HideLabel, TextArea()] public string text;
 
     public EncyclopediaArticle GetArticle()
     {
         var article = new EncyclopediaArticle();
+        article.id = title;
+        article.title = title;
+        article.description = description;
+        article.icon = icon;
         article.content.Add("title", title);
-        article.content.Add("author", title);
-        article.content.Add("date", title);
+        article.content.Add("author", author);
+        article.content.Add("date", date);
         article.content.Add("text", text);
         article.images.Add("icon", icon);
         article.images.Add("image", image);
+        //Debug.Log($"Created article with {article.content.Keys.Count} content keys");
         return article;
     }
 }

+ 14 - 2
Runtime/Encyclopedia/DefaultEncyclopediaCategory.cs

@@ -6,6 +6,8 @@ public class DefaultEncyclopediaCategory : EncyclopediaCategory
 {
     public List<DefaultEncyclopediaCategoryArticle> articles = new List<DefaultEncyclopediaCategoryArticle>();
 
+    private List<EncyclopediaArticle> data = new List<EncyclopediaArticle>();
+
     [System.Serializable]
     public class DefaultEncyclopediaCategoryArticle
     {
@@ -15,8 +17,18 @@ public class DefaultEncyclopediaCategory : EncyclopediaCategory
 
     public override List<EncyclopediaArticle> GetArticles()
     {
-        var data = new List<EncyclopediaArticle>();
-        foreach (var article in articles) data.Add(((IEncyclopediaArticle)article).GetArticle());
+        if(data.Count == 0) UpdateArticles();
         return data;
     }
+
+    public override void UpdateArticles()
+    {
+        data = new List<EncyclopediaArticle>();
+        foreach (DefaultEncyclopediaCategoryArticle item in articles) 
+        {
+            var article = item.article.GetArticle();
+            article.id = id + "_" + article.id;
+            data.Add(article);
+        }
+    }
 }

+ 4 - 0
Runtime/Encyclopedia/EncyclopediaArticle.cs

@@ -7,6 +7,10 @@ using Sirenix.OdinInspector;
 [System.Serializable]
 public class EncyclopediaArticle
 {
+    public string id;
+    public string title;
+    public string description;
+    public Sprite icon;
     public Dictionary<string,string> content = new Dictionary<string, string>();
     public Dictionary<string,Sprite> images = new Dictionary<string, Sprite>();
     public Dictionary<string,int> integers = new Dictionary<string, int>();

+ 12 - 8
Runtime/Encyclopedia/EncyclopediaArticleUi.cs

@@ -1,18 +1,22 @@
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using UnityEngine.UI;
+using TMPro;
+using Sirenix.OdinInspector;
 
+[HideMonoScript]
 public class EncyclopediaArticleUi : MonoBehaviour
 {
-    // Start is called before the first frame update
-    void Start()
-    {
-        
-    }
+    public string articleDataKey = "title";
+    public TextMeshProUGUI text;
+    public bool showDebug = false;
 
-    // Update is called once per frame
-    void Update()
+    public void Setup(EncyclopediaArticle article)
     {
-        
+        article.content.TryGetValue(articleDataKey, out string result);
+        text.text = result;
+        if(showDebug && result == null) Debug.Log($"Article did not contain content key {articleDataKey}. Content key count: {article.content.Keys.Count}");
     }
+
 }

+ 6 - 0
Runtime/Encyclopedia/EncyclopediaCategory.cs

@@ -7,6 +7,7 @@ using Sirenix.OdinInspector;
 public class EncyclopediaCategory : MonoBehaviour
 {
     public string title = "Encyclopedia Category";
+    public string id = "Unique ID #123";
     public Sprite icon;
     public GameObject buttonPrefab;
     public string layoutName = "default-view";
@@ -17,4 +18,9 @@ public class EncyclopediaCategory : MonoBehaviour
         return new List<EncyclopediaArticle>();
     }
 
+    public virtual void UpdateArticles()
+    {
+        
+    }
+
 }

+ 37 - 4
Runtime/Encyclopedia/EncyclopediaController.cs

@@ -2,18 +2,51 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using Sirenix.OdinInspector;
+using KairoEngine.UI.InteractionHandler;
 
 [HideMonoScript]
-public class EncyclopediaController : MonoBehaviour
+public class EncyclopediaController : MonoBehaviour, IClickHandler
 {
+    [ShowInInspector, HorizontalGroup("IndexLine", 0.7f), LabelText("Index")] public int menuIndex;
+    [ShowInInspector, HorizontalGroup("IndexLine", 0.3f), HideLabel] public int subMenuIndex;
+
     public EncyclopediaUi encyclopediaUi;
     public GameObject categoryButtomPrefab;
     public List<EncyclopediaCategory> categories = new List<EncyclopediaCategory>();
 
-    [Button("Build Menu")]
+    [Button("Build Menu"), ButtonGroup("Buttons")]
     public void BuildMenu()
     {
-        if(encyclopediaUi == null) return;
-        encyclopediaUi.Populate();
+        Navigate();
+    }
+
+    public void OnClick(string id)
+    {
+        for (int i = 0; i < categories.Count; i++)
+        {
+            if(id == categories[i].id) 
+            {
+                menuIndex = i;
+                Navigate();
+                return;
+            }
+            var articles = categories[i].GetArticles();
+            for (int a = 0; a < articles.Count; a++)
+            {
+                if(id == articles[a].id)
+                {
+                    menuIndex = i;
+                    subMenuIndex = a;
+                    Navigate();
+                    return;
+                }
+            }
+        }
+    }
+
+    [Button("Navigate"), ButtonGroup("Buttons")]
+    public void Navigate()
+    {
+        if(encyclopediaUi != null) encyclopediaUi.Navigate();
     }
 }

+ 119 - 7
Runtime/Encyclopedia/EncyclopediaUi.cs

@@ -6,7 +6,7 @@ using Sirenix.OdinInspector;
 using KairoEngine.UI.InteractionHandler;
 
 [HideMonoScript]
-public class EncyclopediaUi : MonoBehaviour, IClickHandler
+public class EncyclopediaUi : MonoBehaviour
 {
     public EncyclopediaController controller;
     public GameObject menuGameObject;
@@ -14,14 +14,22 @@ public class EncyclopediaUi : MonoBehaviour, IClickHandler
     public GameObject viewsGameObject;
     public Transform menuContainer;
     public Transform subMenuContainer;
+    public bool createOnStart = true;
     public bool showDebug = false;
     public List<EncyclopediaUiView> views;
+    private List<SelectedButton> menuButtonSelection;
+    private List<SelectedButton> subMenuButtonSelection;
+    private int menuIndex = -1;
+    private int subMenuIndex = -1;
+    private int currentMenuIndex = -1;
+    private int currentSubMenuIndex = -1;
 
     private void Start()
     {
         if(menuGameObject == null) Debug.LogError("Missing Menu GameObject in EncyclopediaUi", this.gameObject);
         if(subMenuGameObject == null) Debug.LogError("Missing submenu GameObject in EncyclopediaUi", this.gameObject);
         if(viewsGameObject == null) Debug.LogError("Missing views GameObject in EncyclopediaUi", this.gameObject);
+        if(createOnStart) Populate();
     }
 
     private void Update()
@@ -36,27 +44,131 @@ public class EncyclopediaUi : MonoBehaviour, IClickHandler
     public void HideSubmenu() => subMenuGameObject.SetActive(false);
 
     public void Populate()
+    {
+        menuIndex = controller.menuIndex;
+        subMenuIndex = controller.subMenuIndex;
+        currentMenuIndex = controller.menuIndex;
+        currentSubMenuIndex = controller.subMenuIndex;
+        CreateMenu();
+        CreateSubMenu();
+        ShowArticle();
+    }
+
+    public void CreateMenu()
     {
         if(controller == null || menuContainer == null) return;
+        menuButtonSelection = new List<SelectedButton>();
         Button[] oldButtons = menuContainer.GetComponentsInChildren<Button>();
         int counter = 0;
-        if(showDebug) Debug.Log($"Destroying {oldButtons.Length} buttons");
+        if(showDebug) Debug.Log($"Destroying {oldButtons.Length} menu buttons");
         foreach (Button item in oldButtons) DestroyImmediate(item.gameObject);
         foreach (EncyclopediaCategory category in controller.categories)
         {
-            var obj = Instantiate(category.buttonPrefab, new Vector3(), Quaternion.identity, menuContainer.transform);
+            var obj = Instantiate(controller.categoryButtomPrefab, new Vector3(), Quaternion.identity, menuContainer.transform);
             var btnData = obj.GetComponent<ButtonData>();
             if(btnData != null) btnData.Setup(category.title, category.icon);
             var handler = obj.GetComponent<ClickHandler>();
-            if(handler != null) handler.Setup(category.layoutName, this);
+            if(handler != null) handler.Setup(category.id, (IClickHandler)controller);
+            var selectedButton = obj.GetComponent<SelectedButton>();
+            if(selectedButton != null) menuButtonSelection.Add(selectedButton);
+            counter += 1;
+        }
+        if(menuIndex < menuButtonSelection.Count) 
+        {
+            //menuIndex = controller.menuIndex;
+            menuButtonSelection[menuIndex].Select();
+        }
+        if(showDebug) Debug.Log($"Created {counter} menu buttons");
+    }
+
+    public void CreateSubMenu()
+    {
+        if(controller == null || subMenuContainer == null) return;
+        subMenuButtonSelection = new List<SelectedButton>();
+        Button[] oldButtons = subMenuContainer.GetComponentsInChildren<Button>();
+        int counter = 0;
+        var category = controller.categories[controller.menuIndex];
+        category.UpdateArticles();
+        if(showDebug) Debug.Log($"Destroying {oldButtons.Length} sub menu buttons");
+        foreach (Button item in oldButtons) DestroyImmediate(item.gameObject);
+        foreach (EncyclopediaArticle article in category.GetArticles())
+        {
+            var obj = Instantiate(category.buttonPrefab, new Vector3(), Quaternion.identity, subMenuContainer.transform);
+            var btnData = obj.GetComponent<ButtonData>();
+            Sprite icon = null;
+            if(article.icon != null) icon = article.icon;
+            else icon = category.icon;
+            if(btnData != null) btnData.Setup(article.title, icon);
+            var handler = obj.GetComponent<ClickHandler>();
+            if(handler != null) handler.Setup(article.id, (IClickHandler)controller);
+            var selectedButton = obj.GetComponent<SelectedButton>();
+            if(selectedButton != null) subMenuButtonSelection.Add(selectedButton);
             counter += 1;
         }
-        if(showDebug) Debug.Log($"Created {counter} buttons");
+        if(controller.subMenuIndex < subMenuButtonSelection.Count && menuIndex == currentMenuIndex)
+        {
+            //subMenuIndex = controller.subMenuIndex;
+            subMenuButtonSelection[subMenuIndex].Select();
+        }
+        if(showDebug) Debug.Log($"Created {counter} sub menu buttons");
+    }
+
+    public void ShowArticle()
+    {
+        if(controller == null) return;
+        var category = controller.categories[menuIndex];
+        var articles = category.GetArticles();
+        var article = articles[subMenuIndex];
+        var layout = GetView(category.layoutName);
+        if(layout == null) return;
+        HideViews();
+        layout.view.SetActive(true);
+        foreach (var item in layout.view.GetComponentsInChildren<EncyclopediaArticleUi>(true))
+        {
+            item.Setup(article);
+        }
+        foreach (var btn in subMenuButtonSelection) btn.Deselect();
+        subMenuButtonSelection[subMenuIndex].Select();
+        currentMenuIndex = menuIndex;
+        currentSubMenuIndex = subMenuIndex;
+    }
+
+    public void Navigate()
+    {
+        if(controller == null) return;
+        // Navigated to different category
+        if(menuIndex != controller.menuIndex)
+        {
+            menuIndex = controller.menuIndex;
+            CreateMenu();
+            CreateSubMenu();
+        }
+        else if (currentMenuIndex != menuIndex && currentSubMenuIndex == subMenuIndex)
+        {
+            if(controller.subMenuIndex > controller.categories[menuIndex].GetArticles().Count) return;
+            else subMenuIndex = controller.subMenuIndex;
+            ShowArticle();
+        }
+        if(subMenuIndex != controller.subMenuIndex)
+        {
+            if(controller.subMenuIndex > controller.categories[menuIndex].GetArticles().Count) return;
+            else subMenuIndex = controller.subMenuIndex;
+            ShowArticle();
+        }
+    }
+
+    public EncyclopediaUiView GetView(string title)
+    {
+        for (int i = 0; i < views.Count; i++)
+        {
+            if(views[i].title == title) return views[i];
+        }
+        return null;
     }
 
-    public void OnClick(string title)
+    public void HideViews()
     {
-        throw new System.NotImplementedException();
+        foreach (var layout in views) layout.view.SetActive(false);
     }
 
     [System.Serializable]

+ 49 - 0
Runtime/InteractionHandler/SelectedButton.cs

@@ -0,0 +1,49 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI.InteractionHandler
+{
+    [HideMonoScript]
+    public class SelectedButton : MonoBehaviour
+    {
+        public Image image;
+        public Button button;
+        
+        public bool selected = false;
+        [SerializeField] private Sprite defaultSprite;
+        [SerializeField] private Sprite selectedSprite;
+        [SerializeField] private Sprite disabledSprite;
+
+        private void Start()
+        {
+            if(defaultSprite == null) defaultSprite = image.sprite;
+        }
+
+        public void Select()
+        {
+            //if(selected) return;
+            selected = true;
+            if(defaultSprite == null) defaultSprite = image.sprite;
+            //image.sprite = button.spriteState.selectedSprite;
+            var btnStates = button.spriteState;
+            btnStates.disabledSprite = selectedSprite;
+            button.spriteState = btnStates;
+            button.interactable = false;
+            
+        }
+
+        public void Deselect()
+        {
+            //if(!selected) return;
+            selected = false;
+            //image.sprite = selectedSprite;
+            var btnStates = button.spriteState;
+            btnStates.disabledSprite = disabledSprite;
+            button.spriteState = btnStates;
+            button.interactable = true;
+        }
+    }
+}

+ 11 - 0
Runtime/InteractionHandler/SelectedButton.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 66ba0f68b995e094cab7a691e94f83bc
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: