/// <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> /// 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> /// Updates the fill colour of the lamp based on the signal's aspect. /// </summary> private void UpdateColour() { EAspect aspect = (SignalObject != null) ? SignalObject.Aspects.AspectAt(Head) : EAspect.Red; ControlledSignal cs = SignalObject as ControlledSignal; bool approachLocked = (cs != null) ? cs.ApproachLocked : false; switch (aspect) { case EAspect.Red: if ((BlinkClockSource == null) || BlinkClockSource.Value || !approachLocked) { Lamp.Fill = (Brush)FindResource("SignalRed"); } else { Lamp.Fill = (Brush)FindResource("BG"); } break; case EAspect.Green: Lamp.Fill = (Brush)FindResource("SignalGreen"); break; case EAspect.Yellow: Lamp.Fill = (Brush)FindResource("SignalYellow"); break; case EAspect.FlashingYellow: if ((BlinkClockSource == null) || BlinkClockSource.Value) { Lamp.Fill = (Brush)FindResource("SignalYellow"); } else { Lamp.Fill = (Brush)FindResource("BG"); } break; case EAspect.Lunar: Lamp.Fill = (Brush)FindResource("SignalLunar"); break; } if (BlinkClockSource != null) { BlinkClockSource.PropertyChanged -= OnBlinkClockChanged; if ((aspect == EAspect.FlashingYellow) || approachLocked) { BlinkClockSource.PropertyChanged += OnBlinkClockChanged; } } }
/// <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(); }