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 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);
//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)
{
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
}
public void OnAdded(Item item)
{
throw new NotImplementedException();
}
}