using System; using System.Collections; using System.Collections.Generic; using System.Text; using RemoteTech.FlightComputer.Commands; using UnityEngine; namespace RemoteTech.UI { public class QueueFragment : IFragment { private readonly FlightComputer.FlightComputer mFlightComputer; private Vector2 mScrollPosition; private String mExtraDelay; private double Delay { get { return RTUtil.TryParseDuration(mExtraDelay); } set { mExtraDelay = value.ToString(); } } private GUIContent Status { get { var tooltip = new List(); var status = new List(); if ((mFlightComputer.Status & FlightComputer.FlightComputer.State.NoConnection) == FlightComputer.FlightComputer.State.NoConnection) { status.Add("Connection Error"); tooltip.Add("Cannot queue commands"); } if ((mFlightComputer.Status & FlightComputer.FlightComputer.State.OutOfPower) == FlightComputer.FlightComputer.State.OutOfPower) { status.Add("Out of Power"); tooltip.Add("Commands can be missed"); tooltip.Add("Timers halt"); } if ((mFlightComputer.Status & FlightComputer.FlightComputer.State.NotMaster) == FlightComputer.FlightComputer.State.NotMaster) { status.Add("Slave"); tooltip.Add("Has no control"); } if ((mFlightComputer.Status & FlightComputer.FlightComputer.State.Packed) == FlightComputer.FlightComputer.State.Packed) { status.Add("Packed"); tooltip.Add("Frozen"); } if (mFlightComputer.Status == FlightComputer.FlightComputer.State.Normal) { status.Add("All systems nominal"); tooltip.Add("None"); } return new GUIContent("Status: " + String.Join(", ", status.ToArray()) + ".", "Effects: " + String.Join("; ", tooltip.ToArray()) + "."); } } public QueueFragment(FlightComputer.FlightComputer fc) { mFlightComputer = fc; Delay = 0; } public void Draw() { if (Event.current.Equals(Event.KeyboardEvent("return")) && GUI.GetNameOfFocusedControl() == "rt_xd") { RTCore.Instance.StartCoroutine(onClickAddExtraDelay()); } GUILayout.BeginVertical(); { mScrollPosition = GUILayout.BeginScrollView(mScrollPosition, GUILayout.Width(250)); { { GUILayout.BeginHorizontal(GUI.skin.box); { var s = new StringBuilder(); foreach (var c in mFlightComputer.ActiveCommands) { s.Append(c.Description); } GUILayout.Label(s.ToString().TrimEnd(Environment.NewLine.ToCharArray())); GUILayout.FlexibleSpace(); RTUtil.Button("x", () => RTCore.Instance.StartCoroutine(OnClickReset()), GUILayout.Width(21), GUILayout.Height(21)); } GUILayout.EndHorizontal(); foreach (var c in mFlightComputer.QueuedCommands) { GUILayout.BeginHorizontal(GUI.skin.box); { GUILayout.Label(c.Description); GUILayout.FlexibleSpace(); GUILayout.BeginVertical(); { RTUtil.Button("x", () => RTCore.Instance.StartCoroutine(OnClickCancel(c)), GUILayout.Width(21), GUILayout.Height(21)); RTUtil.Button(new GUIContent("v", string.Format("Set the signal delay right after this - Current: {0}", RTUtil.FormatDuration(c.Delay + c.ExtraDelay + getBurnTime(c), false))), () => RTCore.Instance.StartCoroutine(onClickAddExtraDelayFromQueuedCommand(c)), GUILayout.Width(21), GUILayout.Height(21)); } GUILayout.EndVertical(); } GUILayout.EndHorizontal(); } } } GUILayout.EndScrollView(); GUILayout.Label(Status); GUILayout.BeginHorizontal(); { GUILayout.Label(new GUIContent("Delay (+ signal): " + RTUtil.FormatDuration(mFlightComputer.TotalDelay), "Total delay including signal delay.")); GUILayout.FlexibleSpace(); GUI.SetNextControlName("rt_xd"); RTUtil.TextField(ref mExtraDelay, GUILayout.Width(45)); RTUtil.Button(new GUIContent(">", "Add extra signal delay - Example: 125, 125s, 5m20s, 1d6h20m10s"), () => RTCore.Instance.StartCoroutine(onClickAddExtraDelay()), GUILayout.Width(21), GUILayout.Height(21)); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); } public IEnumerator onClickAddExtraDelay() { yield return null; mFlightComputer.TotalDelay = Delay; } public IEnumerator onClickAddExtraDelayFromQueuedCommand(ICommand c) { yield return null; mExtraDelay = RTUtil.FormatDuration(c.Delay + c.ExtraDelay + getBurnTime(c), false); RTCore.Instance.StartCoroutine(onClickAddExtraDelay()); } ///

/// Get the burn time from the ManeuverCommand or BurnCommand /// /// Current ocmmand /// Max burn time public double getBurnTime(ICommand c) { if (c is ManeuverCommand || c is BurnCommand) { double burnTime = (c is ManeuverCommand) ? ((ManeuverCommand)c).getMaxBurnTime(mFlightComputer) : ((BurnCommand)c).getMaxBurnTime(mFlightComputer); return burnTime; } return 0; } public IEnumerator OnClickCancel(ICommand c) { yield return null; mFlightComputer.Enqueue(CancelCommand.WithCommand(c)); } public IEnumerator OnClickReset() { yield return null; mFlightComputer.Enqueue(CancelCommand.ResetActive()); } } }