using System; using System.Collections; using System.Collections.Generic; using System.Security.Permissions; using UnityEditor; using UnityEngine; using UnityEngine.Assertions; using UnityEngine.UI; /// /// This view is meant to be used in conjunction with a list. Realistically, it is mostly similar to the grid view, /// as both operate with prototypes! /// public class ShopViewList : ShopView, IShopModelObserver { private VerticalLayoutGroup _listLayoutGroup; // This is essentially just a reference to ShopView's layout group but with the correct type [SerializeField] private ViewItemInfoPanel infoPanel; //protected ViewConfig viewConfig; //To set up the grid view, we need to know how many columns the grid view has, in the current setup, //this information can be found in a ViewConfig scriptable object, which serves as a configuration file for //views. // Start is called before the first frame update protected override void Awake() { //iewConfig = Resources.Load("ViewConfig");//Load the ViewConfig scriptable object from the Resources folder //Debug.Assert(viewConfig != null); Debug.Assert(_listLayoutGroup != null); Debug.Assert(infoPanel != null); base.Awake(); model.RegisterObserver(this); print("ShopView Grid Initialised"); } protected override void RegisterMoneyObserver() { var moneyComp = GetComponentInChildren(); if (moneyComp != null) tradePartner.Inventory.RegisterObserver(moneyComp); } protected override void SetupItemIconView() { //_listLayoutGroup.constraint = GridLayoutGroup.Constraint.FixedColumnCount;//Set the constraint mode of the GridLayoutGroup //_listLayoutGroup.constraintCount = viewConfig.gridViewColumnCount; //Set the column count according to the ViewConfig object // Do we set up anything at all here? } protected override void ClearIconView() { Transform[] allIcons = layoutGroup.transform.GetComponentsInChildren(); foreach (Transform child in allIcons) { if (child != layoutGroup.transform) { Destroy(child.gameObject); } } } protected override void AddItemToView(Item item) { GameObject newItemIcon = GameObject.Instantiate(itemPrefab, layoutGroup.transform, true); newItemIcon.transform.localScale = Vector3.one;//The scale would automatically change in Unity so we set it back to Vector3.one. ViewItemContainer itemContainer = newItemIcon.GetComponent(); Debug.Assert(itemContainer != null); //bool isSelected = (item == model.GetSelectedItem()); var unsub = model.RegisterObserver(itemContainer); itemContainer.Initialize(item,model,unsub); shopController.AddSelectableItem(item); //print("Attempt to add item " + item.name + " to view"); } protected override void RemoveItemFromView(Item item) { var items = layoutGroup.transform.GetComponentsInChildren(); foreach (var itemView in items) { if (itemView.Item == item) { shopController.RemoveSelectableItem(item); model.RemoveObserver(itemView); Destroy(itemView.gameObject); return; } } } protected override void SwitchToKeyboardControl() { Destroy(shopController);//Remove the current controller component shopController = gameObject.AddComponent().Initialize(model);//Create and add a keyboard controller instructionText.text = "The current control mode is: Keyboard Control, WASD to select item, press K to buy. Press left mouse button to switch to Mouse Control."; buyButton.gameObject.SetActive(false);//Hide the buy button because we only use keyboard } protected override void SwitchToMouseControl() { Destroy(shopController);//Remove the current controller component shopController = gameObject.AddComponent().Initialize(model);//Create and add a mouse controller instructionText.text = "The current control mode is: Mouse Control, press 'K' to switch to Keyboard Control."; buyButton.gameObject.SetActive(true);//Show the buy button for the mouse controler } private void OnValidate() { _listLayoutGroup = (VerticalLayoutGroup) layoutGroup; bool correctLayout = _listLayoutGroup != null; if(!correctLayout) Debug.LogError("Layout group is not of type Vertical!",this); //else Debug.Log("Grid shop view validated",this); } public void OnSelected(Item item) { if(item != null) infoPanel.gameObject.SetActive(true); infoPanel?.SetItemInfo(item,model); // ? works here as it's meant to live through the whole lifetime of this gameobject anyway } public void OnRemoved(Item item) { infoPanel?.SetItemInfo(null); // This should set the item info to nothing, effectively disabling it shopController.RemoveSelectableItem(item); } public void OnAdded(Item item) { throw new NotImplementedException(); } public void OnTransaction(int moneyDelta) { } }