From e42b5305aab3f491f5cbdd87edf07b1208ba2f9c Mon Sep 17 00:00:00 2001 From: Crzyrndm Date: Sat, 27 May 2017 16:40:46 +1200 Subject: [PATCH] All changes for KSP 1.3 release (v3.0.0) --- FE_Testing/FE_Test_Script.cs | 7 +- FilterExtension/CategoryInstance.cs | 25 ++++--- FilterExtension/ConfigNodes/CategoryNode.cs | 22 +++--- .../CheckNodes/CheckNodeFactory.cs | 2 +- .../ConfigNodes/SubCategoryItem.cs | 2 +- .../ConfigNodes/SubcategoryNode.cs | 9 +-- .../ConfigNodes/SubcategoryNodeModifier.cs | 8 ++- FilterExtension/Editor.cs | 47 ++++--------- FilterExtension/FilterExtensions.csproj | 10 +-- FilterExtension/LoadAndProcess.cs | 61 ++++------------- FilterExtension/Logger.cs | 63 ++++++++++++++++++ FilterExtension/Settings.cs | 15 ++--- FilterExtension/SubCategoryInstance.cs | 4 +- FilterExtension/Utility/Extensions.cs | 44 +++++++----- FilterExtension/Utility/PartType.cs | 16 ++--- .../000_FilterExtensions/FilterExtensions.dll | Bin 65024 -> 65024 bytes .../FilterExtensions.version | 2 +- Testing/FE_Testing.dll | Bin 10752 -> 10752 bytes 18 files changed, 181 insertions(+), 156 deletions(-) create mode 100644 FilterExtension/Logger.cs diff --git a/FE_Testing/FE_Test_Script.cs b/FE_Testing/FE_Test_Script.cs index 2f998d10..ebfe53f9 100644 --- a/FE_Testing/FE_Test_Script.cs +++ b/FE_Testing/FE_Test_Script.cs @@ -23,7 +23,10 @@ public void AddSubCat() Debug.Log("[FE_Testing Testing] Test subcat created"); PartCategorizer.AddCustomSubcategoryFilter( PartCategorizer.Instance.filters.Find(c => string.Equals(c.button.categoryName, "Filter by Function", StringComparison.OrdinalIgnoreCase)) - , "testing", new RUI.Icons.Selectable.Icon("abc", null, null, true), p => allowedParts.Contains(p.name)); + , "testing" + , Localizer.Format("testing") + , new RUI.Icons.Selectable.Icon("abc", null, null, true) + , p => allowedParts.Contains(p.name)); } } @@ -73,7 +76,7 @@ IEnumerator CheckTestSubcategories() { yield return new WaitForSeconds(5); // wait for the editor to complete startup - PartCategorizer.Category testCat = PartCategorizer.Instance.filters.FirstOrDefault(C => string.Equals(Localization.Format(C.button.categoryName), testCatName)); + PartCategorizer.Category testCat = PartCategorizer.Instance.filters.FirstOrDefault(C => string.Equals(Localizer.Format(C.button.categoryName), testCatName)); if (testCat == null) { LogTestResult($"Category named \"{testCatName}\" found", false); diff --git a/FilterExtension/CategoryInstance.cs b/FilterExtension/CategoryInstance.cs index 3c48a1f9..57510050 100644 --- a/FilterExtension/CategoryInstance.cs +++ b/FilterExtension/CategoryInstance.cs @@ -22,7 +22,12 @@ public class CategoryInstance public CategoryInstance(CategoryNode protoC, Dictionary allSubCats) { - Name = Localization.Format(protoC.CategoryName); + Name = Localizer.Format(protoC.CategoryName); + if (string.IsNullOrEmpty(Name)) + { + Logger.Log("Category name is blank", Logger.LogLevel.Warn); + return; + } Icon = protoC.IconName; Colour = protoC.Colour; Type = protoC.Type; @@ -47,27 +52,21 @@ public CategoryInstance(CategoryNode protoC, Dictionary } public void Initialise() - { - if (string.IsNullOrEmpty(Name)) - { - LoadAndProcess.Log("Category name is null or empty", LoadAndProcess.LogLevel.Warn); - return; - } - + { if (Type == CategoryNode.CategoryType.NEW) { RUI.Icons.Selectable.Icon icon = LoadAndProcess.GetIcon(Icon); - PartCategorizer.Category category = PartCategorizer.AddCustomFilter(Name, icon, Colour); + PartCategorizer.Category category = PartCategorizer.AddCustomFilter(Name, Localizer.Format(Name), icon, Colour); category.displayType = EditorPartList.State.PartsList; category.exclusionFilter = PartCategorizer.Instance.filterGenericNothing; InstanceSubcategories(category); } else { - if (!PartCategorizer.Instance.filters.TryGetValue(c => string.Equals(Localization.Format(c.button.categoryName), Name, StringComparison.OrdinalIgnoreCase), + if (!PartCategorizer.Instance.filters.TryGetValue(c => string.Equals(Localizer.Format(c.button.categoryName), Name, StringComparison.OrdinalIgnoreCase), out PartCategorizer.Category category)) { - LoadAndProcess.Log("No category of this name was found to manipulate: " + Name, LoadAndProcess.LogLevel.Warn); + Logger.Log($"No category of this name was found to manipulate: {Name}", Logger.LogLevel.Warn); return; } else if (Behaviour == CategoryNode.CategoryBehaviour.Replace) @@ -97,12 +96,12 @@ void InstanceSubcategories(PartCategorizer.Category category) } catch (Exception ex) { - LoadAndProcess.Log($"{sc} failed to initialise" + Logger.Log($"{sc} failed to initialise" + $"\r\nCategory: {Name}" + $"\r\nSubcategory Valid: {sc.Valid}" + $"\r\n{ex.Message}" + $"\r\n{ex.StackTrace}", - LoadAndProcess.LogLevel.Error); + Logger.LogLevel.Error); } } } diff --git a/FilterExtension/ConfigNodes/CategoryNode.cs b/FilterExtension/ConfigNodes/CategoryNode.cs index 6f65e1ee..5f65a29d 100644 --- a/FilterExtension/ConfigNodes/CategoryNode.cs +++ b/FilterExtension/ConfigNodes/CategoryNode.cs @@ -29,12 +29,12 @@ public enum CategoryBehaviour public CategoryType Type { get; } = CategoryType.NEW; public CategoryBehaviour Behaviour { get; } = CategoryBehaviour.Add; public bool All { get; } = false; // has an all parts subCategory - public List SubCategories { get; } = new List(); // array of subcategories + public List SubCategories { get; } // array of subcategories public List Templates { get; } // Checks to add to every Filter in a category with the template tag public CategoryNode(ConfigNode node, LoadAndProcess data) { - CategoryName = node.GetValue("name"); + CategoryName = node.GetValue("name").Trim(); IconName = node.GetValue("icon"); Colour = GUIUtils.ConvertToColor(node.GetValue("colour")); @@ -51,7 +51,8 @@ public CategoryNode(ConfigNode node, LoadAndProcess data) { All = tmpBool; } - LoadSubcategoryItems(node.GetNodes("SUBCATEGORIES"), SubCategories); + SubCategories = LoadSubcategoryItems(node.GetNodes("SUBCATEGORIES")); + string tmpStr = string.Empty; if (node.TryGetValue("type", ref tmpStr)) { @@ -85,16 +86,18 @@ public bool HasSubCategories() return (SubCategories?.Count ?? 0) > 0; } - public static void LoadSubcategoryItems(ConfigNode[] nodes, List loadTo) + public static List LoadSubcategoryItems(ConfigNode[] nodes) { + var loadTo = new List(); if (nodes == null || nodes.Length == 0) { - return; + return loadTo; } + var stringList = new List(); foreach (ConfigNode node in nodes) { - stringList.AddUniqueRange(node.GetValues()); + stringList.AddRange(node.GetValues()); } SubCategoryItem[] subs = new SubCategoryItem[1000]; var unorderedSubCats = new List(); @@ -103,14 +106,14 @@ public static void LoadSubcategoryItems(ConfigNode[] nodes, List s == null); + return loadTo; } public override bool Equals(object obj) diff --git a/FilterExtension/ConfigNodes/CheckNodes/CheckNodeFactory.cs b/FilterExtension/ConfigNodes/CheckNodes/CheckNodeFactory.cs index f13b676c..43003df2 100644 --- a/FilterExtension/ConfigNodes/CheckNodes/CheckNodeFactory.cs +++ b/FilterExtension/ConfigNodes/CheckNodes/CheckNodeFactory.cs @@ -54,7 +54,7 @@ public static CheckNode MakeCheck(ConfigNode node) case CheckCost.ID: return new CheckCost(node); default: - LoadAndProcess.Log($"unknown check type {checkID}", LoadAndProcess.LogLevel.Error); + Logger.Log($"unknown check type {checkID}", Logger.LogLevel.Error); return null; } } diff --git a/FilterExtension/ConfigNodes/SubCategoryItem.cs b/FilterExtension/ConfigNodes/SubCategoryItem.cs index 14740236..1b3d1a5d 100644 --- a/FilterExtension/ConfigNodes/SubCategoryItem.cs +++ b/FilterExtension/ConfigNodes/SubCategoryItem.cs @@ -9,7 +9,7 @@ public class SubCategoryItem : IEquatable public SubCategoryItem(string name, bool useTemplate = true) { - SubcategoryName = name; + SubcategoryName = name.Trim(); ApplyTemplate = useTemplate; } diff --git a/FilterExtension/ConfigNodes/SubcategoryNode.cs b/FilterExtension/ConfigNodes/SubcategoryNode.cs index 91ff4138..fd1c0034 100644 --- a/FilterExtension/ConfigNodes/SubcategoryNode.cs +++ b/FilterExtension/ConfigNodes/SubcategoryNode.cs @@ -3,6 +3,7 @@ namespace FilterExtensions.ConfigNodes { + using System.Diagnostics; using FilterExtensions.ConfigNodes.CheckNodes; public class SubcategoryNode : IEquatable @@ -42,6 +43,7 @@ public SubcategoryNode(ConfigNode node) public SubcategoryNode(SubcategoryNode cloneFrom, CategoryNode category) { + Debug.Assert(cloneFrom != null, "subcategory cloned from null"); SubCategoryTitle = cloneFrom.SubCategoryTitle; IconName = cloneFrom.IconName; Filters = cloneFrom.Filters; @@ -115,7 +117,6 @@ public bool CheckPartFilters(AvailablePart part, int depth = 0) return false; } } - return CheckFilters(part, depth); } @@ -129,7 +130,7 @@ public bool CheckPartFilters(AvailablePart part, int depth = 0) /// private bool CheckFilters(AvailablePart ap, int depth = 0) { - if (Filters.Count == 0 && (Category == null || Category.Templates.Count == 0)) + if (Filters == null || Filters.Count == 0) { return true; } @@ -149,11 +150,11 @@ private bool CheckFilters(AvailablePart ap, int depth = 0) private bool CheckCategoryFilter(AvailablePart ap, int depth = 0) { - if (Category == null) + if (Category == null || Category.Templates.Count == 0) { return true; } - foreach (FilterNode f in Filters) + foreach (FilterNode f in Category.Templates) { if (f.FilterResult(ap, depth)) { diff --git a/FilterExtension/ConfigNodes/SubcategoryNodeModifier.cs b/FilterExtension/ConfigNodes/SubcategoryNodeModifier.cs index 0901aa6c..30e325dc 100644 --- a/FilterExtension/ConfigNodes/SubcategoryNodeModifier.cs +++ b/FilterExtension/ConfigNodes/SubcategoryNodeModifier.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; @@ -10,13 +11,14 @@ public static class SubcategoryNodeModifier static readonly string[] splitter = new string[] { "=>" }; public static void MakeRenamers(ConfigNode node, Dictionary renames) { + Debug.Assert(renames != null, $"{nameof(renames)} dictionary is assumed to never be null"); foreach (string s in node.GetValues("name")) { string[] split = s.Split(splitter, StringSplitOptions.RemoveEmptyEntries) .Select(str => str.Trim()).ToArray(); if (split.Length != 2) { - LoadAndProcess.Log($"bad length in rename string {s}", LoadAndProcess.LogLevel.Error); + Logger.Log($"bad length in rename string {s}", Logger.LogLevel.Error); continue; } if (!renames.ContainsKey(split[0])) @@ -28,12 +30,13 @@ public static void MakeRenamers(ConfigNode node, Dictionary rena public static void MakeIconChangers(ConfigNode node, Dictionary icons) { + Debug.Assert(icons != null, $"{nameof(icons)} dictionary is assumed to never be null"); foreach (string s in node.GetValues("icon")) { string[] split = s.Split(splitter, StringSplitOptions.RemoveEmptyEntries).Select(str => str.Trim()).ToArray(); if (split.Length != 2) { - LoadAndProcess.Log($"bad length in set icon string {s}", LoadAndProcess.LogLevel.Error); + Logger.Log($"bad length in set icon string {s}", Logger.LogLevel.Error); continue; } if (icons.ContainsKey(split[0])) @@ -45,6 +48,7 @@ public static void MakeIconChangers(ConfigNode node, Dictionary public static void MakeDeleters(ConfigNode node, HashSet deleters) { + Debug.Assert(deleters != null, $"{nameof(deleters)} hashset is assumed to never be null"); foreach (string s in node.GetValues("remove")) { string str = s.Trim(); diff --git a/FilterExtension/Editor.cs b/FilterExtension/Editor.cs index 55a6291d..00355dbd 100644 --- a/FilterExtension/Editor.cs +++ b/FilterExtension/Editor.cs @@ -32,12 +32,7 @@ public void StartEditor() public IEnumerator EditorInit() { Settings settings = HighLogic.CurrentGame.Parameters.CustomParams(); - if (settings.debug) - { - LoadAndProcess.Log("Starting on Stock Filters", LoadAndProcess.LogLevel.Log); - LoadAndProcess.Log("Starting on general categories", LoadAndProcess.LogLevel.Log); - } - + Logger.Log("Starting on general categories", Logger.LogLevel.Debug); foreach (CategoryInstance c in LoadAndProcess.Categories) // all non mod specific FE categories { if ((c.Type == CategoryNode.CategoryType.NEW || c.Type == CategoryNode.CategoryType.STOCK) @@ -48,11 +43,7 @@ public IEnumerator EditorInit() } yield return null; - if (settings.debug) - { - LoadAndProcess.Log("Starting on late categories", LoadAndProcess.LogLevel.Log); - } - + Logger.Log("Starting on late categories", Logger.LogLevel.Debug); // this is to be used for altering subcategories in a category added by another mod foreach (CategoryInstance c in LoadAndProcess.Categories) { @@ -62,12 +53,9 @@ public IEnumerator EditorInit() } } - // Remove any category with no subCategories (causes major breakages if selected). yield return null; - if (settings.debug) - { - LoadAndProcess.Log("Starting on removing categories", LoadAndProcess.LogLevel.Log); - } + Logger.Log("Starting on removing categories", Logger.LogLevel.Debug); + // Remove any category with no subCategories (causes major breakages if selected). for (int i = PartCategorizer.Instance.filters.Count - 1; i >= 0; --i) { if (PartCategorizer.Instance.filters[i].subcategories.Count == 0) @@ -83,10 +71,7 @@ public IEnumerator EditorInit() } yield return null; - if (HighLogic.CurrentGame.Parameters.CustomParams().debug) - { - LoadAndProcess.Log("Refreshing parts list", LoadAndProcess.LogLevel.Log); - } + Logger.Log("Refreshing parts list", Logger.LogLevel.Debug); SetSelectedCategory(); } @@ -98,10 +83,9 @@ public static void SetSelectedCategory() { try { - PartCategorizer.Category cat; if (HighLogic.CurrentGame.Parameters.CustomParams().categoryDefault != string.Empty) { - cat = PartCategorizer.Instance.filters.FirstOrDefault(f => f.button.categoryName == HighLogic.CurrentGame.Parameters.CustomParams().categoryDefault); + PartCategorizer.Category cat = PartCategorizer.Instance.filters.FirstOrDefault(f => f.button.categoryName == HighLogic.CurrentGame.Parameters.CustomParams().categoryDefault); if (cat != null) { cat.button.activeButton.SetState(KSP.UI.UIRadioButton.State.True, KSP.UI.UIRadioButton.CallType.APPLICATION, null, true); @@ -111,28 +95,23 @@ public static void SetSelectedCategory() if (HighLogic.CurrentGame.Parameters.CustomParams().subCategoryDefault != string.Empty) { // set the subcategory button - cat = PartCategorizer.Instance.filters.FirstOrDefault(f => f.button.activeButton.Value); - if (cat != null) - { - cat = cat.subcategories.FirstOrDefault(sC => sC.button.categoryName == HighLogic.CurrentGame.Parameters.CustomParams().subCategoryDefault); - if (cat != null) - { - cat.button.activeButton.SetState(KSP.UI.UIRadioButton.State.True, KSP.UI.UIRadioButton.CallType.APPLICATION, null, true); - } - } + KSP.UI.UIRadioButton but = PartCategorizer.Instance.filters.FirstOrDefault(f => f.button.activeButton.Value)?.subcategories.FirstOrDefault(sC => { + return sC.button.categoryName == HighLogic.CurrentGame.Parameters.CustomParams().subCategoryDefault; + })?.button.activeButton; + but.SetState(KSP.UI.UIRadioButton.State.True, KSP.UI.UIRadioButton.CallType.APPLICATION, null, true); } } catch (Exception e) { - LoadAndProcess.Log($"Category refresh failed\r\n{e.InnerException}\r\n{e.StackTrace}", LoadAndProcess.LogLevel.Error); + Logger.Log($"Category refresh failed\r\n{e.InnerException}\r\n{e.StackTrace}", Logger.LogLevel.Error); } } private bool CheckPartVisible(AvailablePart part, PartCategorizer.Category category) { - for (int i = 0; i < category.subcategories.Count; ++i) + foreach (PartCategorizer.Category subcat in category.subcategories) { - if (category.subcategories[i].exclusionFilter.FilterCriteria.Invoke(part)) + if (subcat.exclusionFilter.FilterCriteria(part)) { return true; } diff --git a/FilterExtension/FilterExtensions.csproj b/FilterExtension/FilterExtensions.csproj index cd349f12..798cebcf 100644 --- a/FilterExtension/FilterExtensions.csproj +++ b/FilterExtension/FilterExtensions.csproj @@ -14,11 +14,11 @@ - true - pdbonly + false + none false ..\GameData\000_FilterExtensions\ - DEBUG;TRACE + TRACE;DEBUG prompt 4 false @@ -27,7 +27,8 @@ none true ..\GameData\000_FilterExtensions\ - TRACE + + prompt 4 false @@ -70,6 +71,7 @@ + diff --git a/FilterExtension/LoadAndProcess.cs b/FilterExtension/LoadAndProcess.cs index 66a06c9e..517dfd0c 100644 --- a/FilterExtension/LoadAndProcess.cs +++ b/FilterExtension/LoadAndProcess.cs @@ -14,8 +14,6 @@ namespace FilterExtensions [KSPAddon(KSPAddon.Startup.MainMenu, true)] public class LoadAndProcess : MonoBehaviour { - public static readonly Version version = new Version(2, 9, 0, 0); - // storing categories loaded at Main Menu for creation when entering SPH/VAB public List CategoryNodes = new List(); @@ -40,16 +38,16 @@ public class LoadAndProcess : MonoBehaviour public List resources = new List(); // url for each part by internal name - public static Dictionary partPathDict = new Dictionary(); + public static Dictionary partPathDict = new Dictionary(); // set null after processing completed // Dictionary of icons created on entering the main menu - public static Dictionary IconDict = new Dictionary(); + public static Dictionary IconDict = new Dictionary(); // do not set null ever // storing all subCategory definitions for categories to reference during compilation to instances - public static Dictionary subCategoriesDict = new Dictionary(); + public static Dictionary subCategoriesDict = new Dictionary(); // set null after processing completed /// /// provides a typed check for stock modules which then allows for inheritance checking to work using isAssignableFrom /// - private static Dictionary loaded_modules; + private static Dictionary loaded_modules; // set null after processing completed public static Dictionary Loaded_Modules { @@ -81,9 +79,7 @@ public static Dictionary Loaded_Modules private IEnumerator Start() { - Log(string.Empty, LogLevel.Warn); - - yield return null; + Logger.Log(string.Empty, Logger.LogLevel.Warn); yield return null; yield return null; @@ -137,7 +133,7 @@ private void GetPartData() } else if (string.Equals(p.TechRequired, "Unresearchable", StringComparison.OrdinalIgnoreCase)) { - Log($"part {p.name} is noted as unreasearchable and will not be visible", LogLevel.Warn); + Logger.Log($"part {p.name} is noted as unreasearchable and will not be visible", Logger.LogLevel.Debug); Editor.blackListedParts.Add(p.name); continue; } @@ -158,7 +154,7 @@ private void GetPartData() } else { - Log(p.name + " duplicated part key in part path dictionary", LogLevel.Warn); + Logger.Log(p.name + " duplicated part key in part path dictionary", Logger.LogLevel.Debug); } } if (PartType.IsEngine(p)) @@ -187,7 +183,7 @@ private void ProcessFilterDefinitions() var C = new CategoryNode(node, this); if (C.SubCategories == null) { - Log($"no subcategories present in {C.CategoryName}", LogLevel.Error); + Logger.Log($"no subcategories present in {C.CategoryName}", Logger.LogLevel.Error); continue; } CategoryNodes.AddUnique(C); @@ -198,12 +194,12 @@ private void ProcessFilterDefinitions() var sC = new SubcategoryNode(node); if (!sC.HasFilters || string.IsNullOrEmpty(sC.SubCategoryTitle)) { - Log($"subcategory format error: {sC.SubCategoryTitle}", LogLevel.Error); + Logger.Log($"subcategory format error: {sC.SubCategoryTitle}", Logger.LogLevel.Error); continue; } else if (subCategoriesDict.ContainsKey(sC.SubCategoryTitle)) // if something does have the same title { - Log($"subcategory name duplicated: {sC.SubCategoryTitle}", LogLevel.Error); + Logger.Log($"subcategory name duplicated: {sC.SubCategoryTitle}", Logger.LogLevel.Error); continue; } else // if nothing else has the same title @@ -221,7 +217,7 @@ private void ProcessFilterDefinitions() string name = System.Text.RegularExpressions.Regex.Replace(s, @"\B([A-Z])", " $1"); if (subCategoriesDict.ContainsKey(name)) { - Log($"resource name already exists, abandoning generation for {name}", LogLevel.Warn); + Logger.Log($"resource name already exists, abandoning generation for {name}", Logger.LogLevel.Debug); continue; } else if (!string.IsNullOrEmpty(name)) @@ -348,6 +344,7 @@ private void ProcessFilterByManufacturer(List modNames) filterByManufacturer.AddValue("value", "replace"); filterByManufacturer.AddNode(manufacturerSubs); FilterByManufacturer = new CategoryNode(filterByManufacturer, this); + CategoryNodes.Add(FilterByManufacturer); } /// @@ -453,7 +450,7 @@ public void CompileCategories() } catch (Exception ex) { - Log(ex.Message, LogLevel.Warn); + Logger.Log(ex.Message, Logger.LogLevel.Warn); } } } @@ -531,37 +528,5 @@ public void SetNameAndIcon(ref string name, ref string icon) icon = tmp; } } - - public enum LogLevel - { - Log, - Warn, - Error - } - - /// - /// Debug.Log with FE id/version inserted - /// - /// - internal static void Log(object o, LogLevel level = LogLevel.Log) - { - Log(o.ToString(), level); - } - - internal static void Log(string format, LogLevel level = LogLevel.Log, params object[] o) - { - if (level == LogLevel.Log) - { - Debug.LogFormat($"[Filter Extensions {version}]: {string.Format(format, o)}"); - } - else if (level == LogLevel.Warn) - { - Debug.LogWarningFormat($"[Filter Extensions {version}]: {string.Format(format, o)}"); - } - else - { - Debug.LogErrorFormat($"[Filter Extensions {version}]: {string.Format(format, o)}"); - } - } } } \ No newline at end of file diff --git a/FilterExtension/Logger.cs b/FilterExtension/Logger.cs new file mode 100644 index 00000000..e12fd912 --- /dev/null +++ b/FilterExtension/Logger.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using KSP; +using UnityEngine; + +namespace FilterExtensions +{ + internal static class Logger + { + public static readonly Version version = new Version(3, 0, 0, 0); + + internal enum LogLevel + { + Debug, + Warn, + Error + } + + /// + /// Debug messages only compiled in debug build. Also much easier to search for once debugging/development complete... + /// + /// + /// + [System.Diagnostics.Conditional("DEBUG")] + internal static void Dev(object o, LogLevel level = LogLevel.Debug) + { + Log(o, level); + } + + [System.Diagnostics.Conditional("DEBUG")] + internal static void Dev(string format, LogLevel level = LogLevel.Debug, params object[] o) + { + Log(format, level, o); + } + + /// + /// Debug.Log with FE id/version inserted + /// + /// + internal static void Log(object o, LogLevel level = LogLevel.Debug) + { + Log(o.ToString(), level); + } + + internal static void Log(string format, LogLevel level = LogLevel.Debug, params object[] o) + { + if (level == LogLevel.Debug) + { + Debug.LogFormat($"[Filter Extensions {version}]: {string.Format(format, o)}"); + } + else if (level == LogLevel.Warn) + { + Debug.LogWarningFormat($"[Filter Extensions {version}]: {string.Format(format, o)}"); + } + else + { + Debug.LogErrorFormat($"[Filter Extensions {version}]: {string.Format(format, o)}"); + } + } + } +} diff --git a/FilterExtension/Settings.cs b/FilterExtension/Settings.cs index c6e174c4..fc33e79c 100644 --- a/FilterExtension/Settings.cs +++ b/FilterExtension/Settings.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Reflection; using System; +using KSP.Localization; namespace FilterExtensions { @@ -13,10 +14,6 @@ internal class Settings : GameParameters.CustomParameterNode , toolTip = "Hide any parts that have been researched but not yet purchased")] public bool hideUnpurchased = true; - [GameParameters.CustomParameterUI("Enable debug logging" - , toolTip = "If you encounter a bug, please attempt to reproduce with this setting enabled")] - public bool debug = false; - [GameParameters.CustomParameterUI("Default to advanced display" , toolTip = "Enable to display both levels of the part categories on entering the editor")] public bool setAdvanced = true; @@ -77,9 +74,8 @@ public override bool HasPresets public override string DisplaySection { - get - { - return string.Empty; + get { + return Localizer.Format(Section); } } @@ -96,7 +92,6 @@ public override bool Interactible(MemberInfo member, GameParameters parameters) public override void SetDifficultyPreset(GameParameters.Preset preset) { hideUnpurchased = true; - debug = false; setAdvanced = true; replaceFbM = true; } @@ -105,7 +100,7 @@ public override IList ValidValues(MemberInfo member) { if (member.Name == "categoryDefault") { - List categories = new List() { string.Empty }; + var categories = new List() { string.Empty }; foreach (CategoryInstance C in LoadAndProcess.Categories) { categories.Add(C.Name); @@ -114,7 +109,7 @@ public override IList ValidValues(MemberInfo member) } if (member.Name == "subCategoryDefault") { - List subcategories = new List() { string.Empty }; + var subcategories = new List() { string.Empty }; if (LoadAndProcess.Categories.TryGetValue(C => C.Name == categoryDefault, out CategoryInstance cat)) { foreach (SubCategoryInstance sc in cat.Subcategories) diff --git a/FilterExtension/SubCategoryInstance.cs b/FilterExtension/SubCategoryInstance.cs index e23c6b2d..a3412896 100644 --- a/FilterExtension/SubCategoryInstance.cs +++ b/FilterExtension/SubCategoryInstance.cs @@ -26,7 +26,7 @@ public class SubCategoryInstance /// public SubCategoryInstance(ConfigNodes.SubcategoryNode protoNode, List allParts) { - Name = Localization.Format(protoNode.SubCategoryTitle); + Name = Localizer.Format(protoNode.SubCategoryTitle); Icon = protoNode.IconName; UnpurchasedVisible = protoNode.UnPurchasedOverride; foreach (AvailablePart p in allParts) @@ -49,7 +49,7 @@ public void Initialise(PartCategorizer.Category cat) return; } RUI.Icons.Selectable.Icon icon = LoadAndProcess.GetIcon(Icon); - PartCategorizer.AddCustomSubcategoryFilter(cat, Name, icon, p => TestPart(p)); + PartCategorizer.AddCustomSubcategoryFilter(cat, Name, Localizer.Format(Name), icon, p => TestPart(p)); } /// diff --git a/FilterExtension/Utility/Extensions.cs b/FilterExtension/Utility/Extensions.cs index 00028f29..b03fd116 100644 --- a/FilterExtension/Utility/Extensions.cs +++ b/FilterExtension/Utility/Extensions.cs @@ -1,29 +1,40 @@ using System; using System.Collections.Generic; +using System.Diagnostics; namespace FilterExtensions.Utility { - public static class Extensions + public struct Span { - public struct Span + private IList spanningCollection; + private readonly int offset; + public int Length { get; } + + public Span(IList collection, int offset, int length) { - private IList spanningCollection; - private int offset; - public int Length { get; } + Debug.Assert(offset + length <= collection.Count, "Span can't cover a larger range than the collection covers"); + spanningCollection = collection; + this.offset = offset; + Length = length; + } - public Span(IList collection, int offset, int length) + public T this[int index] + { + get { - spanningCollection = collection; - this.offset = offset; - Length = length; + Debug.Assert(index < Length, "index out of range"); + return spanningCollection[index + offset]; } - - public T this[int index] + set { - get { return spanningCollection[index + offset]; } - set { spanningCollection[index + offset] = value; } + Debug.Assert(index < Length, "index out of range"); + spanningCollection[index + offset] = value; } } + } + + public static class Extensions + { /// /// adds the (key, value) set to the Dictionary if the key is unique @@ -53,12 +64,11 @@ public static bool TryAdd(this IDictionary addTo, T key, U value) /// public static bool TryGetValue(this IList list, Func match, out T value) where T : class { - for (int i = 0; i < list.Count; i++) + foreach (T t in list) { - T obj = list[i]; - if (match(obj)) + if (match(t)) { - value = obj; + value = t; return true; } } diff --git a/FilterExtension/Utility/PartType.cs b/FilterExtension/Utility/PartType.cs index 9ac835c0..153ea819 100644 --- a/FilterExtension/Utility/PartType.cs +++ b/FilterExtension/Utility/PartType.cs @@ -15,7 +15,7 @@ public static bool CheckSubcategory(AvailablePart part, string[] value, int dept { if (depth > 10) { - LoadAndProcess.Log("subcategory check depth limit (10) exceeded. Check terminated on suspicion of circular subcategory checking!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", LoadAndProcess.LogLevel.Error); + Logger.Log("subcategory check depth limit (10) exceeded. Check terminated on suspicion of circular subcategory checking!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", Logger.LogLevel.Error); return false; } foreach (string s in value) @@ -529,7 +529,7 @@ public static bool CheckPartSize(AvailablePart part, string[] values, bool conta { if (values.Length > 1) { - LoadAndProcess.Log("Size comparisons against multiple values when not using Equals only use the first value. Value list is: {0}", LoadAndProcess.LogLevel.Warn, string.Join(", ", values)); + Logger.Log($"Size comparisons against multiple values when not using Equals only use the first value. Value list is: {string.Join(", ", values)}", Logger.LogLevel.Warn); } if (int.TryParse(values[0], out int i)) @@ -567,7 +567,7 @@ public static bool CheckCrewCapacity(AvailablePart part, string[] value, ConfigN { if (value.Length > 1) { - LoadAndProcess.Log("Crew comparisons against multiple values when not using Equals only use the first value. Value list is: {0}", LoadAndProcess.LogLevel.Warn, string.Join(", ", value)); + Logger.Log($"Crew comparisons against multiple values when not using Equals only use the first value. Value list is: {string.Join(", ", value)}", Logger.LogLevel.Warn); } if (double.TryParse(value[0], out double d)) @@ -603,7 +603,7 @@ public static bool CheckMass(AvailablePart part, string[] value, ConfigNodes.Che { if (value.Length > 1) { - LoadAndProcess.Log("Mass comparisons against multiple values when not using Equals only use the first value. Value list is: {0}", LoadAndProcess.LogLevel.Warn, string.Join(", ", value)); + Logger.Log($"Mass comparisons against multiple values when not using Equals only use the first value. Value list is: {string.Join(", ", value)}", Logger.LogLevel.Warn); } if (double.TryParse(value[0], out double d)) @@ -634,7 +634,7 @@ public static bool CheckCost(AvailablePart part, string[] value, ConfigNodes.Che { if (value.Length > 1) { - LoadAndProcess.Log("Cost comparisons against multiple values when not using Equals only use the first value. Value list is: {0}", LoadAndProcess.LogLevel.Warn, string.Join(", ", value)); + Logger.Log($"Cost comparisons against multiple values when not using Equals only use the first value. Value list is: {string.Join(", ", value)}", Logger.LogLevel.Warn); } if (double.TryParse(value[0], out double d)) @@ -670,7 +670,7 @@ public static bool CheckCrashTolerance(AvailablePart part, string[] value, Confi { if (value.Length > 1) { - LoadAndProcess.Log("Crash tolerance comparisons against multiple values when not using Equals only use the first value. Value list is: {0}", LoadAndProcess.LogLevel.Warn, string.Join(", ", value)); + Logger.Log($"Crash tolerance comparisons against multiple values when not using Equals only use the first value. Value list is: {string.Join(", ", value)}", Logger.LogLevel.Warn); } if (float.TryParse(value[0], out float f)) @@ -706,7 +706,7 @@ public static bool CheckTemperature(AvailablePart part, string[] value, ConfigNo { if (value.Length > 1) { - LoadAndProcess.Log("Temperature comparisons against multiple values when not using Equals only use the first value. Value list is: {0}", LoadAndProcess.LogLevel.Warn, string.Join(", ", value)); + Logger.Log($"Temperature comparisons against multiple values when not using Equals only use the first value. Value list is: {string.Join(", ", value)}", Logger.LogLevel.Warn); } if (double.TryParse(value[0], out double d)) { @@ -903,7 +903,7 @@ public static bool NodeCheck(AvailablePart part, string[] parameters, ConfigNode } foreach (PartModule pm in part.partPrefab.Modules) { - if (baseType.IsAssignableFrom(LoadAndProcess.Loaded_Modules[pm.moduleName])) + if (!string.IsNullOrEmpty(pm.moduleName) && baseType.IsAssignableFrom(LoadAndProcess.Loaded_Modules[pm.moduleName])) { BaseField f = pm.Fields[parameters[1]]; if (f == null) diff --git a/GameData/000_FilterExtensions/FilterExtensions.dll b/GameData/000_FilterExtensions/FilterExtensions.dll index 3a855173e4aa5cc79afbc3bc78987ee9464dd571..306e57467ceaaa49c43da82a503a105f505b1860 100644 GIT binary patch literal 65024 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