/// <summary> /// Handles the signaller selecting a signal. /// </summary> /// <param name="signal">The selected signal.</param> public async void SelectSignal(World.Signal signal) { if (PendingEntrance != null) { ControlledSignal entrance = PendingEntrance; PendingEntrance = null; Route route; if (entrance.RoutesFrom.TryGetValue(signal, out route)) { if (route.Available) { await route.CallAsync(); } else { AddMessage(Message.EType.Miscellaneous, "Route not available", false); } } else { AddMessage(Message.EType.Miscellaneous, "No route between selected signals", false); } } else { ControlledSignal cs = signal as ControlledSignal; if (cs != null) { PendingEntrance = cs; } } }
/// <summary> /// Finishes initialization of this object. /// </summary> /// <param name="sender">This object.</param> /// <param name="e">Details of the event.</param> private void OnLoaded(object sender, EventArgs e) { MainViewModel vm = DataContext as MainViewModel; if (vm != null) { SignalObject = vm.World.Region.SubAreas[SubAreaID].Signals[SignalID]; } InitUI(); }
/// <summary> /// Handles the signaller asking to flag by a signal or cancel flag-by mode. /// </summary> /// <param name="signal">The signal.</param> public async void FlagBySignal(World.Signal signal) { ControlledSignal cs = signal as ControlledSignal; if (cs != null) { if (cs.CurrentRoute == null) { await cs.EnableFlagByAsync(); } } }
/// <summary> /// Constructs a new SignalHead. /// </summary> /// <param name="signal">Which signal this head is part of.</param> /// <param name="head">Which position this head is in, counting from the top.</param> /// <param name="blinkClockSource">The source of the blinking clock.</param> public SignalHead(World.Signal signal, byte head, BlinkClockSource blinkClockSource) { InitializeComponent(); SignalObject = signal; if (SignalObject != null) { SignalObject.PropertyChanged += OnSignalPropChanged; } Head = head; BlinkClockSource = blinkClockSource; UpdateColour(); }
/// <summary> /// Handles the signaller cancelling a signal. /// </summary> /// <param name="signal">The signal.</param> public async void CancelSignal(World.Signal signal) { if (PendingEntrance == signal) { PendingEntrance = null; } else { ControlledSignal cs = signal as ControlledSignal; if (cs != null) { await cs.CancelAsync(); } } }
/// <summary> /// Initializes this stem. /// </summary> /// <param name="signal">The signal.</param> public void Init(World.Signal signal) { ControlledSignal cs = signal as ControlledSignal; if (cs != null) { signal.PropertyChanged += OnSignalPropChanged; StemPath.Data = (PathGeometry)FindResource("SignalStemControlled"); } else { StemPath.Data = (PathGeometry)FindResource("SignalStemAutomatic"); } UpdateRectangles(signal); }
/// <summary> /// Updates the colour of the stem and presence or absence of the automatic crossbar. /// </summary> /// <param name="signal">The signal.</param> private void UpdateRectangles(World.Signal signal) { ControlledSignal cs = signal as ControlledSignal; bool hasRoute; if (cs != null) { hasRoute = cs.CurrentRoute != null; } else { hasRoute = false; } Brush brush = (Brush)FindResource(hasRoute ? "LockedWhite" : "IdleGrey"); StemPath.Fill = brush; }
/// <summary> /// Finishes initialization of this object. /// </summary> /// <param name="sender">This object.</param> /// <param name="e">Details of the event.</param> private void OnLoaded(object sender, EventArgs e) { MainViewModel vm = DataContext as MainViewModel; if (vm != null) { // You can't populate both PointPositions and Routes. Debug.Assert((PointPositions == null) || (PointPositions.Count == 0) || (Routes == null) || (Routes.Count == 0)); if (TrackCircuitID >= 0) { TrackCircuit = vm.World.Region.SubAreas[SubAreaID].TrackCircuits[TrackCircuitID]; TrackCircuit.PropertyChanged += OnTCPropChanged; } PointPositionsResolved = new SectionPointPositionResolved[PointPositions.Count]; for (int i = 0; i != PointPositions.Count; ++i) { SectionPointPosition p = PointPositions[i]; PointPositionsResolved[i].Points = vm.World.Region.SubAreas[SubAreaID].PowerPoints[p.Points]; PointPositionsResolved[i].Reversed = p.Reversed; PointPositionsResolved[i].Points.PropertyChanged += OnConditionalPointsPropChanged; } PointPositions = null; RoutesResolved = new Route[Routes.Count]; for (int i = 0; i != Routes.Count; ++i) { ControlledSignal entrance = (ControlledSignal)vm.World.Region.GetSignal(Routes[i].Entrance, SubAreaID); World.Signal exit = vm.World.Region.GetSignal(Routes[i].Exit, SubAreaID); RoutesResolved[i] = entrance.RoutesFrom[exit]; } Routes = null; if (BlinkForSignal.HasValue) { BlinkForSignalResolved = vm.World.Region.SubAreas[SubAreaID].Signals[BlinkForSignal.Value]; vm.PropertyChanged += OnVMPropChanged; } } Update(); }