/// <summary> /// Creates FSM ready to begin editing. Or recreates it when ESC is pressed /// and the tool is canceled. /// </summary> /// <returns>The new FSM in the initial state.</returns> private Util.GenericFsm <State, Trigger> InitFiniteStateMachine() { var fsm = new Util.GenericFsm <State, Trigger>(State.Select); // From Select mode, user can either click a segment, or Esc/rightclick to quit fsm.Configure(State.Select) .OnEntry(this.OnEnterSelectState) .OnLeave(this.OnLeaveSelectState) .TransitionOnEvent(Trigger.SegmentClick, State.EditLaneArrows) .TransitionOnEvent(Trigger.RightMouseClick, State.ToolDisabled) .TransitionOnEvent(Trigger.EscapeKey, State.ToolDisabled); fsm.Configure(State.EditLaneArrows) .OnEntry(this.OnEnterEditorState) .OnLeave(this.OnLeaveEditorState) .TransitionOnEvent(Trigger.SegmentClick, State.EditLaneArrows) .TransitionOnEvent(Trigger.RightMouseClick, State.Select); // This transition is ignored because Esc disables the tool // .TransitionOnEvent(Trigger.EscapeKey, State.Select); fsm.Configure(State.ToolDisabled) .OnEntry( () => { // We are done here, leave the tool. // This will result in this.DeactivateTool being called. // MainTool.SetToolMode(ToolMode.None); ModUI.Instance.MainMenu.ClickToolButton(ToolMode.LaneArrows); }); return(fsm); }
/// <summary>Cleans up when tool is deactivated or user switched to another tool.</summary> public override void DeactivateTool() { Log._Debug("LaneArrow: Deactivated tool"); DestroyToolWindow(); SelectedNodeId = 0; SelectedSegmentId = 0; fsm_ = null; }
public LaneArrowTool(TrafficManagerTool mainTool) : base(mainTool) { fsm_ = new Util.GenericFsm <State, Trigger>(State.Select); }
/// <summary>Resets tool into its initial state for new use.</summary> public override void ActivateTool() { Log._Debug("LaneArrow: Activated tool"); fsm_ = InitFiniteStateMachine(); this.OnEnterSelectState(); // FSM does not call enter on initial state }