You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
4.9 KiB
120 lines
4.9 KiB
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Security.Permissions;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.Assertions;
|
|
using UnityEngine.UI;
|
|
|
|
/// <summary>
|
|
/// 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!
|
|
/// </summary>
|
|
public class ShopViewList : ShopView, IShopModelObserver<Item>
|
|
{
|
|
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>("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<Transform>();
|
|
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<ViewItemContainer>();
|
|
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<ViewItemContainer>();
|
|
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<ListKeyboardController>().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<MouseController>().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();
|
|
}
|
|
}
|
|
|