void MainWindow_Loaded(object sender, RoutedEventArgs args) { _stateMachine = new ReactiveStateMachine <VisibilityStates>("VisibilityStates", VisibilityStates.Collapsed); _mouseDownTrigger = Observable.FromEventPattern <MouseEventArgs>(this, "MouseDown").Select(evt => evt.EventArgs); _mouseUpTrigger = new Trigger <MouseEventArgs>(Observable.FromEventPattern <MouseEventArgs>(this, "MouseUp").Select(evt => evt.EventArgs)); _stateMachine.AddTransition(VisibilityStates.Collapsed, VisibilityStates.FadingIn, _mouseDownTrigger, e => { Console.WriteLine("MouseDown"); }); _stateMachine.AddTransition(VisibilityStates.FadingIn, VisibilityStates.Visible, _mouseUpTrigger, e => { Console.WriteLine("MouseUp"); }); _stateMachine.AddTransition(VisibilityStates.Visible, VisibilityStates.Collapsed, _mouseDownTrigger, e => { Console.WriteLine("MouseDown"); }); _stateMachine.AddEntryAction(VisibilityStates.Visible, () => Console.WriteLine("Entering Visible State")); _stateMachine.AddExitAction(VisibilityStates.Visible, () => Console.WriteLine("Exiting Visible State")); _stateMachine.Start(); }
void Start() { StateA stateA = new StateA(); StateB stateB = new StateB(); ReactiveStateMachine <Triggers, IState> rsm; rsm = new ReactiveStateMachine <Triggers, IState>(); rsm.OnEnter(stateA).Subscribe(e => Debug.Log(((StateA)e).aString)).AddTo(this); rsm.OnEnter(stateB).Subscribe(e => Debug.Log(((StateB)e).anInt)).AddTo(this); rsm.AddTransition(stateA, Triggers.TriggerB, stateB); rsm.AddTransition(stateB, Triggers.TriggerA, stateA); rsm.Start(stateA); rsm.Trigger(Triggers.TriggerA); rsm.Trigger(Triggers.TriggerB); rsm.Trigger(Triggers.TriggerC); //should not do anything rsm.Trigger(Triggers.TriggerB); //should not do anything rsm.Trigger(Triggers.TriggerA); /* * ReactiveStateMachine<Triggers, States> rsm2; * rsm2 = new ReactiveStateMachine<Triggers, States>(); * * rsm2.AddTransition(States.StateA, Triggers.TriggerB, States.StateB); * rsm2.AddTransition(States.StateB, Triggers.TriggerA, States.StateA); * * rsm2.OnEnter(States.StateA).Subscribe(e => Debug.Log(e + " OnEnter")); * rsm2.OnExit(States.StateA).Subscribe(e => Debug.Log(e + " OnExit")); * * rsm2.OnEnter(States.StateB).Subscribe(e => Debug.Log(e + " OnEnter")); * rsm2.OnExit(States.StateB).Subscribe(e => Debug.Log(e + " OnExit")); * * rsm2.Start(States.StateB); * * rsm2.Trigger(Triggers.TriggerA); * rsm2.Trigger(Triggers.TriggerB); * rsm2.Trigger(Triggers.TriggerC); //should not do anything * rsm2.Trigger(Triggers.TriggerB); //should not do anything * rsm2.Trigger(Triggers.TriggerA); */ }