From a087b99192679a813522928cf8e12189d356389c Mon Sep 17 00:00:00 2001 From: John Vanderbeck Date: Wed, 7 Jan 2015 16:24:09 -0800 Subject: [PATCH] Major updates to Master Status Display window --- .../TestFlightCore/TestFlightWindow.cs | 419 +++++++++++++----- 1 file changed, 316 insertions(+), 103 deletions(-) diff --git a/TestFlightCore/TestFlightCore/TestFlightWindow.cs b/TestFlightCore/TestFlightCore/TestFlightWindow.cs index c00adddd..0f2a135c 100644 --- a/TestFlightCore/TestFlightCore/TestFlightWindow.cs +++ b/TestFlightCore/TestFlightCore/TestFlightWindow.cs @@ -12,12 +12,15 @@ namespace TestFlightCore [KSPAddon(KSPAddon.Startup.EveryScene, false)] public class TestFlightWindow : MonoBehaviourWindowPlus { - private TestFlightManagerScenario tfScenario; + internal TestFlightManagerScenario tfScenario; private ApplicationLauncherButton appLauncherButton; + private TestFlightHUD hud; private bool stickyWindow; - private Settings settings = null; + internal Settings settings = null; + private int lastPartCount = 0; + private string[] guiSizes = { "Small", "Normal", "Large" }; - private DropDownList ddlCurrentView = null; + private DropDownList ddlSettingsPage = null; internal override void Start() { @@ -48,16 +51,50 @@ internal override void Start() settings.processAllVessels = false; settings.masterStatusUpdateFrequency = 10; settings.displaySettingsWindow = true; + + settings.showFailedPartsOnlyInMSD = false; + settings.showFlightDataInMSD = true; + settings.showMomentaryReliabilityInMSD = false; + settings.showRestingReliabilityInMSD = true; + settings.showStatusTextInMSD = true; + settings.shortenPartNameInMSD = false; + settings.settingsPage = 0; + settings.mainWindowLocked = true; + settings.mainWindowPosition = new Rect(0, 0, 0, 0); + settings.currentMSDSize = 1; + + settings.flightHUDEnabled = false; + settings.flightHUDPosition = new Rect(0, 0, 0, 0); + settings.Save(); } settings.Load(); StartCoroutine("AddToToolbar"); - // Start up our UI Update worker - StartRepeatingWorker(2); TestFlight.Resources.LoadTextures(); + + if (HighLogic.LoadedSceneIsFlight && settings.enableHUD && hud == null) + { + hud = gameObject.AddComponent(typeof(TestFlightHUD)) as TestFlightHUD; + if (hud != null) + { + LogFormatted_DebugOnly("Starting up TestFlightHUD"); + hud.Startup(this); + } + GameEvents.onGameSceneLoadRequested.Add(Event_OnGameSceneLoadRequested); + } base.Start(); } + public void Event_OnGameSceneLoadRequested(GameScenes scene) + { + LogFormatted_DebugOnly("Destroying Flight HUD"); + hud.Shutdown(); + Destroy(hud); + hud = null; + LogFormatted_DebugOnly("Unhooking event"); + GameEvents.onGameSceneLoadRequested.Remove(Event_OnGameSceneLoadRequested); + } + internal override void Awake() { base.Awake(); @@ -67,47 +104,64 @@ internal override void OnGUIOnceOnly() { Styles.InitStyles(); Styles.InitSkins(); - SkinsLibrary.SetCurrent("Unity"); + SkinsLibrary.SetCurrent("SolarizedDark"); // Default position and size -- will get proper bounds calculated when needed WindowRect = new Rect(0, 50, 500, 50); - DragEnabled = true; + DragEnabled = !settings.mainWindowLocked; ClampToScreen = true; TooltipsEnabled = true; - WindowCaption = "TestFlight Master Status Display"; + TooltipMouseOffset = new Vector2d(10, 10); + TooltipStatic = true; + WindowCaption = ""; List views = new List() { - "Vessel Status", - "Settings" + "Visual Settings", + "Difficulty/Performance Settings" }; - ddlCurrentView = new DropDownList(views, this); - ddlManager.AddDDL(ddlCurrentView); - + ddlSettingsPage = new DropDownList(views, this); + ddlManager.AddDDL(ddlSettingsPage); + ddlSettingsPage.OnSelectionChanged += SettingsPage_OnSelectionChanged; + WindowMoveEventsEnabled = true; + onWindowMoveComplete += MainWindow_OnWindowMoveComplete; } internal void CalculateWindowBounds() { + LogFormatted_DebugOnly("Calculating Window Bounds"); if (appLauncherButton == null) return; if (tfScenario == null) return; - float windowWidth = 650f; + float windowWidth = 670f; + if (settings.shortenPartNameInMSD) + windowWidth -= 100f; + if (!settings.showFlightDataInMSD) + windowWidth -= 75f; + if (!settings.showMomentaryReliabilityInMSD) + windowWidth -= 75f; + if (!settings.showRestingReliabilityInMSD) + windowWidth -= 75f; + if (!settings.showStatusTextInMSD) + windowWidth -= 100f; + float left = Screen.width - windowWidth; - float windowHeight = 100f; + float windowHeight = 50f;; float top = 40f; - // Calculate height based on amount of parts - Dictionary masterStatus = tfScenario.GetMasterStatus(); + if (settings.currentMSDSize == 0) + windowHeight += 100f; + else if (settings.currentMSDSize == 1) + windowHeight += 200f; + else if (settings.currentMSDSize == 2) + windowHeight += 300f; - if (masterStatus != null && masterStatus.Count() > 0) - { - Guid currentVessel = masterStatus.First().Key; - windowHeight += masterStatus[currentVessel].allPartsStatus.Count() * 20f; - } - if (!ApplicationLauncher.Instance.IsPositionedAtTop) + if (settings.displaySettingsWindow) + windowHeight += 250f; + if (!settings.mainWindowLocked) { - top = Screen.height - windowHeight - 40f; + left = settings.mainWindowPosition.xMin; + top = settings.mainWindowPosition.yMin; } - WindowRect = new Rect(left, top, windowWidth, windowHeight); } @@ -134,7 +188,7 @@ IEnumerator AddToToolbar() HoverOutButton, null, null, - ApplicationLauncher.AppScenes.ALWAYS, + ApplicationLauncher.AppScenes.FLIGHT, iconTexture); ApplicationLauncher.Instance.AddOnHideCallback(HideButton); ApplicationLauncher.Instance.AddOnRepositionCallback(RepostionWindow); @@ -206,6 +260,7 @@ internal override void DrawWindow(Int32 id) if (masterStatus == null) { + GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.Label("TestFlight is starting up..."); if (GUILayout.Button(settingsButton, GUILayout.Width(38))) @@ -218,6 +273,7 @@ internal override void DrawWindow(Int32 id) } else if (masterStatus.Count() <= 0) { + GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.Label("TestFlight is not currently tracking any vessels"); if (GUILayout.Button(settingsButton, GUILayout.Width(38))) @@ -232,44 +288,87 @@ internal override void DrawWindow(Int32 id) { // Display information on active vessel Guid currentVessl = FlightGlobals.ActiveVessel.id; + if (settings.showFailedPartsOnlyInMSD) + { + if (masterStatus[currentVessl].allPartsStatus.Count(ps => ps.activeFailure != null) < lastPartCount) + { + lastPartCount = masterStatus[currentVessl].allPartsStatus.Count(ps => ps.activeFailure != null); + CalculateWindowBounds(); + } + } + else + { + if (masterStatus[currentVessl].allPartsStatus.Count < lastPartCount) + { + lastPartCount = masterStatus[currentVessl].allPartsStatus.Count; + CalculateWindowBounds(); + } + } + GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.Label("MSD for " + masterStatus[currentVessl].vesselName); GUILayout.EndHorizontal(); + settings.currentMSDScrollPosition = GUILayout.BeginScrollView(settings.currentMSDScrollPosition); foreach (PartStatus status in masterStatus[currentVessl].allPartsStatus) { // Display part data +// GUILayout.Label(String.Format("{0,50}", status.partName)); +// GUILayout.Label(String.Format("{0,7:F2}du", status.flightData)); +// GUILayout.Label(String.Format("{0,7:F2}%", status.reliability)); + if (settings.showFailedPartsOnlyInMSD && status.activeFailure == null) + continue; GUILayout.BeginHorizontal(); - GUILayout.Label(String.Format("{0,50}", status.partName)); - GUILayout.Label(String.Format("{0,7:F2}du", status.flightData)); - GUILayout.Label(String.Format("{0,7:F2}%", status.reliability)); - string goNoGo; - GUIStyle useStyle; - if (status.activeFailure != null) + string partDisplay; + // Part Name + string tooltip = status.repairRequirements; + if (settings.shortenPartNameInMSD) + GUILayout.Label(new GUIContent(status.partName, tooltip), GUILayout.Width(100)); + else + GUILayout.Label(new GUIContent(status.partName, tooltip), GUILayout.Width(200)); + GUILayout.Space(10); + // Flight Data + if (settings.showFlightDataInMSD) { - if (status.activeFailure.GetFailureDetails().severity == "major") - useStyle = Styles.textStyleCritical; - else - useStyle = Styles.textStyleWarning; - goNoGo = String.Format("{0,-25}", status.activeFailure.GetFailureDetails().failureTitle); + GUILayout.Label(String.Format("{0,-7:F2}du", status.flightData), GUILayout.Width(75)); + GUILayout.Space(10); } - else + // Resting Reliability + if (settings.showRestingReliabilityInMSD) { - useStyle = Styles.textStyleSafe; - goNoGo = String.Format("{0,-25}", "Status OK"); + GUILayout.Label(String.Format("{0,-5:F2}%R", status.reliability), GUILayout.Width(75)); + GUILayout.Space(10); + } + // Momentary Reliability + if (settings.showMomentaryReliabilityInMSD) + { + GUILayout.Label(String.Format("{0,-5:F2}%M", status.momentaryReliability), GUILayout.Width(75)); + GUILayout.Space(10); + } + // Part Status Text + if (settings.showStatusTextInMSD) + { + if (status.activeFailure == null) + partDisplay = String.Format("{0,-30}", "OK"); + else + { + if (status.activeFailure.GetFailureDetails().severity == "major") + partDisplay = String.Format("{0,-30}", status.activeFailure.GetFailureDetails().failureTitle); + else + partDisplay = String.Format("{0,-30}", status.activeFailure.GetFailureDetails().failureTitle); + } + GUILayout.Label(partDisplay, GUILayout.Width(100)); } - string tooltip = status.repairRequirements; - GUILayout.Label(new GUIContent(goNoGo, tooltip), useStyle); if (status.activeFailure != null) { - if (GUILayout.Button("R")) + if (GUILayout.Button("R", GUILayout.Width(38))) { // attempt repair bool repairSuccess = status.flightCore.AttemptRepair(); } } - GUILayout.EndHorizontal(); } + GUILayout.EndScrollView(); if (GUILayout.Button(settingsButton, GUILayout.Width(38))) { settings.displaySettingsWindow = !settings.displaySettingsWindow; @@ -281,79 +380,193 @@ internal override void DrawWindow(Int32 id) // Draw settings pane if opened if (settings.displaySettingsWindow) { - GUILayout.Space(5); - GUILayout.Label("", Styles.styleSeparatorH, GUILayout.Width(WindowRect.width - 15), GUILayout.Height(2)); + GUILayout.Space(15); + ddlSettingsPage.DrawButton(); - GUILayout.Label("GUI Settings"); - GUILayout.BeginHorizontal(); - if (DrawToggle(ref settings.enableHUD, "Enable HUD in Flight Scene", Styles.styleToggle)) + switch (settings.settingsPage) { - settings.Save(); - } - GUILayout.EndHorizontal(); + case 0: + GUILayout.BeginHorizontal(); + if (DrawToggle(ref settings.showFailedPartsOnlyInMSD, "Short Failed Parts Only", Styles.styleToggle)) + { + settings.Save(); + CalculateWindowBounds(); + } + GUILayout.EndHorizontal(); - GUILayout.BeginHorizontal(); - GUILayout.Label(new GUIContent("Master Status Update Frequency", "Sets how often the Master Status Display is updated.\nLower settings will make the MSD respond to vessel changes faster but at the possible cost of performance.")); - if (DrawHorizontalSlider(ref settings.masterStatusUpdateFrequency, 0, 30, GUILayout.Width(300))) - { - settings.Save(); - } - GUILayout.Label(String.Format("{0,5:f2}", settings.masterStatusUpdateFrequency)); - GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + if (DrawToggle(ref settings.shortenPartNameInMSD, "Short Part Names", Styles.styleToggle)) + { + settings.Save(); + CalculateWindowBounds(); + } + GUILayout.EndHorizontal(); - GUILayout.Label("Performance Settings"); - GUILayout.BeginHorizontal(); - GUILayout.Label(new GUIContent("Minimum Update Rate", "Define the time in seconds between updates to all parts.\nSetting this lower will ensure you always have up to date data, but might be a performance issue on large craft.\nIncrease this if you find it affecting performance")); - if (DrawHorizontalSlider(ref settings.minTimeBetweenDataPoll, 0, 10, GUILayout.Width(300))) - { - settings.Save(); - } - GUILayout.Label(String.Format("{0,5:f2}", settings.minTimeBetweenDataPoll)); - GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + if (DrawToggle(ref settings.showFlightDataInMSD, "Flight Data", Styles.styleToggle)) + { + settings.Save(); + CalculateWindowBounds(); + } + GUILayout.EndHorizontal(); - GUILayout.Label("Difficulty Settings"); - GUILayout.BeginHorizontal(); - GUILayout.Label(new GUIContent("MinimumTime Between Failure Checks", "Define the minimum time in seconds that the system will check all parts to see if any have failed.\nConsider this a difficulty slider of sorts, as the more often checks are done, the more often you can run into failures")); - if (DrawHorizontalSlider(ref settings.minTimeBetweenFailurePoll, 15, 120, GUILayout.Width(300))) - { - settings.Save(); - } - GUILayout.Label(String.Format("{0,5:f2}", settings.minTimeBetweenFailurePoll)); - GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + if (DrawToggle(ref settings.showRestingReliabilityInMSD, "Resting Reliability", Styles.styleToggle)) + { + settings.Save(); + CalculateWindowBounds(); + } + GUILayout.EndHorizontal(); - GUILayout.BeginHorizontal(); - GUILayout.Label(new GUIContent("Flight Data Multiplier", "Overall difficulty slider.\nIncrease to make all parts accumuate flight data faster. Decrease to make them accumulate flight data slower.\nA setting of 1 is normal rate")); - if (DrawHorizontalSlider(ref settings.flightDataMultiplier, 0.5, 2, GUILayout.Width(300))) - { - settings.Save(); - } - GUILayout.Label(String.Format("{0,5:f2}", settings.flightDataMultiplier)); - GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + if (DrawToggle(ref settings.showMomentaryReliabilityInMSD, "Momentary Reliability", Styles.styleToggle)) + { + settings.Save(); + CalculateWindowBounds(); + } + GUILayout.EndHorizontal(); - GUILayout.BeginHorizontal(); - GUILayout.Label(new GUIContent("Flight Data Engineer Multiplier", "Overall difficulty slider\nIncreases or decreases the bonus applied to the accumulation of flight data from having Engineers in your crew.\nA setting of 1 is normal difficulty.")); - if (DrawHorizontalSlider(ref settings.flightDataEngineerMultiplier, 0.5, 2, GUILayout.Width(300))) - { - settings.Save(); - } - GUILayout.Label(String.Format("{0,5:f2}", settings.flightDataEngineerMultiplier)); - GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + if (DrawToggle(ref settings.showStatusTextInMSD, "Part Status Text", Styles.styleToggle)) + { + settings.Save(); + CalculateWindowBounds(); + } + GUILayout.EndHorizontal(); - GUILayout.BeginHorizontal(); - GUILayout.Label(new GUIContent("Global Reliability Modifier", "Overall difficulty slider\nStraight modifier added to the final reliability calculation for a part.")); - if (DrawHorizontalSlider(ref settings.globalReliabilityModifier, -25, 25, GUILayout.Width(300))) - { - settings.Save(); + GUILayout.BeginHorizontal(); + if (DrawToggle(ref settings.mainWindowLocked, "Lock MSD Position", Styles.styleToggle)) + { + if (settings.mainWindowLocked) + { + settings.mainWindowLocked = true; + CalculateWindowBounds(); + settings.mainWindowPosition = WindowRect; + DragEnabled = false; + } + else + { + DragEnabled = true; + } + settings.Save(); + } + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + GUILayout.Label("MSD Size", GUILayout.Width(200)); + settings.currentMSDSize = GUILayout.Toolbar(settings.currentMSDSize,guiSizes); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + if (DrawToggle(ref settings.enableHUD, "Enable Flight HUD", Styles.styleToggle)) + { + settings.Save(); + if (settings.enableHUD) + { + hud = gameObject.AddComponent(typeof(TestFlightHUD)) as TestFlightHUD; + if (hud != null) + { + LogFormatted_DebugOnly("Starting up Flight HUD"); + hud.Startup(this); + } + GameEvents.onGameSceneLoadRequested.Add(Event_OnGameSceneLoadRequested); + } + else + { + LogFormatted_DebugOnly("Destroying Flight HUD"); + hud.Shutdown(); + Destroy(hud); + hud = null; + GameEvents.onGameSceneLoadRequested.Remove(Event_OnGameSceneLoadRequested); + } + } + GUILayout.EndHorizontal(); + break; + case 1: + GUILayout.BeginHorizontal(); + GUILayout.Label(new GUIContent("Minimum Update Rate", + "Define the time in seconds between updates to all parts.\n" + + "Setting this lower will ensure you always have up to date data, but might be a performance issue on large craft.\n" + + "Increase this if you find it affecting performance"), + GUILayout.Width(200) + ); + if (DrawHorizontalSlider(ref settings.minTimeBetweenDataPoll, 0, 10, GUILayout.Width(150))) + { + settings.Save(); + } + GUILayout.Label(String.Format("{0,5:f2}", settings.minTimeBetweenDataPoll), GUILayout.Width(75)); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + GUILayout.Label(new GUIContent("Minimum Time Between Failure Checks", + "Define the minimum time in seconds that the system will check all parts to see if any have failed.\n" + + "Consider this a difficulty slider of sorts, as the more often checks are done, the more often you can run into failures"), + GUILayout.Width(200) + ); + if (DrawHorizontalSlider(ref settings.minTimeBetweenFailurePoll, 15, 120, GUILayout.Width(150))) + { + settings.Save(); + } + GUILayout.Label(String.Format("{0,5:f2}", settings.minTimeBetweenFailurePoll), GUILayout.Width(75)); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + GUILayout.Label(new GUIContent("Flight Data Multiplier", "Overall difficulty slider.\n" + + "Increase to make all parts accumuate flight data faster. Decrease to make them accumulate flight data slower.\n" + + "A setting of 1 is normal rate"), + GUILayout.Width(200) + ); + if (DrawHorizontalSlider(ref settings.flightDataMultiplier, 0.5, 2, GUILayout.Width(150))) + { + settings.Save(); + } + GUILayout.Label(String.Format("{0,5:f2}", settings.flightDataMultiplier), GUILayout.Width(75)); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + GUILayout.Label(new GUIContent("Flight Data Engineer Multiplier", "Overall difficulty slider\n" + + "Increases or decreases the bonus applied to the accumulation of flight data from having Engineers in your crew.\n" + + "A setting of 1 is normal difficulty."), + GUILayout.Width(200) + ); + if (DrawHorizontalSlider(ref settings.flightDataEngineerMultiplier, 0.5, 2, GUILayout.Width(150))) + { + settings.Save(); + } + GUILayout.Label(String.Format("{0,5:f2}", settings.flightDataEngineerMultiplier), GUILayout.Width(75)); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(); + GUILayout.Label(new GUIContent("Global Reliability Modifier", "Overall difficulty slider\n"+ + "Straight modifier added to the final reliability calculation for a part."), + GUILayout.Width(200) + ); + if (DrawHorizontalSlider(ref settings.globalReliabilityModifier, -25, 25, GUILayout.Width(150))) + { + settings.Save(); + } + GUILayout.Label(String.Format("{0,5:f2}", settings.globalReliabilityModifier), GUILayout.Width(75)); + GUILayout.EndHorizontal(); + break; } - GUILayout.Label(String.Format("{0,5:f2}", settings.globalReliabilityModifier)); - GUILayout.EndHorizontal(); - } + } + GUILayout.Space(10); GUILayout.EndVertical(); + if (GUI.changed) + CalculateWindowBounds(); } - void ViewSelection_OnSelectionChanged(MonoBehaviourWindowPlus.DropDownList sender, int oldIndex, int newIndex) + // GUI EVent Handlers + void SettingsPage_OnSelectionChanged(MonoBehaviourWindowPlus.DropDownList sender, int oldIndex, int newIndex) + { + settings.settingsPage = newIndex; + settings.Save(); + } + void MainWindow_OnWindowMoveComplete(MonoBehaviourWindow sender) { + settings.mainWindowPosition = WindowRect; + settings.Save(); } } }