197 lines
6.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|