コード例 #1
0
ファイル: MainViewModel.cs プロジェクト: Hawk777/iecc8
 /// <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;
         }
     }
 }
コード例 #2
0
ファイル: MainViewModel.cs プロジェクト: Hawk777/iecc8
        /// <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();
                }
            }
        }
コード例 #3
0
        /// <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;
                }
            }
        }
コード例 #4
0
ファイル: MainViewModel.cs プロジェクト: Hawk777/iecc8
 /// <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();
         }
     }
 }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        /// <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;
        }
コード例 #7
0
        /// <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();
        }