VOID_CareerStatus: Pretty much works, complete with icons.
[VOID.git] / VOID_CareerStatus.cs
blob:a/VOID_CareerStatus.cs -> blob:b/VOID_CareerStatus.cs
--- a/VOID_CareerStatus.cs
+++ b/VOID_CareerStatus.cs
@@ -34,6 +34,7 @@
 
 namespace VOID
 {
+	[VOID_Scenes(GameScenes.FLIGHT, GameScenes.EDITOR, GameScenes.SPACECENTER)]
 	public class VOID_CareerStatus : VOID_WindowModule
 	{
 		public static VOID_CareerStatus Instance
@@ -67,34 +68,24 @@
 		private GUIContent repContent;
 		private GUIContent scienceContent;
 
-		public Texture2D fundsIconGreen
-		{
-			get;
-			private set;
-		}
-
-		public Texture2D fundsIconRed
-		{
-			get;
-			private set;
-		}
-
-		public Texture2D reputationIconGreen
-		{
-			get;
-			private set;
-		}
-
-		public Texture2D reputationIconRed
-		{
-			get;
-			private set;
-		}
-
-		public Texture2D scienceIcon
-		{
-			get;
-			private set;
+		#pragma warning disable 0414
+		private Texture2D fundsIconGreen;
+		private Texture2D fundsIconRed;
+		private Texture2D reputationIconGreen;
+		private Texture2D reputationIconRed;
+		private Texture2D scienceIcon;
+		#pragma warning restore 0414
+
+		public override bool toggleActive
+		{
+			get
+			{
+				return base.toggleActive && this.inValidGame;
+			}
+			set
+			{
+				base.toggleActive = this.inValidGame && value;
+			}
 		}
 
 		public double lastFundsChange
@@ -131,6 +122,54 @@
 		{
 			get;
 			private set;
+		}
+
+		private bool inValidGame
+		{
+			get
+			{
+				switch (HighLogic.CurrentGame.Mode)
+				{
+					case Game.Modes.CAREER:
+					case Game.Modes.SCIENCE_SANDBOX:
+						return true;
+					default:
+						return false;
+				}
+			}
+		}
+
+		private bool currenciesInitialized
+		{
+			get
+			{
+				Tools.PostDebugMessage(
+					this,
+					"Checking init state:" +
+					"\n\tcurrentFunds={0}" +
+					"\n\tcurrentScience={1}" +
+					"\n\tcurrentReputation={2}",
+					this.currentFunds,
+					this.currentScience,
+					this.currentReputation
+				);
+
+				return !(
+					double.IsNaN(this.currentFunds) ||
+					float.IsNaN(this.currentScience) ||
+					float.IsNaN(this.currentReputation)
+				);
+			}
+		}
+
+		public override void DrawGUI()
+		{
+			if (Event.current.type != EventType.Layout && !this.currenciesInitialized)
+			{
+				this.initCurrencies();
+			}
+
+			base.DrawGUI();
 		}
 
 		public override void ModuleWindow(int _)
@@ -141,21 +180,21 @@
 			GUILayout.Label(VOID_Data.fundingStatus.Label);
 			GUILayout.FlexibleSpace();
 			this.fundsContent.text = VOID_Data.fundingStatus.Value;
-			GUILayout.Label(this.fundsContent, GUILayout.ExpandWidth(false));
+			GUILayout.Label(this.fundsContent, GUILayout.ExpandWidth(true));
 			GUILayout.EndHorizontal();
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(VOID_Data.reputationStatus.Label);
 			GUILayout.FlexibleSpace();
 			this.repContent.text = VOID_Data.reputationStatus.Value;
-			GUILayout.Label(this.repContent, GUILayout.ExpandWidth(false));
+			GUILayout.Label(this.repContent, GUILayout.ExpandWidth(true));
 			GUILayout.EndHorizontal();
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
 			GUILayout.Label(VOID_Data.scienceStatus.Label);
 			GUILayout.FlexibleSpace();
 			this.scienceContent.text = VOID_Data.scienceStatus.Value;
-			GUILayout.Label(this.scienceContent, GUILayout.ExpandWidth(false));
+			GUILayout.Label(this.scienceContent, GUILayout.ExpandWidth(true));
 			GUILayout.EndHorizontal();
 
 			GUILayout.EndVertical();
@@ -163,22 +202,42 @@
 			GUI.DragWindow();
 		}
 
-		private void onFundsChange(double newValue)
+		// TODO: Update event handlers to do something useful with the new "reasons" parameter.
+		private void onFundsChange(double newValue, TransactionReasons reasons)
 		{
 			this.lastFundsChange = newValue - this.currentFunds;
 			this.currentFunds = newValue;
 		}
 
-		private void onRepChange(float newValue)
+		private void onRepChange(float newValue, TransactionReasons reasons)
 		{
 			this.lastRepChange = newValue - this.currentReputation;
 			this.currentReputation = newValue;
 		}
 
-		private void onScienceChange(float newValue)
+		private void onScienceChange(float newValue, TransactionReasons reasons)
 		{
 			this.lastScienceChange = newValue - this.currentScience;
 			this.currentScience = newValue;
+		}
+
+		private void initCurrencies()
+		{
+			Tools.PostDebugMessage(
+				this,
+				"Initializing currencies." +
+				"\n\tFunding.Instance={0}" +
+				"ResearchAndDevelopment.Instance={1}" +
+				"Reputation.Instance={2}",
+				Funding.Instance == null ? "NULL" : Funding.Instance.ToString(),
+				ResearchAndDevelopment.Instance == null ? "NULL" : ResearchAndDevelopment.Instance.ToString(),
+				Reputation.Instance == null ? "NULL" : Reputation.Instance.ToString()
+			);
+
+			this.currentFunds = Funding.Instance != null ? Funding.Instance.Funds : double.NaN;
+			this.currentReputation = Reputation.Instance != null ? Reputation.Instance.reputation : float.NaN;
+			this.currentScience = ResearchAndDevelopment.Instance != null ?
+				ResearchAndDevelopment.Instance.Science : float.NaN;
 		}
 
 		/*
@@ -192,39 +251,34 @@
 		{
 			VOID_CareerStatus.Instance = this;
 
-			this._Name = "Career Status";
+			this.Name = "Career Status";
 
 			GameEvents.OnFundsChanged.Add(this.onFundsChange);
 			GameEvents.OnReputationChanged.Add(this.onRepChange);
 			GameEvents.OnScienceChanged.Add(this.onScienceChange);
 
-			string texturePath = string.Format(
-				"{0}/../Textures/",
-				System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
-			);
-
-			this.fundsIconGreen = new Texture2D(10, 18);
-			this.fundsIconGreen.LoadImage(System.IO.File.ReadAllBytes(texturePath + "fundsgreen.png"));
-
-			this.fundsIconRed = new Texture2D(10, 18);
-			this.fundsIconRed.LoadImage(System.IO.File.ReadAllBytes(texturePath + "fundsred.png"));
-
-			this.reputationIconGreen = new Texture2D(16, 18);
-			this.reputationIconGreen.LoadImage(System.IO.File.ReadAllBytes(texturePath + "repgreen.png"));
-
-			this.reputationIconRed = new Texture2D(16, 18);
-			this.reputationIconRed.LoadImage(System.IO.File.ReadAllBytes(texturePath + "repred.png"));
-
-			this.scienceIcon = new Texture2D(16, 18);
-			this.scienceIcon.LoadImage(System.IO.File.ReadAllBytes(texturePath + "science.png"));
-
-			this.fundsContent = new GUIContent(this.fundsIconGreen);
-			this.repContent = new GUIContent(this.reputationIconGreen);
-			this.scienceContent = new GUIContent(this.scienceIcon);
-
-			this.currentFunds = Funding.Instance.Funds;
-			this.currentReputation = Reputation.Instance.reputation;
-			this.currentScience = ResearchAndDevelopment.Instance.Science;
+			bool texturesLoaded;
+
+			texturesLoaded = IOTools.LoadTexture(out this.fundsIconGreen, "VOID/Textures/fundsgreen.png", 10, 18);
+			texturesLoaded &= IOTools.LoadTexture(out this.fundsIconRed, "VOID/Textures/fundsred.png", 10, 18);
+			texturesLoaded &= IOTools.LoadTexture(out this.reputationIconGreen, "VOID/Textures/repgreen.png", 16, 18);
+			texturesLoaded &= IOTools.LoadTexture(out this.reputationIconRed, "VOID/Textures/repred.png", 16, 18);
+			texturesLoaded &= IOTools.LoadTexture(out this.scienceIcon, "VOID/Textures/science.png", 16, 18);
+
+			this.fundsContent = new GUIContent();
+			this.repContent = new GUIContent();
+			this.scienceContent = new GUIContent();
+
+			if (texturesLoaded)
+			{
+				this.fundsContent.image = this.fundsIconGreen;
+				this.repContent.image = this.reputationIconGreen;
+				this.scienceContent.image = this.scienceIcon;
+			}
+
+			this.currentFunds = double.NaN;
+			this.currentScience = float.NaN;
+			this.currentReputation = float.NaN;
 		}
 
 		~VOID_CareerStatus()
@@ -236,57 +290,6 @@
 			VOID_CareerStatus.Instance = null;
 		}
 	}
-
-	public static partial class VOID_Data
-	{
-		public static readonly VOID_StrValue fundingStatus = new VOID_StrValue(
-			string.Intern("Funds"),
-			delegate()
-		{
-			if (VOID_CareerStatus.Instance == null)
-			{
-				return string.Empty;
-			}
-
-			return string.Format("{0} ({1})",
-				VOID_CareerStatus.Instance.currentFunds.ToString("#,#.##"),
-				VOID_CareerStatus.formatDelta(VOID_CareerStatus.Instance.lastFundsChange)
-			);
-		}
-		);
-
-		public static readonly VOID_StrValue reputationStatus = new VOID_StrValue(
-			string.Intern("Reputation"),
-			delegate()
-		{
-			if (VOID_CareerStatus.Instance == null)
-			{
-				return string.Empty;
-			}
-
-			return string.Format("{0} ({1})",
-				VOID_CareerStatus.Instance.currentReputation.ToString("#,#.##"),
-				VOID_CareerStatus.formatDelta(VOID_CareerStatus.Instance.lastRepChange)
-			);
-		}
-		);
-
-		public static readonly VOID_StrValue scienceStatus = new VOID_StrValue(
-			string.Intern("Science"),
-			delegate()
-		{
-			if (VOID_CareerStatus.Instance == null)
-			{
-				return string.Empty;
-			}
-
-			return string.Format("{0} ({1})",
-				VOID_CareerStatus.Instance.currentScience.ToString("#,#.##"),
-				VOID_CareerStatus.formatDelta(VOID_CareerStatus.Instance.lastScienceChange)
-			);
-		}
-		);
-	}
 }