DCDC25-TwinCity/Assets/VRUIP/Scripts/UI/GalleryController.cs
2025-05-15 16:25:40 +02:00

197 lines
6.9 KiB
C#

using System;
using System.Collections;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
namespace VRUIP
{
public class GalleryController : A_ColorController
{
[SerializeField] private GalleryItem[] images;
[Header("Properties")]
[SerializeField] private bool scrollAnimation;
[Header("Colors")]
[SerializeField] private Color buttonNormalColor;
[SerializeField] private Color buttonHoverColor;
[SerializeField] private Color buttonClickColor;
[SerializeField] private Color titleTextColor;
[Header("Components")]
[SerializeField] private Image currentImage;
[SerializeField] private Image nextImage;
[SerializeField] private TextMeshProUGUI currentTitle;
[SerializeField] private TextMeshProUGUI nextTitle;
[SerializeField] private IconController leftButton;
[SerializeField] private IconController rightButton;
private int _index;
private bool _isScrolling;
private int scrollSpeed = 1;
private void Awake()
{
SetupGallery();
}
protected override void Start()
{
base.Start();
scrollSpeed = VRUIPManager.instance.IsVR ? 2 : 1;
}
[ContextMenu("Setup Gallery (VRUIP)")]
private void SetupGallery()
{
// Check that gallery is not empty.
if (images.Length < 1)
{
Debug.LogError("Please include at least 1 image in gallery.");
return;
}
// Populate components.
_index = 0;
var firstItem = images[0];
currentImage.sprite = firstItem.image;
currentTitle.text = firstItem.title;
// Add event listeners to buttons.
leftButton.RegisterOnClick(NavigateLeft);
rightButton.RegisterOnClick(NavigateRight);
// Setup colors
leftButton.iconNormalColor = buttonNormalColor;
leftButton.iconHoverColor = buttonHoverColor;
leftButton.iconClickColor = buttonClickColor;
rightButton.iconNormalColor = buttonNormalColor;
rightButton.iconHoverColor = buttonHoverColor;
rightButton.iconClickColor = buttonClickColor;
currentTitle.color = nextTitle.color = titleTextColor;
}
private void NavigateLeft()
{
if (_index == 0) _index = images.Length - 1;
else _index--;
var currentItem = images[_index];
if (scrollAnimation)
{
if (!_isScrolling) StartCoroutine(ScrollLeft());
}
else
{
currentImage.sprite = currentItem.image;
currentTitle.text = currentItem.title;
}
}
private void NavigateRight()
{
if (_index == images.Length - 1) _index = 0;
else _index++;
var currentItem = images[_index];
if (scrollAnimation)
{
if (!_isScrolling) StartCoroutine(ScrollRight());
}
else
{
currentImage.sprite = currentItem.image;
currentTitle.text = currentItem.title;
}
}
private IEnumerator ScrollLeft()
{
// Disable clicking while scrolling animation is happening.
_isScrolling = true;
leftButton.button.interactable = false;
rightButton.button.interactable = false;
// Set next image properties.
nextImage.transform.SetLocalX(-400);
nextImage.sprite = images[_index].image;
nextTitle.transform.SetLocalX(-400);
nextTitle.text = images[_index].title;
// Loop until images are at correct position.
while (currentImage.transform.localPosition.x < 400)
{
currentImage.transform.SetLocalX(5 * scrollSpeed, true);
nextImage.transform.SetLocalX(5 * scrollSpeed, true);
currentTitle.transform.SetLocalX(5 * scrollSpeed, true);
nextTitle.transform.SetLocalX(5 * scrollSpeed, true);
yield return null;
}
// Reset images and titles for next click.
currentImage.sprite = nextImage.sprite;
currentImage.transform.localPosition = nextImage.transform.localPosition;
nextImage.transform.SetLocalX(-400);
currentTitle.text = nextTitle.text;
currentTitle.transform.localPosition = nextTitle.transform.localPosition;
nextTitle.transform.SetLocalX(-400);
// Restore clicking functionality.
leftButton.button.interactable = true;
rightButton.button.interactable = true;
_isScrolling = false;
}
private IEnumerator ScrollRight()
{
// Disable clicking while scrolling animation is happening.
_isScrolling = true;
leftButton.button.interactable = false;
rightButton.button.interactable = false;
// Set next image properties.
nextImage.transform.SetLocalX(400);
nextImage.sprite = images[_index].image;
nextTitle.transform.SetLocalX(400);
nextTitle.text = images[_index].title;
// Loop until images are at correct position.
while (currentImage.transform.localPosition.x > -400)
{
currentImage.transform.SetLocalX(-5 * scrollSpeed, true);
nextImage.transform.SetLocalX(-5 * scrollSpeed, true);
currentTitle.transform.SetLocalX(-5 * scrollSpeed, true);
nextTitle.transform.SetLocalX(-5 * scrollSpeed, true);
yield return null;
}
// Reset images and titles for next click.
currentImage.sprite = nextImage.sprite;
currentImage.transform.localPosition = nextImage.transform.localPosition;
nextImage.transform.SetLocalX(400);
currentTitle.text = nextTitle.text;
currentTitle.transform.localPosition = nextTitle.transform.localPosition;
nextTitle.transform.SetLocalX(400);
// Restore clicking functionality.
leftButton.button.interactable = true;
rightButton.button.interactable = true;
_isScrolling = false;
}
[Serializable]
private class GalleryItem
{
public string title;
public Sprite image;
}
protected override void SetColors(ColorTheme theme)
{
currentTitle.color = nextTitle.color = theme.secondaryColor;
}
}
}