示例#1
0
        private void StatePort_Disconnected(Connection connection)
        {
            if (!object.ReferenceEquals(connection.SourcePort, this))
            {
                return;
            }
            StateMachineTransition transition = (StateMachineTransition)connection;
            StateMachineChip       stateMachine;
            StateChip targetState = (StateChip)transition.TargetStatePort.Node;

            targetState.Active = false;
            if (transition.SourceStatePort.IsStateRootPort)
            {
                stateMachine = (StateMachineChip)transition.SourceStatePort.Node;
            }
            else
            {
                StateChip sourceState = (StateChip)transition.SourceStatePort.Node;
                stateMachine = sourceState.StateMachineUnchecked;
            }
            DebugUtils.Assert(object.ReferenceEquals(stateMachine, targetState.StateMachineUnchecked));
            if (stateMachine == null)
            {
                if (!transition.SourceStatePort.IsStateRootPort)
                {
                    ((StateChip)transition.SourceStatePort.Node).CheckStateMachine();
                }
                targetState.CheckStateMachine();
                return;
            }
            if (transition.TargetStatePort.connections.Count > 0)
            {
                stateMachine.UpdateConnectedStates();
            }
            else
            {
                stateMachine.connectedStates.Remove(targetState);
                targetState.StateMachine = null;
            }
            if (!transition.SourceStatePort.IsStateRootPort)
            {
                ((StateChip)transition.SourceStatePort.Node).CheckStateMachine();
            }
            targetState.CheckStateMachine();
        }
示例#2
0
        private void StatePort_Connected(Connection connection)
        {
            DebugUtils.Assert(object.ReferenceEquals(connection.SourcePort, this));
            DebugUtils.Assert(!connection.TargetPort.IsStateRootPort);
            StateMachineTransition transition = (StateMachineTransition)connection;
            StateMachineChip       stateMachine;
            StateChip targetState = (StateChip)transition.TargetStatePort.Node;

            if (transition.SourceStatePort.IsStateRootPort)
            {
                stateMachine = (StateMachineChip)transition.SourceStatePort.Node;
            }
            else
            {
                StateChip sourceState = (StateChip)transition.SourceStatePort.Node;
                stateMachine = sourceState.StateMachineUnchecked;
                if (stateMachine == null)
                {
                    stateMachine = targetState.StateMachineUnchecked;
                }
            }
            if (stateMachine == null)
            {
                if (!transition.SourceStatePort.IsStateRootPort)
                {
                    ((StateChip)transition.SourceStatePort.Node).CheckStateMachine();
                }
                targetState.CheckStateMachine();
                return;
            }

            StateChip newState;

            if (targetState.StateMachineUnchecked == null)
            {
                newState = targetState;
            }
            else
            {
                newState = (StateChip)transition.SourceStatePort.Node;
            }

            if (newState.StateMachineUnchecked == null)
            {
                DebugUtils.Assert(newState.statePort.connections.Count > 0);
                if (newState.statePort.connections.Count > 1)
                {
                    stateMachine.UpdateConnectedStates();
                }
                else
                {
                    DebugUtils.Assert(!stateMachine.connectedStates.Contains(newState));
                    stateMachine.connectedStates.Add(newState);
                    newState.StateMachine = stateMachine;
                }
            }
            else
            {
                DebugUtils.Assert(object.ReferenceEquals(targetState.StateMachine, stateMachine));
            }
            if (!transition.SourceStatePort.IsStateRootPort)
            {
                ((StateChip)transition.SourceStatePort.Node).CheckStateMachine();
            }
            targetState.CheckStateMachine();
        }