Skip to content

Instantly share code, notes, and snippets.

@Syjgin
Created January 20, 2022 06:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Syjgin/15f6296331160d9e35dad72b13f0d411 to your computer and use it in GitHub Desktop.
Save Syjgin/15f6296331160d9e35dad72b13f0d411 to your computer and use it in GitHub Desktop.
using Dialogues.PopupQueue;
using GameInput;
using UnityEngine;
using UnityEngine.UI;
using Zenject;
namespace Dialogues
{
public class BaseDialogue : MonoBehaviour
{
[Inject] protected InputHandler InputHandler;
[SerializeField] protected GameObject _dialogue;
[SerializeField] protected Button _closeButton;
[SerializeField] private GameObject _highlight;
[SerializeField] private PopupQueueElementType _popupQueueElementType;
protected IPopupQueueElement CurrentElement;
private bool _isActive;
protected virtual void OnEnable()
{
if (_closeButton != null)
_closeButton.onClick.AddListener(() => { InputHandler.TryCloseDialog(); });
InputHandler.PopupStateChanged += OnPopupStateChanged;
}
protected void OnPopupStateChanged(IPopupQueueElement current, PopupQueueOperation lastOperation)
{
var wasActive = _isActive;
var isActive = current.ElementType == _popupQueueElementType;
var isAnyPopupActive = current.ElementType != InputHandler.GetBasePopupType();
switch (lastOperation)
{
case PopupQueueOperation.OverlapPrevious:
if (isActive)
{
ActivateAndUpdate(current, isAnyPopupActive);
}
break;
case PopupQueueOperation.HidePrevious:
if (isActive)
{
ActivateAndUpdate(current, isAnyPopupActive);
}
else
{
if(wasActive)
DeactivateElements(isAnyPopupActive);
}
break;
case PopupQueueOperation.MergePrevious:
if (isActive)
{
if (!_dialogue.gameObject.activeSelf)
{
ActivateAndUpdate(current, isAnyPopupActive);
}
else
{
UpdateContent(current);
}
}
break;
case PopupQueueOperation.BringFromForeground:
if (isActive)
{
SetElementsActive(isAnyPopupActive);
}
else
{
if(wasActive)
DeactivateElements(isAnyPopupActive);
}
break;
default:
break;
}
_isActive = isActive;
}
private void ActivateAndUpdate(IPopupQueueElement current, bool isAnyPopupActive)
{
SetElementsActive(isAnyPopupActive);
UpdateContent(current);
}
private void DeactivateElements(bool isAnyPopupActive)
{
if(_closeButton != null)
_closeButton.gameObject.SetActive(false);
if(_dialogue.activeSelf)
_dialogue.SetActive(false);
_highlight.SetActive(isAnyPopupActive);
ChangeUiVisibility(false);
}
protected virtual void UpdateContent(IPopupQueueElement popupQueueElement)
{
CurrentElement = popupQueueElement;
}
private void SetElementsActive(bool isAnyPopupActive)
{
if(!_dialogue.activeSelf)
_dialogue.SetActive(true);
_highlight.SetActive(isAnyPopupActive);
if(_closeButton != null)
_closeButton.gameObject.SetActive(true);
ChangeUiVisibility(true);
}
protected virtual void ChangeUiVisibility(bool isVisible)
{
}
protected virtual void OnDisable()
{
if(_closeButton != null)
_closeButton.onClick.RemoveAllListeners();
InputHandler.PopupStateChanged -= OnPopupStateChanged;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment