diff --git a/src/RealAntennasProject/RACommNetScenario.cs b/src/RealAntennasProject/RACommNetScenario.cs index 9dae68e..a685568 100644 --- a/src/RealAntennasProject/RACommNetScenario.cs +++ b/src/RealAntennasProject/RACommNetScenario.cs @@ -53,6 +53,7 @@ public override void OnAwake() DestroyNetwork(); Debug.Log($"{ModTag} Ignore CommNetScenario ERR immediately after Homes rebuild logging."); } + Targeting.TextureTools.Initialize(); MapSettings = new MapUI.Settings(); RebuildHomes(); if (CommNetEnabled) // Don't self-delete if we are not enabled. @@ -64,6 +65,7 @@ public override void OnLoad(ConfigNode gameNode) base.OnLoad(gameNode); if (gameNode.HasNode("MapUISettings")) ConfigNode.LoadObjectFromConfig(MapSettings, gameNode.GetNode("MapUISettings")); + Targeting.TextureTools.Load(gameNode); } public override void OnSave(ConfigNode gameNode) @@ -72,6 +74,7 @@ public override void OnSave(ConfigNode gameNode) var node = ConfigNode.CreateConfigFromObject(MapSettings); node.name = "MapUISettings"; gameNode.AddNode(node); + Targeting.TextureTools.Save(gameNode); } private System.Collections.IEnumerator NotifyDisabled() @@ -135,6 +138,8 @@ private void BuildHomes() if (KopernicusNode != null) { + var sb = StringBuilderCache.Acquire(); + sb.Append($"{ModTag} Building homes: "); foreach (ConfigNode bodyNode in KopernicusNode.GetNodes("Body")) { string t = bodyNode.GetValue("name"); @@ -149,11 +154,13 @@ private void BuildHomes() bool result = false; if (cityNode.TryGetValue("RACommNetStation", ref result) && result) { - BuildHome(cityNode, body); + CommNetHome h = BuildHome(cityNode, body); + sb.Append($"{h.nodeName} "); } } } } + Debug.Log(sb.ToStringAndRelease()); } } @@ -163,20 +170,20 @@ private void UnloadHomes() logger.Append($"{ModTag} Unloaded the following homes: "); foreach (CommNetHome home in FindObjectsOfType()) { - logger.Append($"{home} "); + logger.Append($"{home.nodeName} "); DestroyImmediate(home); } GroundStations.Clear(); Debug.Log(logger.ToStringAndRelease()); } - private void BuildHome(ConfigNode node, CelestialBody body) + private CommNetHome BuildHome(ConfigNode node, CelestialBody body) { GameObject newHome = new GameObject(body.name); Network.RACommNetHome home = newHome.AddComponent(); home.Configure(node, body); if (!GroundStations.ContainsKey(home.nodeName)) GroundStations.Add(home.nodeName, home); - Debug.Log($"{ModTag} Built: {home.name} {home.nodeName}"); + return home; } } } \ No newline at end of file diff --git a/src/RealAntennasProject/Targeting/AntennaTargetGUI.cs b/src/RealAntennasProject/Targeting/AntennaTargetGUI.cs index 42baed4..61f2dc2 100644 --- a/src/RealAntennasProject/Targeting/AntennaTargetGUI.cs +++ b/src/RealAntennasProject/Targeting/AntennaTargetGUI.cs @@ -16,7 +16,6 @@ enum SortMode { Alphabetical, Distance, VesselType, ParentBody, RFBand }; private string sLat = "0", sLon = "0", sAlt = "0", sAzimuth = "0", sElevation = "0", sForward = "0"; float deflection = 0; private bool showTargetModeInfo = false; - private readonly Dictionary filters = new Dictionary(); public RealAntenna antenna { get; set; } @@ -26,7 +25,6 @@ public void Start() { vessels.Clear(); vessels.AddRange(FlightGlobals.Vessels); - TextureTools.Setup(filters, true); } public void OnGUI() @@ -68,10 +66,10 @@ void GUIDisplay(int windowID) if (targetMode.mode == TargetMode.Vessel) { GUILayout.BeginHorizontal(); - foreach (var category in TextureTools.categories) + foreach (var vType in TextureTools.vesselTypes) { - if (TextureTools.textures.ContainsKey(category)) - filters[category] = GUILayout.Toggle(filters[category], TextureTools.textures[category], HighLogic.Skin.button, GUILayout.Height(iconSize.y), GUILayout.Width(iconSize.x)); + if (TextureTools.filterTextures.TryGetValue(vType, out Texture2D tex)) + TextureTools.filterStates[vType] = GUILayout.Toggle(TextureTools.filterStates[vType], tex, HighLogic.Skin.button, GUILayout.Height(iconSize.y), GUILayout.Width(iconSize.x)); } GUILayout.EndHorizontal(); @@ -83,8 +81,7 @@ void GUIDisplay(int windowID) scrollVesselPos = GUILayout.BeginScrollView(scrollVesselPos, GUILayout.Height(200), GUILayout.ExpandWidth(true)); foreach (Vessel v in vessels) { - - if (filters.TryGetValue(TextureTools.GetKeyFromVesselType(v.vesselType), out bool show) + if (TextureTools.filterStates.TryGetValue(v.vesselType, out bool show) && show && GUILayout.Button(v.name)) { var x = new ConfigNode(AntennaTarget.nodeName); diff --git a/src/RealAntennasProject/Targeting/RemoteAntennaControlUI.cs b/src/RealAntennasProject/Targeting/RemoteAntennaControlUI.cs index 8fd02c0..1f71c24 100644 --- a/src/RealAntennasProject/Targeting/RemoteAntennaControlUI.cs +++ b/src/RealAntennasProject/Targeting/RemoteAntennaControlUI.cs @@ -12,13 +12,11 @@ class RemoteAntennaControlUI : MonoBehaviour private enum SortMode { Alphabetical, VesselType, ParentBody, RFBand }; private SortMode sourceSortMode = SortMode.Alphabetical; private readonly List sourceVessels = new List(); - private readonly Dictionary filters = new Dictionary(); public void Start() { sourceVessels.Clear(); sourceVessels.AddRange(FlightGlobals.Vessels.Where(v => v.Connection is RACommNetVessel && v.Connection.Comm is RACommNode)); - TextureTools.Setup(filters, true); } public void OnGUI() @@ -30,10 +28,10 @@ public void OnGUI() void GUIDisplay(int windowID) { GUILayout.BeginHorizontal(); - foreach (var category in TextureTools.categories) + foreach (var vType in TextureTools.vesselTypes) { - if (TextureTools.textures.ContainsKey(category)) - filters[category] = GUILayout.Toggle(filters[category], TextureTools.textures[category], HighLogic.Skin.button, GUILayout.Height(iconSize.y), GUILayout.Width(iconSize.x)); + if (TextureTools.filterTextures.TryGetValue(vType, out Texture2D tex)) + TextureTools.filterStates[vType] = GUILayout.Toggle(TextureTools.filterStates[vType], tex, HighLogic.Skin.button, GUILayout.Height(iconSize.y), GUILayout.Width(iconSize.x)); } GUILayout.EndHorizontal(); if (GUILayout.Button($"Sort Mode: {sourceSortMode}")) @@ -44,7 +42,7 @@ void GUIDisplay(int windowID) scrollSourcePos = GUILayout.BeginScrollView(scrollSourcePos, GUILayout.ExpandWidth(true)); foreach (var ra in from Vessel v in sourceVessels from RealAntenna ra in (v.Connection?.Comm as RACommNode)?.RAAntennaList - where filters[TextureTools.GetKeyFromVesselType(v.vesselType)] + where TextureTools.filterStates[v.vesselType] select ra) { GUILayout.BeginHorizontal(); diff --git a/src/RealAntennasProject/Targeting/TextureTools.cs b/src/RealAntennasProject/Targeting/TextureTools.cs index 50fcab7..42cd6f1 100644 --- a/src/RealAntennasProject/Targeting/TextureTools.cs +++ b/src/RealAntennasProject/Targeting/TextureTools.cs @@ -6,44 +6,62 @@ namespace RealAntennas.Targeting { public class TextureTools { - public static Dictionary textures = new Dictionary(); - public static List categories = new List(); + public static readonly List vesselTypes = new List(16) + { + VesselType.Debris, + VesselType.Probe, + VesselType.Rover, + VesselType.Lander, + VesselType.Ship, + VesselType.Station, + VesselType.Base, + VesselType.Plane, + VesselType.Relay, + VesselType.EVA, + VesselType.Flag, + VesselType.SpaceObject, + VesselType.Unknown, + VesselType.DeployedScienceController, + }; + public static readonly Dictionary filterTextures = new Dictionary(16); + public static readonly Dictionary filterStates = new Dictionary(16); public static void Initialize() { - if (categories.Count == 0) - { - categories.Add(GetKeyFromVesselType(VesselType.Debris)); - categories.Add(GetKeyFromVesselType(VesselType.Probe)); - categories.Add(GetKeyFromVesselType(VesselType.Rover)); - categories.Add(GetKeyFromVesselType(VesselType.Lander)); - categories.Add(GetKeyFromVesselType(VesselType.Ship)); - categories.Add(GetKeyFromVesselType(VesselType.Station)); - categories.Add(GetKeyFromVesselType(VesselType.Base)); - categories.Add(GetKeyFromVesselType(VesselType.Plane)); - categories.Add(GetKeyFromVesselType(VesselType.Relay)); - categories.Add(GetKeyFromVesselType(VesselType.EVA)); - categories.Add(GetKeyFromVesselType(VesselType.Flag)); - categories.Add(GetKeyFromVesselType(VesselType.SpaceObject)); - categories.Add(GetKeyFromVesselType(VesselType.Unknown)); - categories.Add(GetKeyFromVesselType(VesselType.DeployedScienceController)); - } - if (textures.Count == 0) - foreach (var t in Resources.FindObjectsOfTypeAll().Where(x => categories.Contains(x.name))) - textures[t.name] = TextureFromSprite(t); + var sprites = Resources.FindObjectsOfTypeAll(); + + if (filterTextures.Count == 0) + foreach (var t in vesselTypes) + { + string name = GetTextureNameFromVesselType(t); + if (sprites.FirstOrDefault(x => x.name == name) is Sprite s) + filterTextures[t] = TextureFromSprite(s); + } + + if (filterStates.Count == 0) + foreach (var t in filterTextures.Keys) + filterStates[t] = true; + } + + public static void Save(ConfigNode node) + { + ConfigNode n = new ConfigNode("FilterSettings"); + foreach (var vType in vesselTypes) + if (filterStates.TryGetValue(vType, out bool val)) + n.AddValue($"{vType}", val); + node.AddNode(n); } - public static void Setup(Dictionary filters = null, bool setDefaults = false) + public static void Load(ConfigNode node) { - Initialize(); - if (setDefaults && filters != null) + ConfigNode n = null; + if (node.TryGetNode("FilterSettings", ref n)) { - foreach (var c in TextureTools.categories) - filters.Add(c, false); - filters[GetKeyFromVesselType(VesselType.Probe)] = true; - filters[GetKeyFromVesselType(VesselType.Relay)] = true; - filters[GetKeyFromVesselType(VesselType.Station)] = true; - filters[GetKeyFromVesselType(VesselType.Ship)] = true; - filters[GetKeyFromVesselType(VesselType.Lander)] = true; + foreach (var vType in vesselTypes) + { + bool val = false; + if (n.TryGetValue($"{vType}", ref val)) + filterStates[vType] = val; + } } } @@ -97,7 +115,7 @@ public static Texture2D TextureFromSprite(Sprite sprite) return sprite.texture; } - public static string GetKeyFromVesselType(VesselType vesselType) + public static string GetTextureNameFromVesselType(VesselType vesselType) { return vesselType switch {