// 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 System.Reflection; using Doozy.Editor.EditorUI; using Doozy.Editor.Reactor.Internal; using Doozy.Runtime.Nody; using Doozy.Runtime.Reactor.Internal; using Doozy.Runtime.Reactor.Reactions; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; // ReSharper disable UnusedAutoPropertyAccessor.Global // ReSharper disable MemberCanBePrivate.Global // ReSharper disable ConvertToAutoProperty namespace Doozy.Editor.Nody { /// /// Custom Edge used in the FlowGraphView /// public class FlowEdgeView : Edge, IDisposable { public void Dispose() { inputColorReaction?.Recycle(); outputColorReaction?.Recycle(); } private FlowPortView m_OutputPortView; public FlowPortView outputPortView { get => m_OutputPortView; internal set { m_OutputPortView = value; m_OutputPortView.flowPort.ping += flowDirection => { outputColorReaction.Stop(); inputColorReaction.Stop(); switch (flowDirection) { case FlowDirection.Forward: //forward flow outputColorReaction.SetDuration(0.4f).SetStartDelay(0.2f); outputColorReaction.SetFrom(EditorColors.Nody.StateActive); outputColorReaction.SetValue(EditorColors.Nody.StateActive); inputColorReaction.SetDuration(0.4f).SetStartDelay(0.4f); inputColorReaction.SetFrom(EditorColors.Nody.StateActive); inputColorReaction.SetValue(EditorColors.Nody.StateActive); break; case FlowDirection.Back: //back flow outputColorReaction.SetDuration(0.4f).SetStartDelay(0.4f); outputColorReaction.SetFrom(EditorColors.Nody.BackFlow); outputColorReaction.SetValue(EditorColors.Nody.BackFlow); inputColorReaction.SetDuration(0.4f).SetStartDelay(0.2f); inputColorReaction.SetFrom(EditorColors.Nody.BackFlow); inputColorReaction.SetValue(EditorColors.Nody.BackFlow); break; default: throw new ArgumentOutOfRangeException(nameof(flowDirection), flowDirection, null); } inputColorReaction.SetTo(inputColor); outputColorReaction.SetTo(outputColor); inputColorReaction.Play(); outputColorReaction.Play(); }; } } private FlowPortView m_InputPortView; public FlowPortView inputPortView { get => m_InputPortView; internal set => m_InputPortView = value; } public ColorReaction outputColorReaction { get; internal set; } public ColorReaction inputColorReaction { get; internal set; } public static Color outputColor => EditorApplication.isPlayingOrWillChangePlaymode ? EditorColors.Nody.StateIdle : EditorColors.Nody.Output; public static Color inputColor => EditorApplication.isPlayingOrWillChangePlaymode ? EditorColors.Nody.StateIdle : EditorColors.Nody.Input; public FlowEdgeView() { outputColorReaction = Reaction.Get() .SetEditorHeartbeat() .SetDuration(0.4f) .SetStartDelay(0.2f) .SetSetter(value => { if (edgeControl != null) edgeControl.outputColor = value; if (outputPortView != null) outputPortView.portColor = value; }) .SetOnPlayCallback(() => { edgeControl.edgeWidth = 3; }) .SetOnStopCallback(() => { edgeControl.edgeWidth = 2; outputColorReaction?.SetTo(outputColor); }); inputColorReaction = Reaction.Get() .SetEditorHeartbeat() .SetDuration(0.4f) .SetStartDelay(0.4f) .SetOnStopCallback(() => { inputColorReaction?.SetTo(inputColor); }) .SetSetter(value => { if (edgeControl != null) edgeControl.inputColor = value; // inputPortView.portColor = value; }); RegisterCallback(_ => { typeof(Edge).GetField("m_SelectedColor", BindingFlags.NonPublic | BindingFlags.Instance)? .SetValue(this, EditorColors.Nody.Selection); }); } public FlowEdgeView SetOutputPortView(FlowPortView portView) { outputPortView = portView; return this; } public FlowEdgeView SetInputPortView(FlowPortView portView) { inputPortView = portView; return this; } } }