示例#1
0
 /// <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
        /// <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();
        }
示例#3
0
        /// <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();
                }
            }
        }
示例#4
0
 /// <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();
 }
示例#5
0
 /// <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();
         }
     }
 }
示例#6
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);
        }
示例#7
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;
        }
示例#8
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();
        }