OldBlueWater/BlueWater/Assets/Doozy/Runtime/UIManager/Nodes/PortalNode.cs
2023-08-02 15:08:03 +09:00

198 lines
7.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2015 - 2023 Doozy Entertainment. All Rights Reserved.
// This code can only be used under the standard Unity Asset Store End User License Agreement
// A Copy of the EULA APPENDIX 1 is available at http://unity3d.com/company/legal/as_terms
using System;
using Doozy.Runtime.Common.Extensions;
using Doozy.Runtime.Nody;
using Doozy.Runtime.Nody.Nodes.Internal;
using Doozy.Runtime.Signals;
using Doozy.Runtime.UIManager.Input;
using Doozy.Runtime.UIManager.Nodes.Listeners;
// ReSharper disable RedundantOverriddenMember
namespace Doozy.Runtime.UIManager.Nodes
{
/// <summary>
/// The Portal Node is a global node that listens for a set trigger and, when triggered, activates the node connected to it.
/// A global node is active as long as its parent Graph is active.
/// This particular node allows for jumping from one part of the UI flow to another, without the need of a direct connection.
/// Due to the way it works, this node can also be used as a virtual connection between multiple active Graphs.
/// </summary>
[Serializable]
[NodyMenuPath("UI Manager", "Portal")]
public sealed class PortalNode : GlobalNode
{
public enum TriggerCondition
{
Signal,
UIButton,
UIToggle,
UIView
}
public TriggerCondition Trigger;
public SignalPayload SignalPayload;
public UIButtonId ButtonId;
public UIToggleId ToggleId;
public CommandToggle CommandToggle;
public UIViewId ViewId;
public CommandShowHide CommandShowHide;
public bool isBackButton => Trigger == TriggerCondition.UIButton && ButtonId.Name.Equals(BackButton.k_ButtonName);
public bool viewsCategory => Trigger == TriggerCondition.UIView && ViewId.Name.IsNullOrEmpty();
public bool allViews => Trigger == TriggerCondition.UIView && ViewId.Category.IsNullOrEmpty() && ViewId.Name.IsNullOrEmpty();
private StreamNodyListener streamListener { get; set; }
private UIButtonNodyListener uiButtonListener { get; set; }
private UIToggleNodyListener uiToggleListener { get; set; }
private UIViewNodyListener uiViewListener { get; set; }
public override bool showClearGraphHistoryInEditor => true;
public PortalNode()
{
Trigger = TriggerCondition.Signal;
SignalPayload = new SignalPayload();
ButtonId = new UIButtonId();
ToggleId = new UIToggleId();
CommandToggle = CommandToggle.Any;
ViewId = new UIViewId();
CommandShowHide = CommandShowHide.Show;
AddOutputPort()
.SetCanBeDeleted(false)
.SetCanBeReordered(false);
}
public override void OnEnter(FlowNode previousNode = null, FlowPort previousPort = null)
{
base.OnEnter(previousNode, previousPort);
GoToNextNode(firstOutputPort);
}
public override void OnExit()
{
base.OnExit();
nodeState = NodeState.Running;
}
public override void Start()
{
base.Start();
StartListeners();
}
public override void Stop()
{
base.Stop();
StopListeners();
}
private void StartListeners()
{
streamListener ??= new StreamNodyListener(this, SignalPayload, OnSignal);
streamListener.Start();
uiButtonListener ??= new UIButtonNodyListener(this, OnUIButtonSignal);
uiButtonListener.Start();
uiToggleListener ??= new UIToggleNodyListener(this, OnUIToggleSignal);
uiToggleListener.Start();
uiViewListener ??= new UIViewNodyListener(this, OnUIViewSignal);
uiViewListener.Start();
}
private void StopListeners()
{
streamListener?.Stop();
uiButtonListener?.Stop();
uiToggleListener?.Stop();
uiViewListener?.Stop();
}
private void OnSignal()
{
if (Trigger != TriggerCondition.Signal) return;
flowGraph.SetActiveNode(this);
}
private void OnUIButtonSignal(UIButtonSignalData data)
{
if (Trigger != TriggerCondition.UIButton) return;
if (isBackButton && data.isBackButton)
{
if (multiplayerMode && playerIndex != data.playerIndex)
return;
flowGraph.SetActiveNode(this);
return;
}
if (!ButtonId.Category.Equals(data.buttonCategory)) return;
if (!ButtonId.Name.Equals(data.buttonName)) return;
if (multiplayerMode && playerIndex != data.playerIndex) return;
flowGraph.SetActiveNode(this);
}
private void OnUIToggleSignal(UIToggleSignalData data)
{
if (Trigger != TriggerCondition.UIToggle) return;
if (CommandToggle != data.state) return;
if (!ToggleId.Category.Equals(data.toggleCategory)) return;
if (!ToggleId.Name.Equals(data.toggleName)) return;
if (multiplayerMode && playerIndex != data.playerIndex) return;
flowGraph.SetActiveNode(this);
}
private void OnUIViewSignal(UIViewSignalData data)
{
if (Trigger != TriggerCondition.UIView) return;
switch (CommandShowHide)
{
case CommandShowHide.Show:
switch (data.execute)
{
case ShowHideExecute.Hide:
case ShowHideExecute.InstantHide:
case ShowHideExecute.ReverseShow:
case ShowHideExecute.ReverseHide:
return;
}
break;
case CommandShowHide.Hide:
switch (data.execute)
{
case ShowHideExecute.Show:
case ShowHideExecute.InstantShow:
case ShowHideExecute.ReverseShow:
case ShowHideExecute.ReverseHide:
return;
}
break;
}
if (!ViewId.Category.Equals(data.viewCategory)) return;
if (!ViewId.Name.Equals(data.viewName)) return;
if (multiplayerMode && playerIndex != data.playerIndex) return;
flowGraph.SetActiveNode(this);
}
public string InfoString() =>
Trigger switch
{
TriggerCondition.Signal => $"{SignalPayload}",
TriggerCondition.UIButton => ButtonId.Name.Equals(BackButton.k_ButtonName) ? "'Back'" : $"{ButtonId}",
TriggerCondition.UIToggle => $"({CommandToggle}) {ToggleId}",
TriggerCondition.UIView => $"({CommandShowHide}) " + $"{(ViewId.Category.IsNullOrEmpty() & ViewId.Name.IsNullOrEmpty() ? "All Views" : ViewId.Name.IsNullOrEmpty() ? $"{ViewId.Category} category" : $"{ViewId}")}",
_ => throw new ArgumentOutOfRangeException()
};
}
}